Hầu như tất cả những điều này cho thấy một sự hiểu lầm cơ bản về đóng gói, và cách nó được áp dụng.
Phản hồi ban đầu rằng bạn đã phá vỡ đóng gói chỉ là sai. Ứng dụng của bạn có thể chỉ cần đặt giá trị của phô mai trong tủ lạnh thay vì tăng / giảm hoặc thêm / loại bỏ. Ngoài ra, nó không phải là ngữ nghĩa, bất kể bạn gọi nó là gì, nếu bạn có nhu cầu truy cập và / hoặc thay đổi các thuộc tính bạn không phá vỡ đóng gói bằng cách cung cấp chúng. Cuối cùng, đóng gói không thực sự là "ẩn", đó là về việc kiểm soát quyền truy cập vào trạng thái và các giá trị không cần phải công khai hoặc thao túng bên ngoài lớp, trong khi cấp nó cho những người nên và thực hiện nhiệm vụ có sẵn trong nội bộ.
Một getter hoặc setter không phá vỡ đóng gói khi có nhu cầu chính đáng để nhận hoặc đặt giá trị. Đây là lý do tại sao các phương pháp có thể được công khai.
Đóng gói là về việc giữ dữ liệu và các phương thức sửa đổi dữ liệu đó trực tiếp với nhau ở một nơi logic, lớp.
Trong trường hợp cụ thể này, rõ ràng cần phải thay đổi giá trị của phô mai trong ứng dụng. Bất kể việc này được thực hiện như thế nào, thông qua get / set hoặc add / remove, miễn là các phương thức được gói gọn trong lớp bạn đang theo kiểu hướng đối tượng.
Để làm rõ, tôi sẽ đưa ra một ví dụ về cách đóng gói bị phá vỡ bằng cách cung cấp quyền truy cập bất kể tên phương thức hoặc thực thi logic.
Giả sử tủ lạnh của bạn có "trọn đời", chỉ cần một số tiếng tích tắc trước khi tủ lạnh không còn hoạt động (vì lý do tranh luận, tủ lạnh không thể được sửa chữa). Về mặt logic, không có cách nào người dùng (hoặc phần còn lại của ứng dụng của bạn) có thể thay đổi giá trị này. Nó nên là riêng tư. Nó sẽ chỉ được hiển thị thông qua nói một thuộc tính công khai khác được gọi là "isWorking". Khi hết thời gian sử dụng, bên trong bộ tủ lạnh sẽ làm việc sai.
Việc thực hiện đếm ngược thời gian và lật công tắc isWorking hoàn toàn bên trong tủ lạnh, không có gì bên ngoài có thể / nên có thể thực hiện quy trình. isWorking chỉ nên được nhìn thấy, do đó, một getter không phá vỡ đóng gói. Tuy nhiên, việc thêm các phụ kiện cho các yếu tố của quy trình trọn đời sẽ phá vỡ sự đóng gói của bạn.
Giống như hầu hết mọi thứ, định nghĩa của đóng gói không theo nghĩa đen, nó tương đối. Bạn có thể thấy X bên ngoài lớp học không? Bạn có thể thay đổi Y? Là tất cả mọi thứ áp dụng cho đối tượng của bạn ở đây trong lớp này hay là chức năng trải đều trên nhiều lớp?
putCheese
sẽ thêm phô mai vào tủ lạnh vàtakeCheese
sẽ loại bỏ nó - đây là những trừu tượng hướng miền (cấp độ cao hơn), chứ không phải là getters & setters trường đối tượng (là trừu tượng lập trình máy tính (cấp độ thấp)).