1. 단일 책임 원칙 SRP (Single Responsibility Principe)
- 작성된 클래스는 하나의 책임만 가진다.
- 클래스가 제공하는 모든 서비스는 그 하나의 책임(변화의 축: axis of change)을 수행하는데 집중되어 있어야한다는 원칙
- 책임 영역이 확실해지므로, 하나의 책임 변경에서 다른 책임의 변경으로의 연쇄작용에서 자유로워짐.
- 책임을 적절히 분배하여 코드 가독성 향상, 유지보수 용이
2. 개방 폐쇄 원칙 OCP (Open Close Principle)
- 소프트웨어의 구성 요소(컴포넌트 / 클래스 / 모듈 / 함수)는 확장에는 열려있고, 변경에는 닫혀있어야한다는 것
- 변경을 위한 비용은 가능한 줄이고, 확장을 위한 비용은 가능한 극대화 해야한다는 의미.
- 요구사항의 변경이나 추가가 발생해도, 기존 구성요소는 수정이 일어나지 말아야하며, 기존 구성요소를 쉽게 확장해서 재사용 할 수 있어야한다는 뜻.
3. 리스코브 치환의 원칙 LSP (The Liskov Subsitution Principle)
- 서브타입은 언제나 기반 타입으로 교체할 수 있어야한다.
- 서브타입은 언제나 기반타입과 호환되어야한다.
- 즉, 서브 타입은 언제나 기반 타입이 약속한 규약을 지켜야한다.
- 상속은 다형성을 통한 확장성 획득을 목표로한다.
4. 인터페이스 분리의 원칙 ISP (Interface Segration Principle)
- 한 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야한다는 원리
- 즉, 어떤 클래스가 다른 클래스에 종속 될때 가능한 최소한의 인터페이스만을 사용해야한다.
- '하나의 일반적인 인터페이스 보다는, 여러개의 구체적인 인터페이스가 낫다'
- 예시로 생각해보면 타입스크립트 인터페이스 설계 시, 아래와 같이 옵셔널 타입을 추가하여 여러 곳에서 일반적으로 사용가능한 인터페이스를 만드는 것 보다는 구체적인 여러개의 인터페이스로 나누는게 좋다는 것.
interface Some {
name:string;
age:string;
gender?:string;
address?:string;
}
5. 의존성 역전의 원칙 DIP (Dependency Inversion Principle)
- 하위 레벨의 모듈의 변경이 상위 레벨 모듈의 변경을 요구하는 위계관계를 끊는 의미의 역전.
- 추상화에 의존할 것. 구체화에 의존하지 말고
- 고수준 모듈(inteface, 추상클래스) 은 저수준 모듈(클래스, 객체)의 구현에 의존해서는 안된다.
- 대신 저수준 모듈이 고수준 모듈에서 정의한 추상 타입에 의존해야한다.