Tôi nghĩ bạn hiểu nhầm cụm từ "tác dụng phụ" vì nó áp dụng cho thiết kế chương trình. Đặt thuộc tính là hiệu ứng phụ, cho dù trạng thái nội bộ có thay đổi hay ít, miễn là nó thay đổi một số trạng thái. Một "setter không có tác dụng phụ" sẽ không hữu ích lắm.
Tác dụng phụ là thứ bạn muốn tránh trên thuộc tính getters. Đọc giá trị của một thuộc tính là điều mà người gọi không mong muốn thay đổi bất kỳ trạng thái nào (tức là gây ra tác dụng phụ), vì vậy nếu có, nó thường sai hoặc ít nhất là có vấn đề (có những ngoại lệ, chẳng hạn như tải lười). Tuy nhiên, getters và setters cũng chỉ là hàm bao cho các phương thức. Các tài sản Duration
, như xa như CLR là có liên quan, chỉ là cú pháp đường cho một phương pháp set_Duration
.
Đây chính xác là những gì trừu tượng như các lớp học có ý nghĩa - cung cấp các hoạt động hạt thô trong khi vẫn giữ trạng thái nội bộ nhất quán. Nếu bạn cố tình tránh để có nhiều tác dụng phụ trong một phép gán thuộc tính duy nhất thì các lớp của bạn sẽ không còn nhiều hơn các vùng chứa dữ liệu câm.
Vì vậy, hãy trả lời câu hỏi trực tiếp: Tôi vẽ đường ở đâu? Không nơi nào, miễn là phương pháp/tài sản thực sự làm những gì tên của nó ngụ ý. Nếu cài đặt Duration
cũng thay đổi ActivityName
, điều đó có thể gây ra sự cố. Nếu nó thay đổi thuộc tính Finish
, điều đó phải rõ ràng; nó nên không thể thay đổi Duration
và có cả hai Start
và Finish
giữ nguyên. Tiền đề cơ bản của OOP là các đối tượng đủ thông minh để tự quản lý các hoạt động này.
Nếu điều này làm phiền bạn ở mức khái niệm thì không có đặc tính đột biến - sử dụng cấu trúc dữ liệu bất biến với thuộc tính chỉ đọc trong đó tất cả đối số cần thiết được cung cấp trong hàm tạo. Sau đó, có hai tình trạng quá tải, một quá tải mất Start
/Duration
và một quá trình khác mất một số Start
/Finish
. Hoặc chỉ làm cho một trong các thuộc tính có thể ghi - giả sử Finish
để giữ cho nó phù hợp với Start
- và sau đó thực hiện Duration
chỉ đọc. Sử dụng sự kết hợp thích hợp của các thuộc tính có thể thay đổi và bất biến để đảm bảo rằng chỉ có một cách để thay đổi một trạng thái nhất định.
Nếu không, đừng lo lắng nhiều về điều này. Thuộc tính (và phương pháp) không được có không mong muốn hoặc không có giấy tờ tác dụng phụ, nhưng đó là hướng dẫn duy nhất tôi sẽ sử dụng.
Cảm ơn, đây là những gì tôi đang tìm kiếm và nó không bao giờ xảy ra với tôi "tác dụng phụ - miễn phí setter "là trong thực tế không thể vì nó sẽ thay đổi trạng thái. Và như bạn đã chỉ ra CLR sẽ dịch sang phương pháp anyway. – Martin
Có, tác dụng phụ của setter là đặt * biến thành viên mà nó đề cập đến *.Nhưng một hiệu ứng phụ bổ sung là sửa đổi * các biến thành viên * khác. –
Tôi chỉ đang suy nghĩ về cùng và tôi thậm chí sẽ nói rằng thiết lập của biến thành viên không phải là một tác dụng phụ, nhưng hiệu quả mong muốn của setter. Thay đổi các biến thành viên khác là một tác dụng phụ. – Martin