GRASP – Low Coupling

Coupling là thuật ngữ dùng để chỉ độ mạnh của một class được kết nối đến, có hiểu biết về, hoặc dựa trên class khác. Một class có couling thấp (low coupling) nghĩa là class ấy không phụ thuộc quá nhiều lên những class khác; “quá nhiều” ở đây còn phụ thuộc và hoàn cảnh xem xét đến.
Một class được xem là có coupling cao bị phụ thuộc đến nhiều class sẽ bị ảnh hưởng bởi những tình huống không thuận lợi như sau:
– Dễ bị ảnh hưởng khi những class phụ thuộc thay đổi
– Khó hiểu khi chỉ đứng một mình
– Khó sử dụng lại
Thông thường, các dạng phụ thuộc giữa class X và class Y bao gồm:
– X có một property (hay attribute hay data member) có kiểu là Y hoặc là các subclass kế thừa Y.
– X có một method trả về kiểu Y hoặc có tham số truyền vào kiểu Y
– X là một kiểu trực tiếp hay gián tiếp thừa kế từ Y
– Y là một interface mà X cài đặt
Low Coupling pattern là nguyên tắc duy trì coupling thấp, để tận dụng các lợi thế ít thay đổi và sử dụng lại cao, khi gán responsibility cho các class. Để làm được điều này, cần cố gắng tránh việc một class phải hiểu biết quá nhiều class khác. Đây cũng là pattern tiêu chuẩn để đánh giá tốt xấu của một thiết kế (evaluative).
Phương pháp áp dụng:
Bước 1: Tìm kiếm các class có nhiều liên kết với những class khác
Bước 2: Lựa chọn những method bị phụ thuộc nhiều method khác
Bước 3: Sử lại design bằng cách chỉnh lại responsibility cho các class khác nhằm làm giảm liên kết và phụ thuộc cho class hiện tại
Ví dụ:
Để tạo thanh toán cho một giao dịch, máy POS (Point Of Sale) phải thực hiện 2 công đoạn: (method MakePayment())
– Thực hiện kết nối và chuyển khoản với ngân hàng rồi lưu vào hệ thống => tạo một instance của class Payment
– Gán thanh toán vừa thực hiện vào giao dịch để xác nhận giao dịch đã được thanh toán. => gắn instance của payment vừa tạo vào Sale.
Vì POS lưu trữ các thanh toán, do đó, theo như Creator pattern, ta xem POS là creator của Payment để tạo ra một instance p. Sau đó POS sẽ tiếp tục thực hiện method AttachPayment(p) để gắn payment p vào Sale.
Các bước trên interaction diagram được thể hiện như sau:
Như vậy, đối với việc gán responsibility như trên, lớp POS có coupling cao vì nó liên kết với cả Payment và Sale. Để làm giảm bớt coupling, ta cần chỉnh sửa lại việc gán responsibility theo cách khác.
Bước 1: Lớp POS được chọn để hiệu chỉnh
Bước 2: Xác định ván đề ở method MakePayement
Bước 3: Phát biểu lại responsibility theo cách khác giảm coupling bằng cách:
+ Đầu tiên Sale instance cần được thanh toán sẽ được gán yêu cầu tạo thanh toán (chuyển yêu cầu tạo thanh toán của POS sang Sale)
+ Sau đó, Sale instance sẽ tạo thanh toán p rồi gắn vào chính nó
Qua đó, Mô hình nguyên thủy sau khi được chỉnh sửa theo cách gán responsibility mới đã trở thành:
Ưu điểm:
– Giảm sự ảnh hưởng bởi những thay đổi
– Low coupling class dễ hiểu hơn
– Dễ sử dụng lại code
No Comments

Post A Comment