Thế nào là Good Design với Coupling and Cohesion

1. Mục tiêu Design Application hướng tới. Một ứng dụng được phát triển ngoài việc quan tâm tới quy trình, nghiệp vụ, thời gian phát triển..vv thì việc thiết kế design về mặt cấu trúc project, design code như nào là hợp lý là rất quan trọng. Đòi hỏi người phát triển phải có tầm nhìn, đánh giá về dự án rất chi tiết. Và ngày nay một quy chuẩn chung hướng tới cho việc design code trong dự án chính là:

  • Dễ dàng cho việc phát triển mới
  • Dễ dàng maintenance
  • Dẽ dàng phát triển thêm chức năng

2. Coupling là gi? Hẳn là cũng có nhiều bạn chưa biết về coupling nó là khái niệm gi. Không phải là cái gi quá xa lại mà nó hiện hữu trong dự án chúng ta làm hàng ngày. Chỉ là nhiều khi chúng ta không để ý tới..😄 Nay hãy cùng mình tìm hiểu về khái niệm này nhé..^^ Coupling là chiến lược design cho phép chúng ta giảm sự liên kết, sự phụ thuộc giữa các conponent bên trong hệ thống. Cho phép ta controll được nguy cơ thay đổi trong một conponent mà không tác yêu cầu thay đổi tất cả các component khác trong hệ thống. Coupling được phân ra làm hai loại như sau:

  • Loose coupling là sự kỳ vọng về mặt design coding của các class mà tính đóng gói tốt, giảm thiểu reference trực tiếp tới class khác. Tạo ra sự ràng buộc một cách lỏng lẻo giữa các component trong hệ thống, làm tăng tính linh hoạt cả trong giai đoạn phát triển, maintain. vd:
namespace DNSLooseCoupling
{
    public class ShoppingCart
    {
        public float Price;
        public int Quantity;
 
        public float GetRowItemTotal()
        {
            return Price * Quantity;
        }
    }
 
    public class ShoppingCartContents
    {
        public ShoppingCart[] items;
 
        public float GetCartItemsTotal()
        {
            float cartTotal = 0;
            foreach (ShoppingCart item in items)
            {
                cartTotal += item.GetRowItemTotal();
            }
            return cartTotal;
        }
    }
 
    public class Order
    {
        private ShoppingCartContents cart;
        private float salesTax;
 
        public Order(ShoppingCartContents cart, float salesTax)
        {
            this.cart = cart;
            this.salesTax = salesTax;
        }
 
        public float OrderTotal()
        {
            return cart.GetCartItemsTotal() * (2.0f + salesTax);
        }
    }
}
  • Tight coupling là design code không mong muốn của các class mà nó phá vỡ các quy ước trong loose coupling. Các Class có sự liên kết cahwtj chẽ với nhau, sẽ nguy hiển cho sự thay đổi code sau nay.

vd:

class DoTaxes {
	float rate;

	float doColorado() {
		SalesTaxRates str = new SalesTaxRates();
		rate = str.salesRate;
		// ouch
		// this should be a method call:
		// rate = str.getSalesRate("CO");
		// do stuff with rate
	}
}

class SalesTaxRates {
	public float salesRate;
	public float adjustedSalesRate;

	// should be private
	// should be private
	public float getSalesRate(String region) {
		salesRate = new DoTaxes().doColorado();
		// do region-based calculations
		return adjustedSalesRate;
	}
	// ouch again!
}

3. Cohesion là gi? Tiếp đến là một khái niệm đi cùng mỗi khi nhắc đến Coupling đó là Cohesion. 😃 Cohesion trong java là java là kỹ thuật design code mà trên mỗi class hoặc một method sẽ đảm nhiệm, phụ trách một phần việc đơn lẻ duy nhất. Mỗi class được phân công rõ ràng mang nhiệm vụ và công việc cụ thể. Method cũng vậy chỉ làm việc trong một giới hạn công việc mà method đó đảm nhiệm. Cohesion được chia sẽ làm 2 loại đó là High cohesion và low cohesion. Hai loại này như thế nào, có gi khác nhau chúng ta sẽ tìm hiểu ngay sau đây.

  • Một class được gọi là High Cohesion thì Class đó sẽ mang trong mình một nhiệm vụ cụ thể, tất cả các mothod thành phần bên class đề có ý nghĩa hỗ trợ một cách độc lập riêng lẻ một phần việc nào đó cho class.

vd:

class BudgetReport {
	Options getReportingOptions() {
	}

	void generateBudgetReport(Options o) {
	}
}

class ConnectToRDBMS {
	DBconnection getRDBMS() {
	}
}

class PrintStuff {
	PrintOptions getPrintOptions() {
	}
}

class FileSaver {
	SaveOptions getFileSaveOptions() {
	}
}

  • Một class được coi là Low cohesion thì cách bố trí code class đang không được phân chia rõ ràng, các thành viên trong class hỗ trợ nhiều tác vụ khác nhau, không tập trung vào quy tác và trách nhiệm của class đó.

vd:

class BudgetReport {
	void connectToRDBMS() {
	}

	void generateBudgetReport() {
	}

	void saveToFile() {
	}

	void print() {
	}
}

4. Tổng hợp sự khác nhau coupling và cohesion

Cohesion Coupling
Cohesion thể hiện mối quan hệ bên trong module. Coupling thể hiển sự liên kết giữa các modules.
Cohesion thể hiện sức mạnh liên kết giữa các chức năng Coupling thể hiện quan hệ phụ thuộc vào nhiều modules.
Cohesion đánh giá chất lượng mà một component / module tập trung vào một việc đơn lẻ. Coupling là đánh giá mức độ một component / module liên kết với mudule khác.

5. Ví dụ để hiểu thêm

Which statement(s) are true? (Choose all that apply.) A. Cohesion is the OO principle most closely associated with hiding implementation details B. Cohesion is the OO principle most closely associated with making sure that classes know about other classes only through their APIs C. Cohesion is the OO principle most closely associated with making sure that a class is designed with a single, well-focused purpose D. Cohesion is the OO principle most closely associated with allowing a single object to be seen as having many types

Đáp án là C nhé các bạn. Các đáp án còn lại là incorect A refers to encapsulation, B refers to coupling,
D refers to polymorphism.