Có một thuật ngữ được sử dụng khi các biến nội bộ được khai báo công khai và có thể truy cập?


10

Nếu ai đó viết mã để có thể truy cập biến nội bộ $ _fields mà không cần sử dụng các phương thức getter / setter, thì có một thuật ngữ thích hợp được sử dụng để mô tả điều đó không?

Một cái gì đó đủ lịch sự để sử dụng với quản lý :)


9
Thiếu đóng gói?
Oded

@Oded Tôi nghĩ bạn đúng - thiếu / đóng gói kém mô tả nó tốt
PeterB

Hai cụm từ tôi nghĩ đến trong khi cố gắng trả lời câu hỏi này là "trừu tượng rò rỉ" và "phạm vi lỏng lẻo" - mỗi từ đó đề cập đến điều gì (ngoài đầu tôi)?
PeterB

1
Trừu tượng hóa là khi bạn cố gắng trừu tượng hóa một khái niệm nhưng nó không thực sự hoạt động - các khái niệm cơ bản vẫn bị rò rỉ (ORM trên SQL và các khung web qua HTTP / HTML có xu hướng bị trừu tượng hóa).
Oded

@PeterB - để thêm vào lời giải thích của Oded, hãy xem điều này: joelonsoftware.com/articles/LeakyAbstrilities.html
Joris Timmermans

Câu trả lời:


30

Phơi bày những thành viên tư nhân không bao giờ là một điều tốt trong xã hội lịch sự ...

Thực hành này là thiếu / đóng gói kém.


6
+1, Chà, bạn sẽ không đưa các nhân viên của mình ra khỏi văn phòng chứ?
StuperUser

6
-1: Đóng gói thực sự đã xảy ra và xảy ra tốt. Nhưng nó không được ghi lại qua mã nguồn theo cách thường được chấp nhận. Một số ngôn ngữ (như Python) thiếu các biến thực sự riêng tư, nhưng vẫn thực hành đóng gói.
S.Lott

6
@Oded: Encapsulation là một khái niệm thiết kế . Các ngôn ngữ khác nhau có triển khai khác nhau của khái niệm. Một ngôn ngữ với một tuyên bố riêng cho phép một thực hiện. Một ngôn ngữ lập trình chức năng với các đối tượng không trạng thái có thể có cách triển khai khác. Python (thiếu private) đã có một triển khai khác về khái niệm đóng gói.
S.Lott

1
@S Lott; Oded - Đóng gói là tốt và dựa vào mã trong đó các biến riêng tư thường được truy cập trực tiếp từ các lớp khác là đóng gói kém. Trong python, bạn thực hiện điều này bằng cách truy cập các biến riêng tư được __xáo trộn của một lớp khác hoặc bỏ qua các quy ước của một tiền tố gạch dưới duy nhất (mặc dù nếu getter của bạn đang thực hiện hành vi khác; thực sự nên sử dụng để xáo trộn tên). Các ngôn ngữ khác cũng có thể đóng gói kém, ví dụ, sự phản chiếu trong Java và số học con trỏ trong C ++ để có được các biến riêng tư. Python không tạo ra cú pháp để làm điều đó rườm rà.
dr jimbob

2
@drjimbob: Mã Python hiếm khi sử dụng __xáo trộn tên. Không có __, nó thiết kế vẫn phản ánh đóng gói tốt. Cho rằng "công khai" có nghĩa là "thiếu / đóng gói kém" là sai. Khái niệm này vẫn còn. Mã nguồn thiếu trang trí thích hợp.
S.Lott

10

Bên cạnh việc thiếu đóng gói đã được Oded đề cập, tùy thuộc vào ngôn ngữ lập trình và mô hình của nó, nó cũng có thể là "dữ liệu cũ đơn giản" (trong đó không nhất thiết phải là mùi antipotype hoặc mã).



2

Nó được gọi là một túi tài sản.

