좋은 소프트웨어 설계를 위해서는 결합도(coupling)는 낮추고 응집도(cohesion)는 높여야 한다.
모듈(클래스) 간의 상호 의존 정도를 나타내는 지표로서, 결합도가 낮으면 모듈 간의 상호 의존성이 줄어들어서 객체의 재사용 및 유지보수가 용이하다.
하나의 모듈 내부에 존재하는 구성 요소들의 기능적 관련성으로 응집도가 높은 모듈은 하나의 책임에 집중하고 독립성이 높아져 재사용 및 유지보수가 용이하다.
어떠한 클래스를 변경해야 하는 이유는 한 가지 뿐이어야 한다.
객체가 가진 기능에만 집중할 수 있도록, 응집도를 높이기 위해서 클래스를 분리해야 한다.
자신의 확장에는 열려있고, 변화에 대해서는 닫혀 있어야 한다.
상위 클래스 또는 인터페이스를 중간에 둠으로써, 자신의 변화에 대해서는 폐쇄적이지만 인터페이스는 외부의 변화에 대해서 확장을 개방해 줄 수 있다.
서브 타입은 언제나 자신의 상위 타입으로 교체될 수 있어야 한다.
클라이언트는 자신이 사용하지 않는 메서드와 의존 관계를 맺으면 안 된다.
자전거는 자전거 길 안내만 하고, 자동차는 자동차 길 안내만 할 수 있도록 분리한다.
자신보다 변하기 쉬운 것에 의존하지 않는다.
옷이라는 인터페이스가 들어오면서 사람도, 계절별 옷들도 옷에 의존하는 의존 역전이 일어난다.