0
0
Lập trình
Admin Team
Admin Teamtechmely

Hiểu Biết Về Luật Demeter Trong Thiết Kế Đối Tượng

Đăng vào 3 tuần trước

• 5 phút đọc

Chủ đề:

KungFuTech

Giới Thiệu

Khi thiết kế phần mềm, khả năng bảo trì, tính mô-đun và sự liên kết thấp là rất quan trọng. Một nguyên tắc giúp đạt được điều này trong lập trình hướng đối tượng là Luật Demeter (LoD). Mặc dù có tên gọi chính thức, khái niệm này rất đơn giản: “chỉ giao tiếp với những người bạn gần gũi.”

1. Luật Demeter Là Gì?

Luật Demeter, còn được gọi là Nguyên tắc Kiến thức Tối thiểu, là một hướng dẫn nhằm giảm thiểu sự liên kết giữa các lớp. Nó quy định:

Một phương thức của một đối tượng chỉ nên gọi các phương thức của:

  1. Chính nó
  2. Các trường của nó (các đối tượng thành viên)
  3. Các đối tượng được truyền vào như tham số
  4. Các đối tượng được tạo ra cục bộ trong phương thức

Nói một cách đơn giản:
Một lớp chỉ nên tương tác với các đối tượng mà nó trực tiếp biết, không phải các đối tượng được truy xuất từ các đối tượng khác.

2. Tại Sao Luật Demeter Quan Trọng Trong Thiết Kế Cấp Thấp (LLD)

Trong Thiết kế Cấp Thấp (LLD), Luật Demeter rất quan trọng vì nó:

  • Giảm sự liên kết chặt chẽ giữa các lớp
  • Làm cho hệ thống dễ bảo trì hơn
  • Đơn giản hóa kiểm tra đơn vị (unit testing)
  • Khuyến khích đóng gói, ẩn các chi tiết nội bộ khỏi các lớp khác

3. Ví Dụ: Vi Phạm Luật Demeter

java Copy
class Engine {
    public void start() { System.out.println("Động cơ đã khởi động"); }
}

class Car {
    private Engine engine = new Engine();
    public Engine getEngine() { return engine; }
}

class Driver {
    public void drive(Car car) {
        car.getEngine().start(); // ❌ Vi phạm LoD
    }
}

Vấn đề:
Driver biết quá nhiều về nội bộ của Car (động cơ Engine).
Điều này tạo ra sự liên kết chặt chẽ — bất kỳ thay đổi nào trong cấu trúc động cơ của Car có thể làm hỏng Driver.

4. Triển Khai Đúng (Theo Luật Demeter)

java Copy
class Engine {
    public void start() { System.out.println("Động cơ đã khởi động"); }
}

class Car {
    private Engine engine = new Engine();
    public void startEngine() { engine.start(); } // Giao diện thân thiện với LoD
}

class Driver {
    public void drive(Car car) {
        car.startEngine(); // ✅ Chỉ giao tiếp với bạn gần gũi
    }
}

Lợi ích:

  • Driver chỉ tương tác với Car, không phải Engine.
  • Car đóng gói động cơ của nó bên trong.
  • Các thay đổi bên trong Engine sẽ không ảnh hưởng đến Driver.

5. Các Mô Hình Thông Dụng Để Áp Dụng Luật Demeter

  1. Đóng gói: Giữ các trường ở chế độ riêng tư và cung cấp các phương thức công khai cho các hành động cần thiết.
  2. Mô Hình Façade: Sử dụng một giao diện cấp cao hơn để tương tác với các hệ thống con phức tạp.
  3. Tránh chuỗi phương thức: Không viết mã như a.getB().getC().doSomething();
  4. Tiêm phụ thuộc: Truyền các đối tượng như tham số cho các phương thức thay vì truy cập các đối tượng lồng nhau trực tiếp.

6. Bảng Tóm Tắt Nguyên Tắc

Nguyên Tắc Mô Tả Lợi Ích
Luật Demeter (LoD) Chỉ gọi các phương thức của bạn bè gần gũi Giảm sự liên kết, tăng tính mô-đun
Vi phạm Truy cập các đối tượng con của các đối tượng con Liên kết chặt chẽ, khó bảo trì

7. Những Điều Cần Nhớ

  • Luật Demeter nhấn mạnh việc giảm thiểu các phụ thuộc không cần thiết giữa các lớp.
  • Thực hiện nó giúp mã của bạn sạch sẽ hơn, mô-đun hơn và dễ bảo trì hơn.
  • Trong LLD, nó đảm bảo các mô-đun tương tác theo một cách có kiểm soát và dự đoán được.
  • Luôn nghĩ: “Tôi đang nói chuyện với bạn bè gần gũi của mình, hay với ai đó mà tôi chỉ mới gặp qua một người bạn khác?”

Kết Luận

Luật Demeter là một nguyên tắc đơn giản nhưng mạnh mẽ. Khi được áp dụng nhất quán, nó ngăn ngừa sự liên kết chặt chẽ, khuyến khích việc đóng gói và dẫn đến các hệ thống vững chắc, dễ bảo trì.

Các Thực Hành Tốt Nhất

  • Sử dụng đóng gói: Giữ các thuộc tính trong các lớp ở chế độ riêng tư và chỉ cung cấp các phương thức cần thiết để truy cập hoặc thao tác trên chúng.
  • Sử dụng mô hình Façade: Tạo các lớp giao diện đơn giản để tương tác với các hệ thống phức tạp, giúp giảm sự phức tạp cho người dùng.
  • Tránh truy cập lồng nhau: Hạn chế việc gọi các phương thức lồng nhau để giảm thiểu sự liên kết.

Các Cạm Bẫy Thường Gặp

  • Quá phụ thuộc vào các lớp khác: Cần chú ý đến việc phụ thuộc vào những đối tượng mà bạn không cần thiết phải biết.
  • Gọi quá nhiều phương thức: Hạn chế việc gọi nhiều phương thức của các đối tượng khác trong một phương thức.

Mẹo Tối Ưu Hiệu Suất

  • Đảm bảo rằng các lớp của bạn có trách nhiệm rõ ràng: Mỗi lớp nên có một vai trò rõ ràng để giảm thiểu sự phức tạp.
  • Kiểm tra thường xuyên: Đảm bảo rằng các lớp vẫn tuân thủ Luật Demeter qua các bài kiểm tra định kỳ.

Các Câu Hỏi Thường Gặp

Q: Luật Demeter có thể áp dụng cho những ngôn ngữ lập trình nào?
A: Luật Demeter có thể áp dụng cho bất kỳ ngôn ngữ lập trình nào hỗ trợ lập trình hướng đối tượng, bao gồm Java, C#, Python, v.v.

Q: Vi phạm Luật Demeter có ảnh hưởng như thế nào đến bảo trì mã?
A: Vi phạm Luật Demeter có thể dẫn đến mã khó bảo trì hơn, vì các thay đổi trong một lớp có thể ảnh hưởng đến nhiều lớp khác.

Q: Có phải tất cả các phương thức đều cần phải tuân theo Luật Demeter không?
A: Không cần thiết; tuy nhiên, càng nhiều phương thức tuân theo Luật Demeter thì mã của bạn sẽ càng dễ bảo trì.

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào