하나의 객체는 하나의 책임을 가진다
하나의 객체는 하나의 이유만으로 변경되어야 한다. C.A에서는 하나의 객체는 하나의 액터에 대해서만 책임져야 한다. (시스템이 동일한 방식으로 변경되길 원하는 사용자 집단)
확장에는 열려있어야하고, 변경에는 닫혀있어야 한다. 변경에 대한 비용은 줄이고, 확장은 늘인다 요구사항의 변경이나 추가사항이 발생하더라도, 변경은 거의 하지 않고 확장해서 재사용할 수 있어야 함 → 추상화, 다형성에 의해 가능
서브타입은 항상 기반 타입으로 교체 될 수 있어야한다, 호환될 수 있어야한다. 즉, 기반 타입의 규약을 전부 지켜야 한다.
→ 공변성, 반공변성 등의 개념이 중요하다
https://velog.io/@lsb156/covariance-contravariance
자신이 사용하지 않는 인터페이스는 구현하지 않아야함. 어떤 클래스가 다른 클래스에 종속될 때는 최소한의 인터페이스만을 사용해야함. 객체지향 개발 5대 원리: SOLID
컴포넌트간의 커뮤니케이션 관계를 단순화, IOC, 훅 메소드, 확장성 -> 이 세가지 요소를 조합해 복잡한 컴포넌트 관계 단순화, 커뮤니케이션 효율 높임 변하기 쉽지 않은 것에 의존하라