Như đã nói bởi những người khác, các biến riêng tư là tốt để tránh các lỗi sử dụng dẫn đến đối tượng rơi vào tình trạng không nhất quán và khó theo dõi các lỗi và các ngoại lệ không lường trước được.
Nhưng mặt khác, những gì hầu hết bị người khác bỏ qua là về các lĩnh vực được bảo vệ.
Một lớp con mở rộng sẽ có quyền truy cập đầy đủ vào các trường được bảo vệ, làm cho đối tượng trở nên mỏng manh như thể các trường đó là công khai, nhưng sự mong manh đó bị giới hạn ở lớp mở rộng tự nó (trừ khi nó tiếp xúc với các trường như vậy nhiều hơn).
Vì vậy, các trường công khai khó được coi là tốt và cho đến nay, lý do duy nhất để sử dụng chúng là cho các lớp được sử dụng làm tham số cấu hình (một lớp rất đơn giản có nhiều trường và không có logic, do đó lớp được truyền dưới dạng tham số một mình một số phương pháp).
Nhưng mặt khác, các trường riêng làm giảm tính linh hoạt của mã của bạn đối với người dùng khác.
Linh hoạt so với Rắc rối, ưu và nhược điểm:
Các đối tượng được khởi tạo bởi mã của bạn trong lớp vanilla với các trường được bảo vệ là an toàn và là trách nhiệm của riêng bạn.
Mặt khác, các đối tượng mở rộng lớp của bạn với các trường được bảo vệ, được người dùng mã của bạn khởi tạo, là trách nhiệm của họ, không phải của bạn.
Vì vậy, các trường / phương thức được bảo vệ không được ghi chép tốt hoặc nếu người dùng không thực sự hiểu cách sử dụng các trường và phương pháp đó, có khả năng gây rắc rối không cần thiết cho chính họ và cho bạn.
Mặt khác, làm cho hầu hết mọi thứ riêng tư sẽ làm giảm tính linh hoạt của người dùng và thậm chí có thể khiến họ tìm kiếm các giải pháp thay thế được duy trì, vì họ có thể không muốn tạo và duy trì một ngã ba chỉ để mọi thứ diễn ra theo cách của họ.
Vì vậy, một sự cân bằng tốt giữa tư nhân, được bảo vệ và công cộng là điều thực sự quan trọng.
Bây giờ, để quyết định giữa riêng tư và được bảo vệ là vấn đề thực sự.
Khi nào sử dụng được bảo vệ?
Bất cứ khi nào bạn hiểu một lĩnh vực có thể rất linh hoạt, nó nên được mã hóa là được bảo vệ. Tính linh hoạt đó là: từ trở thành null (trong đó null luôn được kiểm tra và được công nhận là trạng thái hợp lệ không ném ngoại lệ), đến các ràng buộc trước khi được sử dụng bởi lớp cũ của bạn. > = 0, <100, v.v. và tự động sửa cho các giá trị vượt / chảy, ném tối đa một thông báo cảnh báo.
Vì vậy, đối với trường được bảo vệ như vậy, bạn có thể tạo một getter và chỉ sử dụng nó (thay vì sử dụng biến trường), trong khi những người dùng khác không thể sử dụng nó, trong trường hợp họ muốn linh hoạt hơn với mã cụ thể của họ, trong ví dụ của tôi có thể như : nếu họ muốn các giá trị âm hoạt động tốt ở lớp mở rộng của chúng.