Ý tưởng cơ bản là một "trường" (biến cấp độ thể hiện) được khai báo là được bảo vệ có thể dễ nhìn thấy hơn so với nó và ít được "bảo vệ" hơn bạn muốn. Không có công cụ sửa đổi truy cập trong C / C ++ / Java / C # tương đương với "chỉ có thể truy cập bởi các lớp con trong cùng một cụm", do đó cung cấp cho bạn khả năng xác định con của bạn có thể truy cập vào trường trong cụm của bạn, nhưng không cho phép trẻ em được tạo ra trong các hội đồng khác có cùng quyền truy cập; C # có các sửa đổi nội bộ và được bảo vệ, nhưng việc kết hợp chúng làm cho quyền truy cập "nội bộ hoặc được bảo vệ", không phải "nội bộ và được bảo vệ". Vì vậy, một lĩnh vực được bảo vệ có thể truy cập bởi bất kỳ đứa trẻ nào, cho dù bạn đã viết đứa trẻ đó hoặc người khác đã làm. Do đó, được bảo vệ là một cánh cửa mở cho tin tặc.
Ngoài ra, các trường theo định nghĩa của chúng có khá nhiều không có xác nhận vốn có trong việc thay đổi chúng. trong C #, bạn có thể tạo một chỉ đọc, điều này làm cho các loại giá trị không đổi một cách hiệu quả và các loại tham chiếu không thể được khởi tạo lại (nhưng vẫn rất dễ thay đổi), nhưng đó là về nó. Như vậy, thậm chí được bảo vệ, con cái của bạn (mà bạn không thể tin tưởng) có quyền truy cập vào trường này và có thể đặt nó thành một cái gì đó không hợp lệ, làm cho trạng thái của đối tượng không nhất quán (cần tránh).
Cách được chấp nhận để làm việc với các trường là đặt chúng ở chế độ riêng tư và truy cập chúng bằng một thuộc tính và / hoặc phương thức getter và setter. Nếu tất cả người tiêu dùng của lớp cần giá trị, hãy đặt công khai (ít nhất). Nếu chỉ có trẻ em cần nó, làm cho getter được bảo vệ.
Một cách tiếp cận khác trả lời câu hỏi là tự hỏi bản thân; Tại sao mã trong phương thức con cần khả năng sửa đổi trực tiếp dữ liệu trạng thái của tôi? Điều đó nói gì về mã đó? Đó là đối số "khoảng cách dọc" trên khuôn mặt của nó. Nếu có mã ở một đứa trẻ phải trực tiếp thay đổi trạng thái cha mẹ, thì có lẽ mã đó phải thuộc về cha mẹ ở vị trí đầu tiên?