객체 지향 S/W 설계 패턴의 지식 계층
먼저, 객체지향 설계를 위한 패턴 지식의 계층은 위 그림과 같이 요약해 볼 수 있다.
먼저, OO Basics - 객체지향의 매우 기본적인 요소들이다.
추상화, 캡슐화, 다형성, 상속성.
그리고 이 네가지 속성들 위에서 SOLID, GRASP와 같은 OO Principles, 즉, '객체 지향 원칙' 과 같은 개념들이 등장할 수 있었다.
마지막으로 OO Principles을 반영하여 반복되는 수많은 코딩 패턴들이 있었을 텐데, 그것들을 정리한 Design Pattern과 같은 개념들이 등장한 것으로 볼 수 있다.
Design Smells
객체지향 언어를 사용한 나쁜 설계에서 발생하는 다양한 증상들과 다양한 신호들을 'Design Smells' 라고 부른다.
Rigidity (경직성)
경직성이 높은 시스템을 바꾸는 건 어려운 일이다. 뭔가 한가지를 바꾸면, 그때마다 다른 뭔가를 같이 변경해야 하고, 그 변경은 또다른 변경을 야기하고... 끝없는 변화 속에서 다른 것들을 연쇄적으로 변경해야 하기 때문이다.
Fragility (취약성)
시스템의 한 부분의 코드를 수정하면, 전혀 관련 없는 다른 여러 부분들이 덩달아 오작동 하는 등, 망가진다.
Immobility (부동성)
시스템을 다른 시스템에서 재사용가능한 컴포넌트로 구분해 내는것은 어려운 일이다.
Viscosity (점착성)
설계에 맞는 코드를 추가하는 것보다 해킹을 추가하는 것이 더 쉽다? 그렇다면, 그 시스템은 높은 점착성을 가지고 있는 것이다.
Needless Complexity (불필요한 복잡성)
지금은 실제로 필요하지 않지만 언젠가는 매우 유용할 수 있는 매우 똑똑한 코드 구조를 많이 가지고 있다.
Needless Repetition (불필요한 반복)
코드가 복사/붙여넣기를 통해 작성되었다. (반복됨을 의미)
Opacity (불투명성)
작성자의 의도를 밝히는 데는 표현식의 합성곱과 관련된 어떤 어려움이 있다.
의존성 관리
잘못관리되는 의존성의 결과물이 Design Smells다.
객체지향 언어는 의존성 관리를 돕기위한 도구들을 제공하는데,
- 인터페이스 : 의존성의 방향을 뒤집거나, 의존성을 깰 수 있다.
- 다형성 : 모듈들이 메소드를 동적으로 호출할 수 있게 해준다.