They may sound like opposing principles, but low coupling and high cohesion work together to ensure the maintainability, scalability, and testability of our applications. High cohesion strives to keep a close relation between units that need to know about each other. When it’s time to extend code, we benefit from finding related code in the same places. On the other hand, low coupling strives to reduce dependencies between unrelated units.
If we don’t follow this best practice, we risk trending toward high coupling and low cohesion. This results in excessive dependencies, which has several negative impacts. One undesirable result is an increased vulnerability to bugs, as a bug in one unit will affect its dependent units as well.