Thông thường, nó được sử dụng để giữ một tập hợp các thuộc tính có thể liên quan (mỗi thuộc tính có thể có khả năng là một đối tượng lớp có các chỉ định truy cập phù hợp hay không). Nhưng cấu trúc xung quanh chỉ là một túi tài sản.


2

Nó được gọi là "không tuân theo một tiêu chuẩn mã hóa cụ thể".

OP đã viết:

một biến nội bộ $ _fields có thể truy cập mà không cần sử dụng các phương thức getter / setter

Điều đó có thể trái với tiêu chuẩn của bạn và (do đó) có thể là mùi mã. Nhưng nó không nhất thiết là đóng gói nghèo. Việc để lộ một biến nội bộ (như "chỉ sử dụng nội bộ") đối với getter và setters với thế giới bên ngoài sẽ còn tồi tệ hơn.

Câu hỏi là: có nên $_fieldstruy cập được cho thế giới bên ngoài?

Nếu vậy, chúng ta có một trường hợp bạn sẽ thêm các phương thức getter / setter. Các phương thức này không gói gọn bất cứ điều gì ngoài thực tế đó $_fieldslà một biến số của một loại nào đó (trái ngược với một cái gì đó được tính toán / tìm nạp / v.v. khi đang bay). Tùy thuộc vào ngôn ngữ, có thể bạn vẫn sẽ rò rỉ loại (còn gọi là chi tiết triển khai) ra bên ngoài. Cho dù bạn luôn muốn getters / setters, hoặc chỉ khi "cần thiết" là một vấn đề tiêu chuẩn mã hóa.

Nếu $_fieldsnên không thể truy cập, sau đó, tốt, không truy cập vào nó. Việc bạn có nên ngăn người khác truy cập nó ở cấp độ ngôn ngữ (riêng tư và bạn bè) hay không (có thể dễ dàng gỡ lỗi trong một số trường hợp nhất định) - một lần nữa - một vấn đề tiêu chuẩn mã hóa.

Vấn đề đóng gói hoàn toàn trực giao với điều này. Vi phạm đóng gói là hoàn toàn có thể với getters và setters. Thậm chí còn dễ dàng hơn để đi vào, bởi vì hầu hết tiếng chuông báo thức của mọi người không vang lên khi họ nhìn thấy một loạt các getters và setters - mã dường như tuân theo các thực tiễn tốt nhất. Mã, điều đó rất có thể giới thiệu nhiều phụ thuộc hơn vào các chi tiết triển khai nội bộ so với một biến được gọi là $_fieldskhông xảy ra private.

Tôi là một fan hâm mộ của những điều tương tự tồi: Gọi rằng đóng gói kém cũng giống như gọi ai đó cầm súng là kẻ giết người.



-2

nếu các phương thức setter / getter của bạn không có gì hơn

void setfoo(bar){foo=bar;}
foo getfoo{return foo;}

sau đó chỉ cần tạo một biến pubic chỉ là lưu một số cách gõ bên ngoài một vài trường hợp cạnh trong đó sự khác biệt quan trọng.


3
Chỉ vì đó là tất cả các getters và setters của bạn làm bây giờ không có nghĩa đó là cách nó sẽ luôn luôn như vậy. Và nếu việc thêm xác thực vào một trình thiết lập yêu cầu phải lướt qua hàng chục ngàn dòng mã để tìm thấy mọi nơi mà tài sản được truy cập, bạn sẽ ngay lập tức thổi bay hàng chục giây bạn đã tự cứu mình bằng cách tránh đóng gói lần đầu tiên.
Plutor

@Plutor: Nếu đó là tất cả các đối tượng sẽ làm (ví dụ: vì nó đại diện cho một thông điệp được gửi đến một quá trình khác hoặc một bản ghi trong cơ sở dữ liệu) thì không sao cả; đó là những điều cần được bảo tồn cao
Donal Fellows
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.