질 : 엔지니어가 생산하는 것은 무엇인가?
답 : 엔지니어는 문서를 생산한다.
설계 이상 징후들
테스트 작성이 어렵다.
정의 : 시스템의 의존성으로 인해 변경하기 어려워지는 것
rigid하게 하는 원인 : 많은 시간이 소요되는 테스트와 빌드, 전체 리빌드를 유발하는 아주 작은 변화
테스트와 리빌드 시간을 줄이면 rigidity가 줄고 수정이 용이해짐
정의 : 한 모듈의 수정이 다른 모듈에 영향을 미치는 것
해결책 : 모듈 간 의존성을 제거한다. 런타임 의존성은 객체 간 의존성, 코드 의존성은 중간에 polymorphic dispatch
인터페이스를 사용하면 제거할 수 있다.
런타임에 sender 객체가 receiver에 메시지를 전달하기 위해 의존할 수밖에 없다.
코드에선 인터페이스를 두면 receiver가 메시지를 받아서 어떻게 처리하는지 sender가 알 필요가 없게 되고 응답값도 인터페이스를 준수하기만 하면 되기 때문에 의존성이 제거된다.
정의 : 모듈이 쉽게 추출되지 않고 재사용되지 않는 것
해결책 : 결합도 낮추거나 없앰
빌드, 테스트 같은 필수 오퍼레이션들이 오래 걸려 수행이 어렵다면 그 시스템은 역겨운 것
여러 레이어를 거쳐 의존성을 가지면 역겨운 것
역겨움의 원인 : 무책임한 용인 - 나빠질 것을 알면서도 하는 것
해결책 : 인터페이스를 둬서 런타임 의존성은 유지하고 소스 코드는 decoupling
모든 걸 미리 알고 구현하는 게 아니라 뭔가를 하다보니 결과가 나오는 방향으로 개발
미래를 예측해서 미리 구현하면 불필요하게 복잡해진다.
해결책 : 현재 요구사항에 집중
inversion of control container 사용
런타임엔 상위 -> 하위 레벨이지만 코드 상에선 하위 레벨이 상위 레벨에 의존하는 의존성 역전을 구현한다.
메서드를 호출할 때 caller는 callee가 어떻게 동작하는지 모르고 무엇을 원하는지를 전달한다.
dependency inversion이 핵심이다
sender가 메시지를 recipient에게 보내는 방향은 s -> r이지만 sender는 메시지의 인터페이스만 준수하면 되므로 의존성은 r <- s이다.
객체지향은 실세계를 똑같이 모델링하는 것
상속, 캡슐화, 다형성은 핵심이 아니라 메커니즘이다
객체지향의 핵심
객체지향 디자인
단일 책임 원칙 single responsibility principle
개방 폐쇄 원칙 open closed principle
리스코프 치환 원칙 liskov substituion principle
인터페이스 분리 원칙 interpace segregation principle
의존성 역전 원칙 dependency inversion principle