출처 : haero_kim님 글
: 소프트웨어 작업에서 프로그래머가 소스 코드가 읽기 쉽고 확장하기 쉽게 될 때까지 소프트웨어 소스 코드를 리팩토링하여 코드 냄새를 제거하기 위해 적용될 수 있는 지침
- SRP(Single Responsivility Principle) 단일 책임 원칙
- OCP(Open Closed Principle) 개방, 폐쇄 원칙
- LSP(Liskov Substitution Principle) 리스코프 치환 원칙
- ISP(Interface Segregation Principle) 인터페이스 분리 원칙
- DIP(Dependency Inversion Principle) 의존관계 역전 원칙
책임이 뭔데??
SRP에서 이야기하는 책임은 '기능'이라 생각하자
만약 한 클래스가 수행할 수 있는 기능이 여러 개면, 클래스 내부 함수끼리의 결합도가 높아질 가능성 큼객체지향의 설계의 핵심 : 응집도는 높고 결합도는 낮게
결합도가 높아져버리면 새로운 요구사항이나 프로그램 변경에 의해 클래스 내부의 동작들이 연쇄적으로 변경되어야 할 수도 있고 이는 유지보수에 굉장히 비효율적 > 책임을 잘게 쪼개 분리하자
어떤 모듈의 기능을 하나 수정할 때, 그 모듈을 이용하는 다른 모듈들을 다 고쳐야 한다면 유지보수가 굉장히 복잡
따라서 개방-폐쇄 원칙을 잘 적용하여 기존 코드를 변경하지 않아도 기능을 새롭게 만들거나 변경할 수 있도록 해야함
그렇지 않으면 객체지향 프로그래밍의 가장 큰 장점인 유연성, 재사용성, 유지보수성 등을 모두 잃어버리는 셈이고, OPP를 사용하는 의미가 사라짐
OCP는 추상화 (인퍼페이스)와 상속 (다형성) 등을 통해 구현해낼 수 있음
자주 변화하는 부분을 추상화함으로써 기존 코드를 수정하지 않고도 기능을 확장할 수 있도록 함으로써 유연함을 높이는 것이 핵심!
즉, 리스코프 치환 원칙을 위배하면 개방-폐쇄 원칙도 위배하는 것
각 클라이언트가 필요로 하는 인터페이스들을 분리함으로써, 클라이언트가 사용하지 않는 인터페이스에 변경이 발생하더라도 영향을 받지 않도록 만들어야 하는 것이 핵심
구체화 된 클래스에 의존하기 보다는 추상 클래스나 인터페이스에 의존해야 한다는 뜻
SRP와 ISP는 객체가 커지는 것을 막음
LSP와 DIP는 OCP를 서포트
OCP는 (자주 변화하는 부분을 추상화)하고 (다형성)을 이용해 기능 확장에는 용이하고 기존 코드 변화에는 보수적이도록 만들어줌
여기서 (자주 변화하는 부분을 추상화) 할 수 있도록 도와주는 것이 DIP
(다형성) 구현을 돕는게 LSP