티스토리 뷰

Old

클린 코더스 강의 12. SOLID Foundation

Voyager Woo 2014. 8. 12. 20:26
반응형

클린 코더스 강의 12. SOLID Foundation 정리



1. The Source Code is the Design

소스 코드가 디자인이다. 

질문 : 엔지니어가 생산하는 것은 무엇인가?

대답 : 엔지니어는 프로덕트를 만들기 위한 문서를 만든다.(Engineers produce documents.)


질문 : 소프트웨어 공학의 결과물은 무엇인가?

대답 : 소스코드이다.

소스코드는 프로덕트를 만들기 위한 문서(documents)이며 소스 코드를 빌드해서 실행하는 바이너리 코드가 프로덕트이다. -> 즉 소스 코드는 설계(Design)이다.


기존의 산업(건물, 회로, 기계 등)에서는 설계 비용이 저렴하며 설계 이후 생산 중에는 수정이 거의 불가능하다. ex) 건물이 지어지고 나서 건물의 외관을 바꾸기 굉장히 어렵다.

그러나 소프트웨어는 구축비용(컴파일, 빌드)이 굉장히 저렴하다. 그러나 설계 비용, 즉 소스 코드를 작성하는 일은 구축 비용에 비교해 비싼 비용이 요구된다.


2. Design Smells

테스트 코드 작성이 어렵다는 것은 냄새나는 코드라는 증거

- Rigidity

정의 : 시스템의 의존성으로 인해 변경하기 어려워지는 것

원인 : 많은 시간이 소요되는 테스트와 빌드, 전체 리빌드를 유발하는 아주 작은 변화

해결 : 테스트와 리빌드 시간을 줄이면, Rigidity가 줄어들고 수정이 용이해짐


- Fragility (잘 깨짐)

정의 : 한 모듈의 수정이 다른 모듈에 영향이 미칠 때

ex) 라디오 버튼을 수정하는데 자동차문이 영향을 받는 경우 

해결 : 모듈간의 의존성 제거


- Immobility

정의 : 모듈이 쉽게 추출되지 않고 재사용 되지 않는 경우

ex) 로그인 모듈이 특정 DB의 schema를 사용하고, 특정 UI Skin을 사용하는 경우, 이 모듈은 다른 시스템에서 재사용하지 못한다.

해결 : DB, UI, FW와의 결합도를 낮춘다.


- (기타) Viscosity - 점성

정의 : 빌드/테스트 같은 필수 오퍼레이션들이 오래  걸려 수행이 어려울 경우 = 역겨운(disgust) 시스템

ex) 체크인, 체크아웃, 머지 등은 비용이 크고 역겨움, 여러 레이어를 가로질러 의존성을 갖는 것은 역겨움

원인 : 무책임한 용인 (Irresponsible tolerance)

해결 : dependency는 유지한 채로 decoupling 하는 것


- (기타) Needless Complexity

정의 : 불필요하게 모든 요구사항에 대한 변경을 반영할 수 있는 설계를 하면 불필요한 복잡도가 발생한다.

->불필요한 복잡도는 대게 강한 결합도을 수반한다.

->따라서 현재에 집중하자.


Emergent design : 긴급하게 리펙토링 하다보니 좋은 설계가 나왔다

Evolutionary Architecture : 처음 부터 계획이 있었던게 아니라 원칙들을 잘 지키다보니 진화적인 아키텍쳐가 나왔다.


3. Code Rot - 예제

Fan-out ?


4. What is Object Oriented ?

- f(o, x) != o.f(x)

- Dynamic Polymorphism - A 객체가 메세지를 전달했는데, 수신 받는 B 객체가 어떤 객체인지 모르고 어떻게 동작하는 지는 모르지만, A와 B객체는 정해진 인터페이스에 의해서 제대로 동작한다.

- 따라서 객체 지향에서는 Dependency Inversion(의존성 도치)가 가장 중요하다.

- 상속, 캡슐화, 다형성은 객체지향의 핵심이 아니라 매커니즘

- 객체지향의 핵심 : IoC(Inversion of Control)를 통해 상위 레벨의 모듈(Policies)을 하위 레벨의 모듈(Detail, 더러움)로 부터 보호하는 것. 도치된(Inverted) 구조는 썩지 않는다.

- 객체지향 설계 : 의존성 관리(Dependency Management) -> SOLID


반응형
댓글
댓글쓰기 폼