"Encapsulate Fields của bạn" vì vậy tôi đã học để tạo ra lớp cung cấp cho nó một số lĩnh vực, tạo thu khí, setters
Python folks không làm điều này. Tuy nhiên, họ vẫn đang lập trình OO. Rõ ràng, getters gussy và setters là không cần thiết.
Chúng phổ biến, vì các giới hạn trong C++ và Java. Nhưng chúng dường như không cần thiết.
Những người dùng Python sử dụng properties
đôi khi để tạo ra các hàm getter và setter giống như một thuộc tính đơn giản.
Vấn đề là "Đóng gói" là một chiến lược Thiết kế. Nó có rất ít hoặc không có gì để làm với việc thực hiện. Bạn có thể có tất cả các thuộc tính công khai và vẫn là thiết kế được đóng gói độc đáo.
Cũng lưu ý rằng nhiều người lo lắng về "người khác", những người "vi phạm" thiết kế bằng cách truy cập trực tiếp các thuộc tính. Tôi cho rằng điều này có thể xảy ra, nhưng sau đó lớp học sẽ ngừng hoạt động chính xác.
Trong C++ (và Java) nơi bạn không thể nhìn thấy nguồn, có thể khó hiểu giao diện, vì vậy bạn cần rất nhiều gợi ý. phương pháp riêng, getters rõ ràng và setters, vv
Trong Python, nơi bạn có thể nhìn thấy tất cả các nguồn, nó tầm thường để hiểu giao diện. Chúng tôi không cần phải cung cấp rất nhiều gợi ý. Như chúng ta nói "Sử dụng nguồn, Luke" và "Chúng ta đều là người lớn ở đây." Tất cả chúng ta đều có thể nhìn thấy nguồn, chúng ta không cần phải lo lắng về việc xếp chồng lên các getters và setters để cung cấp thêm các gợi ý về cách API hoạt động.
Ví dụ đối tượng hiển thị/hiển thị là lớp "dữ liệu" - giả sử Người có tên và ngày sinh. Lớp có phương pháp để hiển thị đối tượng trong đó một số Renderer sẽ được chuyển làm đối số không?
Ý tưởng hay.
Điều đó không vi phạm nguyên tắc rằng lớp học chỉ nên có một mục đích (trong trường hợp này là trạng thái cửa hàng) nên không nên quan tâm đến việc trình bày đối tượng này.
Đó là lý do tại sao đối tượng Render riêng biệt. Thiết kế của bạn khá đẹp.
Không có lý do gì khiến đối tượng Người không thể gọi trình kết xuất đồ họa đa năng và vẫn có tập hợp trách nhiệm hẹp.Sau khi tất cả đối tượng Person chịu trách nhiệm về các thuộc tính và chuyển các thuộc tính đó đến một Trình kết xuất đồ họa cũng nằm trong các trách nhiệm của nó.
Nếu nó thực sự là một vấn đề (và nó có thể có trong một số ứng dụng), bạn có thể giới thiệu các lớp học Helper. Vì vậy, lớp PersonRenderer
hiển thị dữ liệu Person
. Bằng cách đó, thay đổi đối với Người cũng yêu cầu thay đổi đối với PersonRenderer
- và không có gì khác. Đây là Đối tượng truy cập dữ liệu mẫu thiết kế.
Một số người sẽ làm cho Render trở thành lớp nội bộ, chứa trong Person, do đó, nó là Person.PersonRenderer
để thực thi một số ngăn chặn nghiêm trọng hơn.
Bạn cần tìm nguồn tài liệu đọc tốt hơn, bạn tôi. Không phải mọi thứ bạn đọc trên intertubes đều đúng. Getters/Setters là đối diện của cái ác. Nếu bạn đã đăng nguồn gốc của đá quý này của sự khôn ngoan, chúng tôi có thể chọn nó ngoài, nhưng than ôi, không có liên kết .... aha-- liên kết được đăng. đã phê bình. noop. –
@Sky Tất cả phụ thuộc vào ngữ cảnh, một số sử dụng của Getters/Setters là tốt và khác là "ác" (mặc dù tôi đã không sử dụng từ đó). Tôi cố gắng không quá ngoan ngoãn. –
@Andreas - đã hiểu. Việc lạm dụng bất kỳ cấu trúc nào có thể là điều ác, nhưng để mô tả getters/setters như là ác trong cùng bối cảnh, ví dụ, eval chỉ là ngớ ngẩn, IMO. –