SOLID 기초

x·2021년 3월 25일
0

the source code is the design

질 : 엔지니어가 생산하는 것은 무엇인가?
답 : 엔지니어는 문서를 생산한다.

  • 소프트웨어 공학의 결과물은?
    • 실행하는 바이너리 코드
    • 소스코드는 문서다
    • 소스코드는 설계다
      건물, 회로, 기계는 설계 비용은 저렴하지만 상대적으로 수정 비용은 비싸다.
      소프트웨어는 컴파일, 빌드하는 구축 비용이 저렴하지만 상대적으로 소스 코드를 수정, 작성하는 설계 비용은 비싸다.

design smells

설계 이상 징후들
테스트 작성이 어렵다.

rigidity 경직성

정의 : 시스템의 의존성으로 인해 변경하기 어려워지는 것
rigid하게 하는 원인 : 많은 시간이 소요되는 테스트와 빌드, 전체 리빌드를 유발하는 아주 작은 변화
테스트와 리빌드 시간을 줄이면 rigidity가 줄고 수정이 용이해짐

  • SOLID 원칙을 지키면 된다.
  • test 병렬 실행

fragility 취약성

정의 : 한 모듈의 수정이 다른 모듈에 영향을 미치는 것
해결책 : 모듈 간 의존성을 제거한다. 런타임 의존성은 객체 간 의존성, 코드 의존성은 중간에 polymorphic dispatch 인터페이스를 사용하면 제거할 수 있다.
런타임에 sender 객체가 receiver에 메시지를 전달하기 위해 의존할 수밖에 없다.
코드에선 인터페이스를 두면 receiver가 메시지를 받아서 어떻게 처리하는지 sender가 알 필요가 없게 되고 응답값도 인터페이스를 준수하기만 하면 되기 때문에 의존성이 제거된다.

immobility 부동성

정의 : 모듈이 쉽게 추출되지 않고 재사용되지 않는 것
해결책 : 결합도 낮추거나 없앰

viscosity 점성

빌드, 테스트 같은 필수 오퍼레이션들이 오래 걸려 수행이 어렵다면 그 시스템은 역겨운 것
여러 레이어를 거쳐 의존성을 가지면 역겨운 것
역겨움의 원인 : 무책임한 용인 - 나빠질 것을 알면서도 하는 것
해결책 : 인터페이스를 둬서 런타임 의존성은 유지하고 소스 코드는 decoupling

needless complexity

모든 걸 미리 알고 구현하는 게 아니라 뭔가를 하다보니 결과가 나오는 방향으로 개발
미래를 예측해서 미리 구현하면 불필요하게 복잡해진다.
해결책 : 현재 요구사항에 집중

what is OOP?

inversion of control container 사용
런타임엔 상위 -> 하위 레벨이지만 코드 상에선 하위 레벨이 상위 레벨에 의존하는 의존성 역전을 구현한다.
메서드를 호출할 때 caller는 callee가 어떻게 동작하는지 모르고 무엇을 원하는지를 전달한다.
dependency inversion이 핵심이다
sender가 메시지를 recipient에게 보내는 방향은 s -> r이지만 sender는 메시지의 인터페이스만 준수하면 되므로 의존성은 r <- s이다.

객체지향은 실세계를 똑같이 모델링하는 것
상속, 캡슐화, 다형성은 핵심이 아니라 메커니즘이다
객체지향의 핵심

  • inversion of control을 통해 상위 레벨의 모듈을 하위 레벨의 모듈로부터 보호하는 것. 하위 레벨이 바뀌어도 상위 레벨에 영향 없음

객체지향 디자인

  • 의존성을 관리하는 것
  • 주요 의존성들의 역전은 하위 레벨의 상세로부터 상위 레벨 정책들을 고립시킨다.

의존성 관리 중요 규칙 SOLID

단일 책임 원칙 single responsibility principle
개방 폐쇄 원칙 open closed principle
리스코프 치환 원칙 liskov substituion principle
인터페이스 분리 원칙 interpace segregation principle
의존성 역전 원칙 dependency inversion principle

출처

0개의 댓글