- SRP: Single Responsibility Principle
- OCP: Open-Closed Principle
- LSP: iskov Substitution Principle
- ISP: Interface Segregation Principle
- DIP: Dependency Inversion Principle
소프트웨어 모듈은 변경의 이유가 단 하나여야만 한다.
서로 다른 액터가 의존하는 코드를 분리해야한다.
소프트웨어 개체의 행위는 확장할 수 있어야 하지만, 이때 개체를 변경해서는 안된다.
시스템을 확장하기 쉬운 동시에 변경으로 인해 시스템이 너무 많은 영향을 받지 않도록해야한다.
기존 코드를 수정하기보다는 반드시 새로운 코드를 추가하는 방식으로 시스템의 행위를 변경할 수 있도록 설계해야한다.
컴포넌트 단위로 분리하고, 저수준 컴포넌트로부터 발생한 변경으로부터 고수준 컴포넌트를 보호할 수 있는 형태의 의존성 계층구조가 만들어지도록 해야한다.
하위 타입에 관한 유명한 원칙
하위 타입(subtype) - S 타입의 객체 o1 각각에 대응하는 T 타입 객체 o2가 있고, T 타입을 이용해서 정의한 모든 프로그램 P에서 o2의 자리에 o1을 치환하더라도 P의 행위가 변하지 않는다면, S는 T의 하위 타입이다.
소프트웨어 설계자는 사용하지 않는 것에 의존하지 않아야한다.
소스 코드 의존성이 변동성이 낮은 추상적인 요소에 의존하며 변동성이 큰 구체적인 요소에는 의존하지 않는 시스템이어야한다.
인터페이스를 변경하지 않고도 구현체에 기능을 추가해야한다.
변동성이 큰 구체 클래스를 참조하지 말라.
변동성이 큰 구체 클래스로부터 파생하지 말라.
구체 함수를 오버라이드 하지 말라.
구체적이며 변동성이 크다면 절대로 그 이름을 언급하지 말라.