- SOLID 원칙이란?
Robert Martin이 주창한 다섯가지 객체 설계 원칙을 지칭한다.
"Uncle Bob"이라고 불리고, 베스트셀러 '클린코드' 저자이기도 하다
- SRP(Single Responsiblity Principle, 단일 책임 원칙)
모든 클래스는 단 하나의 책임만을 가지도록 설계해야한다
SRP는 미래의 예측하지 못한 새로운 요구사항이나 변경에 대해서 가능한 영향을 받는 부분을 줄이는 것이다
SRP 관련 UML
문제
- OCP(Open-Closed Principle, 개방-폐쇄 원칙)
기존의 코드를 변경하지 않으면서 새로운 기능을 추가할 수 있도록 설계하는 원칙이다.
OCP는 단위테스트에서 중요한 역할을 한다
OCP 관련 UML
- LSP(Liskov Substitution Principle, 리스코프 치환 원칙)
일반화 관계는 상위 클래스(수퍼 클래스)가 제공하는 오퍼레이션과 하위 클래스(파생 클래스)에서 제공하는 오퍼레이션 간에는 행위적으로 일관성이 있어야한다는 원칙이다
음식(수퍼 클래스)에 관한 서적에서 음식 대신 음식의 한 종류인 피자(파생 클래스)로 대체해도 서적의 의미는 바뀌지 않는다고 생각하면 편하다 LSP 관련 UML
문제
수퍼 클래스 오퍼레이션의 선조건을 PRE_SUPER, 후조건을 POST_SUPER 라고 하자파생 클래스 오퍼레이션의 선조건을 PRE_SUB, 후조건을 POST_SUB 라고 하자 만약에 수퍼 클래스와 파생 클래스 간에 재정의된 오퍼레이션이 없다면 LSP를 만족하는가?
수퍼 클래스의 메소드를 재정의하지 않는 것
- ISP(Interface Segregation Principle, 인터페이스 분리 원칙)
ISP는 클라이언트가 자신이 이용하지 않는 기능(메소드)에 영향받지 않아야 한다는 원칙이다.
클라이언트 관점에서 바라보는 객체지향 설계 원칙이다.
자신이 이용하지 않는 메소드에 의존하면 안 된다!
ISP를 따라 클래스를 설계할 때, 클래스는 자신이 사용하지 않는 인터페이스는 구현하지 말아야한다
- DIP(Dependency Inversion Principle, 의존성 역전 법칙)
의존 관계를 맺을 때, 변화하기 쉬운 것 보다 변화가 거의 없는 것에 의존하라는 원칙
구체적인 클래스는 추상 클래스나 인터페이스에 의존하고, 그 반대는 안 되는 설계
DIP 설계는 의존성 주입(Dependency Injection)의 기반이 된다 (Spring 생각이 난다면 쉽다)
학생(대상 객체)에게 과제 양식(외부 협력 객체)을 주면 과제에 대한 학생의 답은 변하지 않지만 과제 제출에 대한 규칙을 바꾼 것(외부에서 대상 객체의 의존 객체를 바꿀 수 있다).DIP 관련 UML
- 참조
- 오픈소스 소프트웨어로 실습하는 소프트웨어공학, 정인상, 생능출판사, 2017