좋은 소프트웨어 설계를 위해 결합도(coupling)는 낮추고 응집도(cohesion)는 높여
야 한다.
모듈(클래스)간의 상호 의존 정도를 나타내는 지표이며, 결합도가 낮으면 모듈간의 상호 의존서이 줄어들어 객체의 재사용 및 유지보수 유리
하나의 모듈(클래스) 내부에 존재하는 구성 요소들의 기능적 관련성
응집도가 높은 모듈은 하나의 책임에 집중하고 독립성이 높아 재사용 및 유지보수가 용이
어떠한 클래스를 변경해야 하는 이유는 한가지 뿐 이여야 한다. 즉 하나의 클래스는 하나의 기능 담당하여 하나의 책임을 수행
하도록 설계하는 것
자신의 확장에는 열려 있고, 주변의 변화에 대해서는 닫혀 있어야 한다.
상위 클래스 또는 인터페이스를 중간에 둠으로써, 자신은 변화에 대해서는 폐쇄적이지만, 인터페이스는 외부의 변화에 대해서 확장을 개방해 줄 수 있다.
[확장에 열려있다]
모듈의 확장성을 보장하는 것을 의미
[확장에 열려있다]
객체를 직접 수정하는 것에 대해 제한해야 한다는 의미
서브 타입은 언제나 자신의 기반(상위) 타입으로 교체 할 수 있어야 한다.
다향성의 특징을 이용하기 위해 상위 클래스 타입으로 객체를 선언하여 하위 클래스의 인스턴스를 받으면, 업캐스팅된 상태에서 부모의 메서드를 사용해도 동작이 의도대로
흘러가야 하는 것
클라이언트는 자신이 사용하지 않는 메서드에 의존 관계를 맺으면 안된다.
인터페이스를 사용하는 클라이언트를 기준으로 분리하여, 클라이언트의 목적과 용도에 적합한 인터페이스 만을 제공
하는 것이 목표
프로젝트 요구 사항과 설계에 따라서 SRP(단일책임원칙) / ISP(인터페이스분리원칙)
를 선택한다.
자신보다 변하기 쉬운 것에 의존하지 말 것.
어떤 클래스를 참조해서 사용해야하는 상황이 생긴다면, 그 클래스를 직접 참조하는 것이 아니라 그 대상의 상위 요소(추상 클래스 or 인터페이스)로 참조