2011-07-07 29 views
7

Một trong những phần quan trọng của lập trình hướng đối tượng là đóng gói, nhưng các thuộc tính/trường công có xu hướng phá vỡ sự đóng gói này. Trong những trường hợp nào thì một tài sản công hoặc lĩnh vực thực sự có ý nghĩa?Có lý do chính đáng để sử dụng tài sản/lĩnh vực công cộng không?

Lưu ý: Tôi chỉ sử dụng cụm từ 'thuộc tính' hoặc 'trường' vì thuật ngữ khác nhau giữa các ngôn ngữ. Nói chung, tôi có nghĩa là một biến thuộc về một đối tượng có thể được truy cập và thiết lập từ bên ngoài đối tượng.

+0

Hãy xem xét điều này: [Thuộc tính so với biến số công khai] (http://www.codinghorror.com/blog/2006/08/properties-vs-public-variables.html). Tôi nghĩ rằng các hành vi tương tự có thể đạt được trong ngôn ngữ khác hơn NET, giống như ruby. – Lynch

Trả lời

5

Có, đôi khi có lý do chính đáng. Thường ẩn thông tin. Nhưng có một số ngoại lệ thường xuyên.

Ví dụ, lĩnh vực nào là hợp lý và hữu ích cho:

  • Một C++ pimpl - một struct/lớp tổ chức thi riêng của lớp khác. Các trường của nó có thể được khai báo công khai theo cú pháp, nhưng thường có thể truy cập chỉ trong một tệp nguồn, bởi lớp đang giữ pimpl.
  • Các trường không đổi. Ví dụ, Joshua Bloch viết trong Hiệu quả Java: "Các lớp được phép phơi bày các hằng số thông qua các trường cuối cùng tĩnh công cộng."
  • Struct sử dụng để giao tiếp giữa C và C++.
  • loại mà chỉ đại diện cho dữ liệu, mà đại diện là không thay đổi. Ví dụ, javax.vecmath.Point3d, đại diện cho một {x, y, z} phối hợp.
1

Có lý do chính đáng để sử dụng thuộc tính công khai không?

số

thành viên Công luôn nguy hiểm. Bạn có thể không cần bất kỳ sự kiểm soát nào bây giờ, nhưng một khi bạn phơi bày chúng, bạn sẽ mất khả năng kiểm soát sau này. Nếu bạn có gettes/setters ngay lập tức bạn có chỗ để thêm kiểm soát sau này.

Ps: Tùy thuộc vào ngôn ngữ bạn sử dụng, thuộc tính và trường có thể có nghĩa là những thứ khác nhau. C# properties thực sự là một cách để cả hai đạt được đóng gói và đồng thời không phải là rất tiết.

0

Có một lý do không tốt: bằng cách truy cập trực tiếp vào mốc dữ liệu bạn tránh đẩy phương thức gọi lên ngăn xếp, cho những gì đáng giá.

Trong nhiều ngôn ngữ, điều này cũng có thể đạt được bằng cách nhấn mạnh phương thức truy cập/s.

2

Câu trả lời ngắn gọn: không bao giờ.

Thực ra, nếu bạn sử dụng một đối tượng để lưu trữ dữ liệu đơn giản, nhưng đối tượng không có logic và bạn không bao giờ có ý định lấy từ đối tượng này, thì có thể có trường công khai. Đôi khi tôi làm những việc như thế này trong C++:

struct A { 
    int a; 
    float b; 
    string c; 
    A():a(0),b(0.0) {} 
    A(int a_, float b_, string c_):a(a_),b(b_),c(c_) {} 
}; 

Nhưng khác với việc khởi tạo các nhà xây dựng, nó không khác gì cấu trúc C. Nếu lớp của bạn làm bất cứ điều gì nhiều hơn điều này, hơn bạn không bao giờ nên sử dụng các trường công cộng (hoặc thậm chí được bảo vệ).

Đối với các thuộc tính, tùy thuộc vào ngôn ngữ bạn sử dụng. Ví dụ, trong Delphi, mục đích chính của các thuộc tính là cung cấp các giao diện công khai cho các trường, và có thể cung cấp getters/setters cho chúng, trong khi vẫn làm việc theo cú pháp như một biến.

0

Nếu mục đích của đối tượng là giữ dữ liệu trong các trường của nó, thì có nghĩa là có phương pháp trên đối tượng (a) thuần túy chức năng (ở chỗ chúng không thay đổi trạng thái của đối tượng, hoặc bất kỳ thứ gì khác), hoặc (b) điều khiển trạng thái của đối tượng và điểm là chúng thao tác trạng thái theo một cách cụ thể.

Loại điều bạn nên tránh là (c) phương pháp làm việc với các đối tượng khác dựa trên trạng thái của đối tượng (và chắc chắn nếu có các giả định về trạng thái "hợp lệ") là gì.

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