Principle of Least Knowledge

Để quản lý sự phức tạp, một ý tưởng là một lớp nên được thiết kế sao cho nó không cần thiết và phụ thuộc vào lớp khác trong hệ thống. Điều đó sẽ tăng khớp nối và làm cho hệ thống của bạn khó bảo trì hơn. Điều này tự nhiên dẫn đến một khái niệm rằng các lớp nên có một cái nhìn hạn hẹp về những gì của các lớp khác mà nó biết. Bằng cách giới hạn các lớp giao tiếp với nhau, bạn có thể thực thi Principle of Least Knowledge.

Nguyên tắc này cũng được thực hiện hóa trong một quy tắc gọi là The Law of Demeter. Ỷ tưởng cơ bản của luật này là các lớp nên biết và tương tác với nhau càng ít lớp khác càng tốt, điều này có nghĩa là bất kỳ lớp nào cũng chỉ nên giao tiếp với bạn bè ngay trực tiếp của nó. Khái niệm này hơi trừu tượng một chút so với các nguyên tắc thiết kế khác, nhưng nó cũng quan trọng không kém vì nó giúp giảm khớp nối và cung cấp sự ổn định cho hệ thống của bạn. The Law ò Demeter thực sự bao gồm các quy tắc khác nhau mà chúng ta sẽ xem xét, cũng như cách The Law of Demeter có thể vi phạm. Các quy tắc trong luật Demeter được sử dụng để cung cấp một hướng dẫn như loại phương thức gọi một phương thức cụ thể có thể thực hiện.

Quy tắc đầu tiên của chúng ta sẽ xem xét các trạng thái rằng một phương thức, M, trong một đối tương, O, có thể gọi bất kỳ phương thức nào khác trong chính O. Quy tắc này khá đơn giản và nó có ý nghĩa logic, một phương thức gói gọn trong một lớp cho phép gọi bất cứ phương thức nào khác cũng gói gọn trong một lớp.


Quy tắc thứ hai nói rằng một phương thức M, có thể gọi phương thức của bất kỳ tham số P nào. Vì một tham số phương thức được coi là cục bộ phương thức, tham số có thể coi là một người bạn. Phương thức M trong lớp O có tham số P thuộc loại friend. Luật Demeter sẽ cho phép tại phương thức M sẽ cho phép gọi phương thức bất kỳ của lớp friend.


Quy tắc thứ ba của luật Demeter, là một phương thức M có thể gọi một phương thức N của một đối tượng I nếu được khởi tạo trong M.


Điều này có nghĩa là nếu một phương thức tạo ra một đối tượng mới thì phương thức đó có thể sử dụng các phương thức của đối tượng đó, đối tượng được coi là cục bộ của phương thức tạo. Giống như cách một đối tượng được coi là cục bộ khi nó là một tham số ở trên. Trong ví dụ này, phương thức M tạo một thể hiện cục bộ mới của lớp Friend, vì đối tượng Friend là cục bộ của phương thức M, bạn được phép gọi bất kỳ phương thức nào của lớp Friend.

Ngoài các đối tượng cục bộ, quy tắc thứ tư nói rằng bất kỳ phương thức nào M trong đối tượng O  có thể gọi tất cả các phưng thức của bất kì đối tượng nào là thành phần trực tiếp của O. Điều này có nghĩa là một phương thức của một lớp có thể gọi phương thức của các lớp cảu các biến thể hiện của nó. Vì lớp O có tham chiếu trực tiếp đến lớp Friend, mọi phương thức bên trong O đều được phép gọi bất kỳ phương thức nào của lớp Friend.


Định luật Demeter dường như là một khái niệm phức tạp và trừu tượng, nhưng tất cả các quy tắc đều tuân theo nguyên tắc rằng bạn không nên cho phép một phương thức truy cập vào một phương thức khác bằng cách tiếp cận thông qua một đối tượng.

Điều này có nghĩa là một phương thức không nên gọi các phương thức của bất kỳ đối tượng nào không cục bộ. Chúng ta vừa xem xét những gì luật coi là một đối tượng local. Các đối tượng này phải được truyền qua một tham số hoặc chúng phải được khởi tạo trong một phương thức hoặc chúng phải là một biển thể hiện (instance). Điều này cho phép các phương thức truy cập trực tiếp vào hành vi của các đối tượng cục bộ. Thuật ngữ "reaching through' (đạt được) có nghĩa là bạn cần sử dụng một đối tượng khác để thực hiện yêu cầu của mình. Hoặc bạn đang sử dụng các phương thức của các đối tượng được xem xét bên ngoài bạn bè trực tiếp của bạn. Những điều kiện này, thường xảy ra khi banj có một chuỗi các cuộc gọi phương thức đến các đối tượng bạn không nên biết hoặc khi bạn sử dụng các phương thức từ một loại đối tượng không xác định được trả về cho bạn từ cuộc gọi phương thức cục bộ của bạn. Người lái xe biết về hạng xe nhưng động cơ của xe không phải là thành phần của người lái, do đó, người lái xe không nên gọi các phương thức của động cơ. Bạn không nên truy cập các phưong thức của đối tượng không nằm trong vòng kết nối ngay lập tức của bạn. Hãy nghĩ về nó theo cách này, khi bạn lái xe, bạn không đưa ra các mệnh lệnh riêng lẻ cho mọi thành phần của xe, bạn chỉ cần nói với chiếc xe là lái xe và chính chiếc xe biết cách đối phó với các thành phần của nó.

Một cách khác bạn có thể tiếp cận thông qua một đối tượng là khi phương thức của bạn nhận được một đối tượng thuộc loại không xác định làm giá trị trả về và bạn thực hiện các cuộc gọi phương thức đến đối tượng trả về. Các đối tượng được trả về phải cùng loại với: các đối tượng được khai báo trong tham số phương thức, các đối tượng được khai báo và khởi tạo cục bộ trong phương thức, hoặc các đối tượng được khai báo trong các biến instance. Một lần nữa, điều này là do bạn không biết về đối tượng trước khi nó được trả lại cho bạn. Vì vậy, bạn không nên sử dụng những thứ bạn không biết, ý tưởng này là bạn chỉ nên sử dụng các đối tượng trả về khớp với các loại đối tượng cục bộ được thể hiện trong ví dụ này:


Lớp Driver này biết về lớp Car, được khai báo trong một biến thể, và cả các cửa hàng cho thuê xe, được khai báo là một tham số. Tuy nhiên, vì nó không tạo ra một phiên bản mới của xe máy, nên Driver không thể vận hành phương tiện đó. Vì vậy, bạn chỉ định rằng loại phương tiện mà người lái xe có thể sử dụng là oto, nên người lái xe chỉ có thể điều khiển oto. Luật Demeter định nghĩa câc lớp nên tương tác với nhau như thế nào.

Các lớp nên biết càng ít càng tốt về toàn bộ hệ thống của bạn. Hãy vận dụng luật Demeter.

Nhận xét

Bài đăng phổ biến từ blog này

Hiểu về Norm Regularization

Những thuật toán nền tảng trong lĩnh vực Trí tuệ nhân tạo (Artificial Intelligence I)