* DIP (Dependency Inversion Principle; 의존성 역전 원칙)
> High-level modules should not depend on low-level modules. Both should depend on abstractions.
(고수준 모듈은 저수준 모듈을 의존해서는 안 된다. 둘다 추상 클래스에 의존해야 한다. 추상클래스는 구체 클래스에 의존해서는 안 된다. 구체 클래스는 추상 클래스에 의존해야 한다)
------------------클린 아키텍처 ------------------
> 고수준 정책을 구현하는 코드는 저수준 세부사항을 구현하는 코드에 절대로 의존해서는 안 된다. 대신 세부사항이 정책에 의존해야 한다
> '유연성이 극대화된 시스템' 이란 소스코드 의존성이 abstraction 에 의존하며 concretion 에는 의존하지 않는 시스템이다
> 자바 같은 정적 타입 언어에서는 use, import, include 구문은 오직 인터페이스나 추상클래스 같은 추상적인 선언만을 참조해야 한다는 뜻이다
하지만, String 클래스, OS, Platform 같이 안정성이 보장된 환경에 대해서는 무시한다. 이것들은 변덕스러운 변경이 자주 발생하지 않기 때문에 용납할 수 있기 때문이다. 의존하지 않도록 피하고자 하는 것은 변동성이 큰 구체적인 요소이다.
* 안정된 추상화
> 추상 인터페이스에 변경이 생기면 이를 구체화한 구현체들도 따라서 수정해야 한다. 반대로 구현체에 변경이 생기더라도 그 구현체가 구현하는 인터페이스는 항상, 좀 더 정확히 말하면 대다수의 경우 변경될 필요가 없다. 따라서 인터페이스는 구현체보다 변동성이 낮다
> 즉, 안정된 소프트웨어 아키텍처란 변동성이 큰 구현체에 의존하는 일은 지양하고, 안정된 추상 인터페이스를 선호하는 아키텍처라는 뜻이다
: 변동성이 큰 구체 클래스를 참조하지 말라
- 대신 추상 인터페이스를 참조하라
: 변동성이 큰 구체 클래스로부터 파생하지 말라
- 정적 타입 언어에서 상속은 소스코드에 존재하는 모든 관계 중에서 가장 강력한 동시에 뻣뻣해서 변경하기 어렵다. 따라서 상속은 아주 신중하게 사용해야 한다.
: 구체 함수를 오버라이드 하지 말라
- 대체로 구체 함수는 소스 코드 의존성을 필요로 한다. 따라서 구체 함수를 오버라이드 하면 이러한 의존성을 제거할 수 없게 되며, 실제로는그 의존성을 상속하게 된다.
: 구체적이며 변동성이 크다면 절대로 그 이름을 언급하지 말라
* Dependency Inversion (의존성 역전)
> 소스 코드 의존성은 제어흐름과는 반대 방향으로 역전된다
'SW 공학 > 아키텍처 & 디자인' 카테고리의 다른 글
///Conway's Law (0) | 2020.10.03 |
---|---|
///SOLID Principle (0) | 2020.10.03 |
/////ISP (Interface Segregation Principle) (0) | 2020.09.26 |
/////LSP (Liskov Substitution Principle) (0) | 2020.09.26 |
/////OCP (Open-Closed Principle) (0) | 2020.09.26 |