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
Related
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
- A hammer - the Perfect Tool
Example of Low-cohesion
- Microsoft Word dumping a ton of features in about mail merge
Source
Related
Link to original
The best system is one that is “loosely-coupled and highly-cohesive”.