2009-06-21 32 views
9

thể trùng lặp:
Allen Holub wrote “You should never use get/set functions”, is he correct?Getters and Setters: Mã mùi, ác cần thiết, hoặc không thể sống mà không có chúng

Có tốt, không, một rất lý do chính đáng, đi qua tất cả các rắc rối của việc sử dụng getters và setters cho các ngôn ngữ hướng đối tượng? Có gì sai khi chỉ sử dụng tham chiếu trực tiếp đến thuộc tính hoặc phương pháp? Có một số loại "che đậy ngữ nghĩa" mà mọi người không muốn nói về công ty lịch sự không? Tôi đã quá mệt mỏi và ngủ thiếp đi khi ai đó bước ra và nói "Bạn nên viết số tiền đáng giá để lấy Getters và Setters"?


Follow-up sau một năm:

Nó có vẻ là một lỗi thường xảy ra với Java, ít như vậy với Python. I'm beginning to wonder if this is more of a cultural phenomena (related to the limitations of the language) rather than "sage advice". Vì tôi không lập trình bằng Java (hiện tại theo lựa chọn), tôi không thể thực hiện đánh giá đó.

Hiện tại (hiện tại là của bài viết này 2010-03-22) -1 điểm số câu hỏi là hoàn thành cho-lulz như xa như tôi quan tâm. Điều thú vị là có những câu hỏi cụ thể được giảm xuống, không phải vì chúng là "câu hỏi xấu", mà đúng hơn là bởi vì chúng truy cập vào số dây thần kinh sống của ai đó.

Vì vậy, hãy truy cập vào hạt của vấn đề. Tôi lặp lại bản thân mình:

What's wrong with just using a direct reference to a property or method?

Và đây là hệ quả bất thành văn:

Are we so undisciplined as programmers that we can't keep our hands off of things that are clearly marked "no touchy"?

+2

Tôi không cảm thấy đây là bản sao chính xác. Câu hỏi khác hỏi "Bạn có nên * không bao giờ * sử dụng getters/setters không?" trong khi câu hỏi này hỏi "Bạn có nên * sử dụng getter/setters không?" Có một nhân vật hoàn toàn khác biệt ở đó! – Talljoe

+3

D'oh, nếu đây là một bản sao chính xác, thì tại sao địa ngục không xuất hiện trong các đề xuất khi tôi đăng lần đầu tiên? –

+0

@ Talljoe: Đó là một sự khác biệt tinh tế đã thoát khỏi tôi. Mắt sắc bén! Tôi sẽ đọc kỹ tất cả các câu hỏi khác trong Thanh bên có liên quan để trả lời câu hỏi này để chọn phương án thay thế phù hợp hơn. Cảm ơn. :) –

Trả lời

3

Đây là Allen Holub (người xuất sắc) on the matter. Ông đi vào chi tiết hơn về chủ đề này trong Holub on Patterns. Một số thứ đòi hỏi những người định cư và người định cư công cộng như serialization và các mẫu như Data Transfer Object pattern. Nói chung, tôi nghĩ rằng điều ác cần thiết kể từ khi ứng dụng của bạn trở nên phức tạp khi bạn không sử dụng chúng.

2

Protection. Một số thuộc tính/phương thức không nên được gọi từ mà không có lớp ... bao giờ hết. Tôi chắc rằng bạn duy trì thẩm quyền duy nhất để nói cho ai biết số an sinh xã hội của bạn, đúng không? Họ phải hỏi bạn (getter)? Chắc chắn bạn sẽ không khuyên chúng tôi cho phép mọi người truy cập trực tiếp vào dữ liệu/phương thức riêng tư trong cuộc sống của chính chúng ta ... tại sao lại đối xử với các ứng dụng của bạn khác? :)

+0

Vì vậy ... nếu tôi hiểu được ý chính của ... getters và setters cho các ngôn ngữ OO mà không có một phương pháp để che giấu không gian tên của họ? –

+0

Họ xây dựng một bức tường gạch xung quanh lớp học của bạn, có quyền cụ thể cho các mục nhất định ở bên trong. Một số lớp học có các đặc tính không nên được xử lý bởi bất cứ ai, bao giờ hết. Những điều này sẽ được định nghĩa là riêng tư hoặc được bảo vệ và vì vậy không ai có thể thao túng các giá trị của chúng từ bên ngoài lớp học. Chỉ bằng cách cung cấp một getter, họ thực sự có thể cho biết giá trị là gì, và chỉ bằng cách cung cấp một setter họ có thể thực sự thao tác các giá trị. Bạn là Vua dữ liệu của bạn - và những người truy cập duy nhất phải vào bên trong, là quyền truy cập bạn cấp cho họ. – Sampson

