SOLID 원칙
좋은 객체지향 설계를 만들기 위한 기본 원칙들
- SRP (단일 책임 원칙: Single Responsibility Principle)
- OCP (개방 폐쇄의 원칙: Open Close Principle)
- LSP (리스코프 치환 원칙: The Liskov Substitution Principle)
- ISP (인터페이스 분리의 원칙: Interface Segregation Principle)
- DIP (의존성 역전의 원칙: Dependency Inversion Principle)
SRP
단일 책임 원칙
- 하나의 클래스가 하나의 기능만 가지고 있도록 설계 - 독립성
- '하나의 변경 이유' 만을 갖도록 설계
- "The Audience"(해당 클래스를 사용하려는 무언가) 찾기
- 가장 기본적이지만 가장 직접 구현하기 어려운 원칙
- '하나의 변경 이유' 만을 갖도록 설계
적용 방법
- Extract Class
- 한 클래스 암에 이의 구조를 변경토록 하는 이유가 둘 이상 존재하는 경우
- ex) 학생 클래스를 성적정보, 재학 정보, 등록금 납입 정보 필드를 갖도록 변경
- Extract Superclass
- 클래스를 나누고 보니 유사한 책임을 나눠 맡고 있는 경우 -> 상속
- 대학생 성적정보, 대학원생 성적정보 클래스 -> 성적 정보 클래스를 상속하도록
- Shotgun Surgery
- 흩어진 메소드 들과 필드를 한 클래스로 합침
- 매우 어려운 방법이고, 최후의 수단임
OCP
개방 폐쇄 원칙
- 확장에 대해 Open
- 변경에 대해 Close
- 코드를 변경하지 않고 확장할 수 있도록 설계한다
- 요구사항 변경 발생: 새 클래스를 만들어 붙이거나 상속 등을 통해 클래스 재사용
- 변경 대상과 불변 대상을 명확히 구분
- 변경대상과 불변 대상 사이에 인터페이스 정의
- 구상 클래스 대신 인터페이스를 통해 코드 작성
- strategy pattern (SRP, OCP를 만족시키는 디자인 패턴)
LSP
리스코프 치환 원칙
- 자식 타입은 부모 타입의 정의를 위반해서는 안된다
- 리스코프 치환: 자식 타입 클래스는 언제나 부모 타입 클래스로 바꿔 끼울 수 있어야 한다
- 가능하다면 언제나 인터페이스를 사용해서 프로그래밍 할 것
Override 주의
- 부모 클래스의 메소드를 override로 재정의할 때, 그 양상이 완전히 달라진다면
- 인터페이스를 이용해야 했거나
- 사실은 부모-자식 사이가 아니었거나
ISP
인터페이스 분리의 원칙
- 자신이 사용하지 않을 인터페이스는 구현하지 말 것
- 응집성과 연관
- 하나의 일반적인 인터페이스 보다는, 여러개의 구체적인 인터페이스가 좋음
- 인터페이스의 단일 책임
- Animal 인터페이스 보다는 Barkable, Walkable, Eatable 인터페이스 권장
적용 방법
- 클래스 상속을 통한 인터페이스 분리
- 상속 대신 위임을 사용
- Facade Pattern
DIP
의존성 역전의 원칙
- 하위(Calle)가 상위(Caller)에 의존해야 함
- 하위 모듈이 상위 모듈의 변경을 요구해서는 안됨
좋은 설계 훈련하기
평소 설계할 때 좋은 설계를 생각하는 훈련을 하지 않으면 절대 늘지 않음
reference
- 상명대학교 한종대교수님 소프트웨어공학 수업
'컴퓨터과학 > 소프트웨어공학' 카테고리의 다른 글
[소프트웨어공학] 형상 관리 - 형상 항목, 형상 식별자, 베이스라인 (0) | 2021.06.03 |
---|---|
[소프트웨어공학] 검증과 확인 - 테스팅(화이트박스/블랙박스/기본경로) (0) | 2021.06.02 |
[소프트웨어공학] 설계 2 - 객체 지향, 클래스 다이어그램, 시퀀스 다이어그램 (0) | 2021.05.17 |
[소프트웨어공학] 설계 1 - 추상화, 모듈화, 정보은닉, 응집력, 결합도 (0) | 2021.05.11 |
[소프트웨어공학] 프로젝트 계획 및 통제 - WBS, PERT, Gantt, EVM (0) | 2021.04.13 |
댓글