- 좋은 설계의 조건
- 사용자의 비기능 요구사항(품질)을 달성할 수 있는 설계
- 변경 용이성이 높은 설계
- 설계 원칙
- 변경되는 것과 변경되지 않는 것을 구별하자
- 변경이 쉽다 = 변경이 되어도 다른 클래스 및 모듈에 영향이 없다.
- 의존성 끊는 법
- B 가 변경되면 A가 변경되는 모습 (A->B) 일 때, A -> B' (추상 클래스) <- B 로 변경하여 의존성 낮춤
- SDP (Stable Dependency Principle) : 안정된 의존성 원칙
- 불안정한 컴포넌트가 상단에 위치하고, 상대적으로 안정된 컴포넌트로 의존하기
- 다른 컴포넌트에 의존하지 않을수록 안정되어 있다.
- 불안정성 (I) = Fan-out / (Fan-in + Fan-out)
- Fan-in : 다른 컴포넌트가 나에게 의존
- SAP (Stable Abstractions Principle) : 안정된 추상화 원칙
- 안정된 컴포넌트는 추상화된 상태여야하고, 안정성이 확장성을 방해해선 안됨
- I 는 불안정성, A 는 추상화 정도라고 할 때,
- A = -I 의 상관 관계가 적절함 (주계열)
- I = 0, A = 0 --> 안정한데, 추상화가 안되어 있다. --> 안정적이므로 변경이 어렵고, 추상적이지 않으므로 확장성이 낮다.
- I = 1, A = 1 --> 불안정한데, 추상화가 잘되어 있다. --> 의존적인데 추상화되어 있으므로 의미없는 컴포넌트
- ADP (Acyclic Dependencies Principle) : 의존성 비순환 원칙
- 컴포넌트 의존성 그래프에 cycle 형태가 있으면 X
- 결국 서로가 서로를 의존하는 형태가 되므로 변경을 하면 전부 영향을 받음
- DIP 및 인터페이스 구성을 통해 새로운 의존성 그래프를 구성
- 컴포넌트 의존성 그래프에 cycle 형태가 있으면 X
- top-down 설계 불가
- 컴포넌트는 하향식으로 구성될 수 없으며, 클래스가 먼저 설계되어야만 컴포넌트 간의 의존성 구조 고려 가능
- 변경되는 것과 변경되지 않는 것을 구별하자
- SOLID 원칙
- SRP (Single responsibility principle)
- 하나의 클래스는 하나의 책임만 가져야 한다. 단일 책임 원칙
- 하나의 모듈은 하나의 역할만 해야한다
- Automobile 클래스의 경우, go(), stop() 함수는 SRP 를 준수하나, drive() 함수는 운전자의 역할에 대한 함수이므로 SRP 를 위반함
- Cohesion (응집력) 을 높이고, 다른 클래스와의 커플링을 낮춤
- OCP (Open Closed Principle)
- 클래스는 확장에 열려있고, 수정에는 닫혀있어야 한다.
- 수정에 닫혀 있다 = 클래스의 코드를 수정하지 못하게 한다
- 확장에 열려 있다 = 클래스의 기능을 override 를 통해 확장할 수 있다
- 꼭 상속의 문제는 아닌 유연성에 대한 원칙
- 클래스는 확장에 열려있고, 수정에는 닫혀있어야 한다.
- LSP (Liskov Substitution Principle)
- 하위 Type 은 상위 Type 으로 교체가 가능해야 한다
- 하위 클래스는 상위 클래스의 행위(기능)을 포함하고 있어야 한다
- ISP (Interface Segregation Principle)
- 인터페이스는 단일 인터페이스보다 Client 별 세분화된 인터페이스 구조가 더 권장됨
- Client 클래스는 사용하지 않는 인터페이스에 의존적이지 않아야 함
- DIP (Dependency Inversion Principle)
- 제어흐름은 추상적인 쪽에서 상세한 쪽으로, 의존성은 반대가 되도록 역전(inversion) 시켜야 한다
- 대표적으로 추상클래스를 중간에 두어 DIP 를 실현 시킬 수 있음
- SRP (Single responsibility principle)
반응형
'소프트웨어공학' 카테고리의 다른 글
[소프트웨어 프로젝트 관리] 변경 관리 (0) | 2022.11.01 |
---|---|
[소프트웨어 프로젝트 관리] 프로젝트 단계 (0) | 2022.10.30 |
[소프트웨어 프로젝트 관리] 프로젝트 가시성 (0) | 2022.10.30 |
[소프트웨어 프로젝트 관리] 소프트웨어 프로젝트 (1) | 2022.10.30 |
[요구사항분석론] Requirement Engineering (요구공학) (0) | 2022.04.20 |