A goal to aim for with product design (or system design) what to aim for with each

A good system (software, product, etc) is one that is highly-cohesive, and loosely coupled. This exhibits good Conceptual Integrity, keeps good Separation of Concerns, and minimizes failure points.

Coupling

The extent to which two components depend on each other for successful execution.

Coupling is a thing that happens between system components. Unlike Cohesion, Coupling is inter-component.

Coupling is something that sometimes cannot be avoided, but when it can be avoided, it should be. High levels of coupling reduces a system’s Modularity, or at the very least makes module-level changes more complex due to inter-module dependencies.

Coupling should be managed via well-defined, well-managed, well-though-out, and well-documented interfaces.

In general, low-coupling is good.

Example of High-Coupling

  • Including presentation features inside a data source table

Examples of Low-Coupling

  • A source data table and a table for how a particular view should be formatted

Source

Link to original

Cohesion

The extent to which a component has a single purpose or function. High cohesion is good.

Cohesion

The degree to which different elements inside a module “belong” together.

Cohesion is something that happens inside a system component. Unlike Coupling, cohesion is intra-component.

Sometimes it is hard to determine where to draw the line between adding a feature to an existing system component or adding a new component to the system to encapsulate a feature.

In general, high-cohesion is good.

Example of High-cohesion

Example of Low-cohesion

  • Microsoft Word dumping a ton of features in about mail merge

Source

Link to original

The best system is one that is “loosely-coupled and highly-cohesive”.


Source