Các lớp lồng nhau: Một công cụ hữu ích hoặc vi phạm đóng gói?


11

Vì vậy, tôi vẫn đang ở trên hàng rào liệu tôi có nên sử dụng những thứ này hay không.

Tôi cảm thấy đó là một sự vi phạm cực độ của việc đóng gói, tuy nhiên tôi thấy rằng tôi có thể đạt được một mức độ đóng gói nào đó trong khi có được sự linh hoạt hơn trong mã của mình.

Các dự án Java / Swing trước đây tôi đã sử dụng các lớp lồng nhau ở một mức độ nào đó, tuy nhiên bây giờ tôi đã chuyển sang các dự án khác trong C # và tôi tránh sử dụng chúng.

Bạn cảm thấy thế nào về các lớp lồng nhau?


Làm thế nào chính xác là các lớp lồng nhau vi phạm đóng gói? Nếu bất cứ điều gì chúng được gói gọn hơn vì chúng được 'gói gọn' bên trong một lớp khác và tùy ý có thể được đặt ở chế độ riêng tư.
Steven Jeuris

Câu trả lời:


8

Cũng vậy, nói một cách đơn giản: các lớp lồng nhau không vi phạm đóng gói và nói chung, các tính năng ngôn ngữ không vi phạm các nguyên tắc lập trình. Lập trình viên vi phạm nguyên tắc lập trình.

Thật thú vị, nó được yêu cầu các lớp lồng nhau làm tăng đóng gói :

Gia tăng đóng gói Hãy xem xét hai lớp cấp cao nhất là A và B, trong đó B cần quyền truy cập vào các thành viên của A mà nếu không sẽ được khai báo là riêng tư. Bằng cách ẩn lớp B trong lớp A, các thành viên của A có thể được khai báo là riêng tư và B có thể truy cập chúng. Ngoài ra, bản thân B có thể bị ẩn khỏi thế giới bên ngoài.

Có một số sự thật trong đó.

Thông thường B là kết quả của việc áp dụng SRP cho chính A. B có khả năng vi phạm nhiều nguyên tắc, đặc biệt, nếu tất cả những gì nó làm là xoay quanh các thành viên tư nhân của A: D

Tôi nghĩ rằng các lớp ẩn có thể hữu ích. Nhưng có rất nhiều tiềm năng cho việc sử dụng sai.


5

Chúng tôi sử dụng các lớp lồng nhau tất cả các thời gian. Trong rất nhiều tình huống, phần mềm / quy trình kinh doanh đã lồng ghép các đối tượng kinh doanh. Chúng ta đều đã thấy ví dụ về một đối tượng Order có bộ sưu tập OrderItems lồng nhau.

Điểm mấu chốt là nó giúp việc đọc / viết mã dễ dàng hơn và hiếm khi xảy ra trường hợp bạn cần lớp Đặt hàng và không cần biết về OrderItems.


1

Cá nhân, tôi cảm thấy như họ nên tránh vì họ kết hợp thiết kế của bạn theo nhiều cách khác nhau (thường là không thuận lợi).

Tuy nhiên, nếu dự án của bạn có phạm vi được thiết lập và đóng gói một lớp (chẳng hạn như lớp Node hoặc một loại đối tượng được sử dụng để đi qua cơ sở hạ tầng của một lớp cụ thể) thì tôi không thấy tác hại.

Trong thực tế, tôi nghĩ đối với một số loại dự án nhất định, nó làm cho mã (và lý luận) dễ đọc / dễ hiểu hơn. Tuy nhiên, tôi nghĩ rằng đối với hầu hết các dự án có khả năng mở rộng, đó là một ý tưởng tồi, bởi vì hiếm khi việc tách chúng gây ra vấn đề cho bạn, nhưng để chúng lại với nhau có thể buộc bạn phải tách chúng ra trong tương lai (điều này gây lãng phí thời gian).


0

(Trong C #) Nói chung tôi sẽ tránh chúng, mặc dù nó có thể phụ thuộc chính xác mục đích của lớp là gì.

Tôi sẽ không bao giờ sử dụng chúng cho bất kỳ loại lớp mô hình miền nào, điều đó chỉ vô nghĩa với tôi.

Tôi đã từng sử dụng chúng để cấu trúc dữ liệu riêng tư ở lớp bên ngoài, nhưng tôi thấy rằng những thứ này hầu như luôn luôn cần thiết ở bên ngoài trong vòng đời của dự án nên tôi thường không bận tâm đến điều này nữa.

Lần duy nhất tôi sử dụng chúng bây giờ là cho thủ thuật mã hóa nhỏ kỳ lạ khi sử dụng một lớp nhỏ khác giúp triển khai một lớp cụ thể dễ dàng hơn hoặc thực hiện giao diện thực sự chỉ là một mẫu thông báo sự kiện (trong đó lớp bên trong sẽ triển khai giao diện và chỉ cần vượt qua kiểm soát lại lớp bên ngoài).

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.