GRASP – High Cohesion

Trong OO design, Cohesion là thuật ngữ chỉ độ liên quan của các trách nhiệm của một class đối với class đó. Ví dụ: trách nhiệm của class Car bao gồm:
(a) start engine
(b) run engine
(c) drive
Dễ thấy, trách nhiệm (a)(b) có liên quan cao đến class Car, trong khi (c) có mức độ thấp hơn vì Car không tự lái chính nó mà phải do một đối tượng khác, thường là Driver, tác động vào. Như vậy nếu Car chỉ có (a) (b), ta nói Car có Cohesion cao (high cohesion), ngược lại Car có (c) thì cohesion thấp(low cohesion). Tóm lại, một class được gọi là high cohesion là một class chỉ tập trung làm công việc dành cho nó mà không bao đồng công việc của những class khác.
Việc các class có low cohesion sẽ dẫn đến những vấn đề sau:
– Khó hiểu
– Khó sử dụng lại
– Khó bảo trình
– Dễ bị ảnh hưởng bởi các sự thay đổi
High Cohesion là một pattern nhằm đảm bảo tính cohesion cho cas class trong quá trình gán responsibility cho design.
Các bước áp dụng:
Bước 1: Tìm kiếm các class trong design model có nhiều liên kết với những class khác.
Bước 2: Xác định những method có nhiều phụ thuộc tới những method khác
Bước 3: Gán responsibility sao cho các class giữ được tính high cohesion
Ví dụ: Sử dụng lại tình huống trong ví dụ của Low Coupling, vẫn giữ nguyên cách design ban đầu cho việc thực hiện thanh toán interactive model như sau:
Các responsibility tạo Payement và gắn Payment vào một Sale đều do POS thực hiện. Thực ra, đây không hẳn là một lỗi cohesion nặng, tuy nhiên, thử tưởng tượng nếu bạn có rất nhiều responsibility đều đồng loạt phải thực hiện thông qua POS sẽ làm cho POS cực kỳ cồng kềnh và khó kiểm soát, rơi vào tình trạng quá “phô trương” (bloated incohesive object) vì đảm nhận quá nhiều vai trò. Để tránh việc này, ta có thể đưa trách nhiệm tạo Payment vốn không mấy liên quan nhiều đến vai trò của POS thành trách nhiệm của Sale. Làm như vậy POS sẽ tăng cohesion đồng thời không giảm cohesion của Sale. Đây chính là method cần xác định làm thấp cohesion của POS.
Cuối cùng ta có một model tương đương với model đã được chọn làm giải phấp trong Low Coupling:
*** Các bước áp dụng mình xin bỏ qua vì mình tin các bạn có thể dễ dàng hiểu được thông qua các bài trước.
Ưu điểm:
– Làm cho các class dễ hiểu hơn
– Nâng cấp và bảo trì dễ dàng hơn
– Thông thường, high cohesion sau khi áp dụng cũng hỗ trợ cho tiêu chuẩn Low Coupling.
– Hỗ trợ sử dụng lại code tốt hơn
Lưu ý:
Các bạn cần ghi nhớ rằng Low CouplingHigh Cohesion là hai tiêu chuẩn luôn được cân nhắc trong suốt quá trình design. Nó là những tiêu chuẩn cực kỳ quan trọng để đánh giá tốt xấu của một design.
No Comments

Post A Comment