Tìm hiểu về Loose coupling
Coupling là gì?
Coupling được hiểu là cách kết nối giữa các dịch vụ phần mềm. Các kết nối giữa các dịch vụ trong phần mềm có thể kết nối với nhau một cách ít phụ thuộc hoặc một cách chặt chẽ; thậm chí chúng còn không cần kết nối với nhau. Mỗi phương pháp kết nối này đều có ưu điểm và nhược điểm riêng và phù hợp với từng mục đích sử dụng khác nhau.
Bài viết sẽ chỉ đề cập đến Loose coupling – kết nối ít phụ thuộc và Tight coupling – kết nối chặt chẽ.
Loose coupling là gì?
Loose coupling còn được biết đến với cái tên khác là low coupling. Đây là một mô hình thiết kế khuyến khích bạn nên thực hiện nhiều dịch vụ với những vai trò riêng biệt và hạn chế mức độ phụ thuộc vào nhau trong một chương trình.
Để cả những người đọc phổ thông có thể hiểu về mô hình này, Tino Group sẽ lấy ví dụ đơn giản từ thực tiễn bạn gặp hằng ngày nhé!
Ví dụ như việc mặc trang phục của bạn. Trong tủ quần áo (đặc biệt là của các bạn nữ), sẽ có những bộ trang phục để đi làm, đi chơi, đi ngủ, thậm chí là mặc buổi sáng, buổi chiều,… Những bộ trang phục là những thứ ngoài thân, không có liên kết gì với cơ thể hay làn da của bạn.
Vì thế, bạn có thể thay đổi quần áo tùy thích. Việc bạn thay đổi quần áo thành trắng hay đen sẽ không ảnh hưởng gì đến làn da, cơ thể của bạn.
Liên kết đến việc thiết kế phần mềm, cụ thể là microservice, bạn sẽ thấy điểm tương đồng giữa chúng. Các dịch vụ trong microservice sẽ không phụ thuộc vào nhau quá nhiều. Nếu bạn muốn thay đổi một dịch vụ bên trong, bạn chỉ cần ngắt kết nối và thực hiện thay đổi.
Áo sẽ làm nhiệm vụ của áo, quần sẽ làm nhiệm vụ của quần, mỗi một dịch vụ sẽ có một chức năng cụ thể. Khi thay đổi, bạn chỉ cần cởi bỏ và thay mới, không gây ảnh hưởng gì đến các dịch vụ khác.
Tight coupling là gì?
Ngược lại với Loose coupling, Tight coupling hay high coupling là một nhóm các dịch vụ/ lớp có sự ràng buộc, phụ thuộc vào những dịch vụ/ lớp khác trong chương trình.
Không đề cập đến sự tiến bộ của y học, các yếu tố môi trường và các sản phẩm mỹ phẩm trong ví dụ này, da người hay một bộ phận nào đó trên cơ thể con người đều được liên kết chặt chẽ với nhau và không dễ dàng để thay đổi chúng.
Nếu bạn muốn thay đổi làn da của mình từ trắng sang đen thì sao? Bạn sẽ phải lột bỏ da và gắn một bộ da mới lên cơ thể của mình? Ôi! Chỉ nghĩ đến thôi cũng thấy thật sự khủng khiếp!
Tương tự với sự liên kết của da với cơ, của cơ với xương, tight coupling là một mô hình phần mềm cổ điển được phát triển với sự liên kết chặt chẽ với nhau. Nếu bạn muốn thay đổi, bạn sẽ cần phải thực hiện tái cấu trúc toàn bộ phần mềm. Điều này vừa gây hao tổn một lượng tài nguyên khổng lồ, vừa gây đau nhức, ê ẩm và chưa chắc làn da mới của bạn thực sự ổn đối với cơ thể của bạn.
Kiến thức chi tiết về Loose coupling
Vì sao nên bắt đầu với Loose coupling?
Tương thích với xu hướng phát triển
Nếu bạn thường xuyên theo dõi sự phát triển của công nghệ và quan tâm đến các khái niệm vô cùng phổ biến như: RESTful API, microservices hay containers, tất cả những khái niệm/ xu hướng này đều đi theo mô hình Loose coupling.
RESTful API là một công nghệ cần phải có thể mở rộng, biến đổi tùy theo trường hợp sử dụng, có thể phân chia tỷ lệ và sử dụng nhiều nguồn tài nguyên. Bỏ qua những yếu tố chuyên sâu bên trong, mô hình Loose coupling là mô hình hoàn hảo nhất dành cho RESTful API.
Với các coupling ít phụ thuộc vào nhau, bạn sẽ có thể dễ dàng mở rộng, cải thiện các chức năng và gia tăng tổng thể mà không gây ảnh hưởng đến các dịch vụ khác trong phần mềm.
Tiết kiệm đáng kể nguồn tài nguyên
Giả sử, bạn là một nhà cung cấp dịch vụ vận chuyển. Bạn đã thuê các lập trình viên để viết một phần mềm có thể giúp người dùng đặt đơn hàng và tính toán cho đơn vị đối tác A, sau đó phát triển phần mềm, giao diện riêng lẻ cho đối tác B, C, D, E, F… Điều này sẽ gây hao tổn tài nguyên rất nhiều!
Tuy nhiên, bạn có thể thuê các lập trình viên để phát triển các API và cung cấp API cho các đơn vị đối tác để họ “nhúng” vào website, hệ thống của họ và giúp khách hàng của họ có thể nhìn thấy được giá 1 đơn hàng là bao nhiêu, hay ước tính bao nhiêu thời gian sẽ gửi đến,… Điều này sẽ giúp bạn tiết kiệm tài nguyên và tập trung vào xây dựng dịch vụ.
Bạn có thể tham khảo các API của các đơn vị vận chuyển, ví điện tử lớn trong nước để hiểu hơn nhé!
Hạn chế sự ảnh hưởng, lấn chiếm tài nguyên
Một trong những ưu điểm lớn nhất của mô hình Loose coupling đó chính là sự hạn chế phụ thuộc giữa các dịch vụ, các lớp trong một ứng dụng với nhau.
Khi bạn muốn thêm một dịch vụ, bạn chỉ cần tạo các liên kết giữa dịch vụ mới với dịch vụ cũ.
Trong trường hợp một dịch vụ nào đó bị tấn công hay bị lỗi, việc debug tìm lỗi sẽ trở nên dễ hơn. Lý do là vì nhờ dấu hiệu lỗi rõ ràng hơn, bạn sẽ nhanh chóng tìm đúng dịch vụ/ lớp đó = cách ly và sửa chữa chúng. Nếu dịch vụ bị lỗi do hacker tấn công, hacker cũng rất khó để có thể tấn công các module dịch vụ khác vì chúng độc lập và có ít liên kết với nhau.
Ngoài ra, các dịch vụ/ các lớp có thể hoạt động độc lập với nhau, không tranh giành những nguồn tài nguyên của nhau trong lúc hoạt động.
Tuy nhiên, điểm này cũng sẽ khiến việc phát triển phần mềm cả bạn gặp không ít khó khăn như:
- Phải phát triển tách biệt từng module dịch vụ
- Nếu là một chương trình nhỏ triển khai theo mô hình microservice sẽ hao tốn rất nhiều tài nguyên.
- Mỗi dịch vụ sẽ cần phải được thiết kế hệ thống bảo mật riêng.
Cách triển khai Loose coupling
Tại trang C# Corner có một ví dụ rất hay và thực tế, Tino Group sẽ sao chép để làm ví dụ cho bạn hiểu về cách triển khai Loose coupling nhé!
Trước tiên, chúng ta sẽ phát triển một Tight coupling cho một chiếc điều khiển từ xa bằng ngôn ngữ C# như sau:
namespaceTightCoupling{public class Remote{private Television Tv { get; set;}protected Remote(){Tv = new Television();}static Remote(){_remoteController = new Remote();}static Remote _remoteController;public static Remote Control{get{return _remoteController;}}public void RunTv(){Tv.Start();}}}
Trong đó, chúng ta thấy rằng, lợi ích dễ thấy nhất là mô hình này đơn giản, ít mã và dễ thực hiện. Tuy nhiên, nếu nhà sản xuất muốn tích hợp chiếc điều khiển này không chỉ cho chiếc TV nữa mà sử dụng để điều khiển nhiều thứ khác thì sao?
Lúc này, Loose coupling sẽ là mô hình phát huy sức mạnh. Bạn có thể tạo ra đoạn mã cho chiếc điều khiển như sau:
public interface IRemote{void Run();}public class Television : IRemote{protected Television(){}static Television(){_television = new Television();}private static Television _television;public static Television Instance{get{return _television;}}public void Run(){Console.WriteLine("Television is started!");}}public class Remote{IRemote _remote;public Remote(IRemote remote){_remote = remote;}public void Run(){_remote.Run();}}
Khi muốn điều khiển TV, bạn chỉ cần phát triển riêng thêm 1 module cho việc điều khiển TV như sau:
class Program{static void Main(string[] args){Remote remote = new Remote(Television.Instance);remote.Run();Console.Read();}}
Khi nhìn vào ví dụ, bạn sẽ thấy mô hình Loose coupling phức tạp hơn Tight coupling rất nhiều. Tuy nhiên, khi muốn, bạn có thể mở rộng chức năng của chiếc điều khiển lên một tầm cao mới.
Bạn chỉ cần phát triển những module nền và không cần phải thiết kế lại chiếc điều khiến của bạn. Điều này sẽ giúp bạn không cần phải thiết kế nhiều chiếc điều khiển khác nhau, bạn có thể sử dụng chiếc điều khiển TV của mình để bật điều hoà, làm chìa khóa xe hay bất cứ chức năng nào bạn mong muốn.
Đến đây, Tino Group hi vọng rằng bạn đã hiểu hơn về mô hình Loose coupling. Trong thực tế, để triển khai được mô hình này bạn hao tốn nhiều tài nguyên hơn rất nhiều. Tuy nhiên, Loose coupling vẫn là một mô hình rất đáng được quan tâm. Nếu trong bài viết có những sai sót,