0

Loose Coupling là gì

Loose Coupling (Liên kết lỏng lẻo) là một nguyên lý thiết kế cốt lõi trong kỹ thuật phần mềm, trong đó các thành phần (modules, classes, services) của một hệ thống được thiết kế để có ít sự phụ thuộc vào nhau nhất có thể.

Khi một hệ thống có tính "loose coupling", hệ thống đó hoạt động dựa trên sự phối hợp của các thành phần độc lập. Nếu một thành phần thay đổi, nó sẽ không (hoặc rất ít) ảnh hưởng đến các thành phần khác.

Để dễ hình dung:

  • Loose Coupling (Liên kết lỏng): Giống như các khối đồ chơi Lego. Bạn có thể dễ dàng rút một mảnh ghép ra và thay bằng một mảnh khác có cùng kích thước khớp nối mà không làm hỏng toàn bộ mô hình.

  • Tight Coupling (Liên kết chặt): Giống như các bộ phận kim loại được hàn chết vào nhau. Nếu bạn muốn thay đổi một chi tiết nhỏ, bạn phải cắt phá vết hàn, có nguy cơ làm gãy hỏng cả cấu trúc xung quanh.

image.png

Tại sao Loose Coupling lại quan trọng?

Thiết kế phần mềm theo hướng liên kết lỏng mang lại 4 lợi thế lớn:

  1. Dễ bảo trì và nâng cấp: Khi bạn sửa lỗi hoặc thêm tính năng mới vào Module A, bạn không phải nơm nớp lo sợ nó sẽ gây lỗi dây chuyền làm sập Module B.

  2. Dễ kiểm thử (Testability): Bạn có thể dễ dàng cô lập từng thành phần để viết Unit Test (kiểm thử đơn vị) bằng cách sử dụng các đối tượng giả (mock objects) thay cho các thành phần mà nó phụ thuộc.

  3. Tính tái sử dụng cao: Một module được thiết kế độc lập, không bị trói buộc với các logic cụ thể của dự án hiện tại, có thể dễ dàng được nhấc sang tái sử dụng ở một dự án khác.

  4. Phát triển song song: Các team lập trình viên có thể làm việc trên các module khác nhau cùng một lúc miễn là họ đã thống nhất trước phương thức giao tiếp (API/Interface) giữa các module.

Các phương pháp phổ biến để đạt được Loose Coupling

Để cắt đứt sự phụ thuộc trực tiếp giữa các đoạn code, các lập trình viên thường sử dụng các kỹ thuật sau:

  • Giao tiếp qua Interfaces (Giao diện): Các class không bao giờ gọi trực tiếp class cụ thể của nhau. Thay vào đó, chúng tương tác thông qua một "bản hợp đồng" (interface). Mọi class tuân thủ hợp đồng đó đều có thể được tráo đổi cho nhau.

  • Dependency Injection (Tiêm phụ thuộc - DI): Thay vì để một class tự tạo ra (khởi tạo bằng từ khóa new) các đối tượng mà nó cần để hoạt động, hệ thống sẽ tự động "bơm" (inject) các đối tượng đó từ bên ngoài vào class.

  • Kiến trúc hướng sự kiện (Event-driven Architecture): Các module không gọi lệnh bắt nhau phải làm gì. Thay vào đó, một module chỉ phát ra một "sự kiện" (ví dụ: UserRegistered). Các module khác nếu quan tâm sẽ tự lắng nghe sự kiện đó và tự thực hiện công việc của mình (ví dụ: gửi email chào mừng) mà module gốc không hề hay biết.


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.