+1

Thú vị, nhiều hơn như vậy cho tâm lý của lời giải thích đó hơn cho lời giải thích chính nó. Tôi cảm thấy một câu hỏi khác đang diễn ra ... nhưng đánh giá về tính năng tìm kiếm-trùng lặp-câu hỏi hoạt động tốt như thế nào (chỉ cần đóng trong chưa đầy 30 phút), tôi sẽ phải cẩn thận cụm từ. Trong mọi trường hợp, cảm ơn cho việc làm rõ! –

1

Một cách mà tôi thấy hữu ích là có thể đặt điểm ngắt trên tập hợp (nhiều hơn mức nhận được). Điều đó có thể có nghĩa là "Tôi viết mã sai," nhưng ít nhất tôi có thể tìm ra chính xác khi nào nó thay đổi.

+2

Thực ra, tôi có thể nói với bạn rằng đó là một chức năng của trình gỡ rối của bạn. Trình gỡ rối (hoặc ngôn ngữ của bạn, hoặc động cơ thúc đẩy ngôn ngữ nếu nó diễn giải/bán biên dịch/p-code) không hỗ trợ phá vỡ trạng thái thay đổi của một thuộc tính (biến), và do đó bạn buộc phải mô phỏng hành vi này . Tôi đã sử dụng các ngôn ngữ khác nhau và không hỗ trợ tính năng này, và trong khi nó rất hay để có, nó không phải là một nút show-stopper. Tuy nhiên, +1 cho (a) ít nhất là nhận ra đó là một hạn chế (b) tìm một cách xung quanh nó (c) chỉ ra một sử dụng thực tế cho nó, ngay cả khi nó không phải là một câu trả lời trực tiếp. –

3

Getters and Setters ẩn thông tin cụ thể về lớp học của bạn từ người dùng trong lớp học của bạn.

Trong nhiều trường hợp, chúng không được sử dụng đầy đủ, nhưng bạn nên sử dụng chúng. Truy cập trực tiếp vào dữ liệu đối tượng của bạn làm giảm sự đóng gói.

Nếu bạn không sử dụng getters và setters, khi bạn thay đổi ý định về thành viên dữ liệu, bạn sẽ phá vỡ giao diện lớp học và phải thay đổi phần còn lại của mã để phù hợp với thay đổi. Trong một số trường hợp, lớp học của bạn đại diện cho một phần của API công khai, điều này thậm chí không thể thực hiện được.Nếu bạn bọc các thuộc tính của bạn trong các getters và setters, bạn có thể thực hiện các thay đổi đó và ẩn chúng khỏi việc tiêu thụ mã bằng cách sửa đổi các phương thức getter và setter.

1

Getters and Setters là một khía cạnh của việc triển khai Open/Close principle. Nếu bạn đóng gói tất cả các chức năng của bạn sau các thuộc tính thích hợp thì mã sử dụng các thuộc tính của bạn sẽ không bị hỏng. Nó cũng làm cho nó có thể thay thế hoàn toàn đối tượng đó bằng một cái gì đó khác trong tương lai - đặc biệt nếu bạn mã hóa một giao diện thay vì một lớp.

Chúng quá quan trọng đến nỗi C# đã vượt qua khó khăn để làm cho các getters và setters cơ bản dễ viết.

Để hiểu thêm lý do tại sao một số khía cạnh của OOD là quan trọng, hãy đọc cuốn sách Emergent Design bởi Scott Bain.

+2

Tôi sẽ xem xét cuốn sách. Trong khi chờ đợi, nếu tôi hiểu điều này trong nháy mắt, bạn ngụ ý rằng tôi thực sự, thực sự, không muốn phơi bày nhiều hơn những gì cần thiết cho bất kỳ đối tượng nào khác ... có vẻ như tất cả các vật thể nên đóng gói rất chặt chẽ và tất cả mọi thứ giao dịch như thể có hàng triệu cuộc gọi API nhỏ giữa mỗi đối tượng ... bah, tôi cảm thấy mệt mỏi, quên bình luận đó. –

+0

Vâng, bạn đã có nó chính xác! Đóng gói và khớp nối thấp. Mỗi đối tượng phải có trách nhiệm riêng (duy nhất) và sử dụng các giao diện nhỏ, rõ ràng để giao tiếp với bất kỳ đối tượng nào khác mà nó cần nói chuyện. – Peeja

Các vấn đề liên quan