Dưới đây là một số đối số cho các thuộc tính và các đối số phản đối của tôi:
Dễ sử dụng hơn so với viết phương thức getter và setter
Các cặp phương thức Getter và setter là một mùi mã. Làm cho nó dễ dàng hơn để viết những điều này cũng giống như làm cho việc trượt bài kiểm tra toán dễ dàng hơn bằng cách sử dụng biểu mẫu Scantron và điền vào tất cả các chữ C. Các đối tượng chỉ chứa trạng thái, để duy trì, không nên sử dụng getters / setters và nên tạo các đối tượng bất biến tại thời điểm tồn tại.
Điều quan trọng đối với người tiêu dùng của một đối tượng là những gì nó làm chứ không phải làm thế nào. Hành vi của nó là những gì nó làm; trạng thái của nó là làm thế nào nó làm điều đó. Nếu bạn thấy mình quan tâm đến trạng thái của một đối tượng (ngoại trừ sự kiên trì, mặc dù điều này cũng phá vỡ OO), bạn chỉ đơn giản là không làm OOP và mất đi lợi thế của nó.
Họ đưa ra một dấu hiệu sơ bộ về hiệu suất cho người tiêu dùng
Đây là một cái gì đó có thể thay đổi trong tương lai, cho bất kỳ tài sản nhất định. Giả sử trong phiên bản 1.0, truy cập PropertyX chỉ cần trả về một trường. Trong bản phát hành 1.5, nếu trường là null, PropertyX sử dụng mẫu Null Object để tạo một đối tượng null mới. Trong phiên bản 2.0, trường được xác nhận thêm bằng phương thức getter trong PropertyX.
Khi tài sản ngày càng phức tạp hơn, dấu hiệu hiệu suất của việc sử dụng một tài sản dường như ngày càng ít trung thực.
Chúng tốt hơn các lĩnh vực công cộng
Đây là sự thật. Nhưng phương pháp cũng vậy.
Chúng đại diện cho một khía cạnh khác nhau cơ bản của một đối tượng so với một phương thức và tất cả người tiêu dùng của đối tượng nên quan tâm đến điều này
Bạn có chắc chắn rằng cả hai câu trên đều đúng?
Chúng dễ gõ hơn, anh bạn
Chắc chắn, gõ myObject.Length
dễ hơn gõ myObject.Length()
, nhưng không thể sửa được với một chút cú pháp?
Tại sao sử dụng phương pháp thay vì thuộc tính?
Không đảm bảo hiệu suất. API sẽ vẫn trung thực ngay cả khi phương thức trở nên phức tạp hơn. Người tiêu dùng sẽ cần lập hồ sơ mã của họ nếu họ đang gặp phải các vấn đề về hiệu suất và không dựa vào từ khóa API.
Ít để người tiêu dùng nghĩ về. Liệu tài sản này có một setter? Một phương pháp chắc chắn không.
Người tiêu dùng đang suy nghĩ từ một tư duy OOP thích hợp. Là người tiêu dùng API, tôi thích tương tác với hành vi của đối tượng. Khi tôi thấy các thuộc tính trong API, nó trông rất giống trạng thái. Trên thực tế, nếu các thuộc tính làm quá nhiều, chúng thậm chí không phải là các thuộc tính, vì vậy, thực sự, các thuộc tính ở trạng thái API LÀ khi chúng xuất hiện cho người tiêu dùng.
Lập trình viên của API sẽ suy nghĩ sâu hơn về các phương thức có giá trị trả về và tránh sửa đổi trạng thái của đối tượng trong các phương thức đó, nếu có thể. Việc tách các lệnh khỏi các truy vấn nên được thực thi bất cứ khi nào có thể.
Vì vậy, tôi hỏi bạn, tại sao sử dụng thuộc tính thay vì phương pháp? Hầu hết các điểm trên MSDN đều có mùi mã và không thuộc về một trong hai thuộc tính hoặc phương thức.
(Những suy nghĩ này đến với tôi sau khi nghĩ về CQS.)
type GetFoo() void SetFoo()
mười nghìn lần. Trong tất cả thời gian viết mã C # tôi chưa bao giờ bị nhầm lẫn bởi một tài sản.