- 객체지향 디자인은 세상을 이미 정해진 절차들의 묶음으로 생각하지 않고, 객체가 서로 주고 받는 메시지들의 연쇄로 파악할 것을 요구한다.
📚 디자인 예찬
🎈 디자인이 해결해 줄 수 있는 문제들
- 변화는 어디에나 있고 모든 곳에 있으며 피할 수 없다.
- 변화가 필요하기 때문에 디자인이 중요한 것이다.
- 변화를 주기 힘든 애플리케이션은 수정을 하려면 많은 시간이 필요하고, 다음번 수정이 더욱 어려워진다.
🎈 왜 수정은 어려운가
- 객체지향 애플리케이션은 상호작용하는 여러 부분으로 구성되어 있고, 각 부분 사이의 상호작용이 전체의 작동을 만들어 낸다.
- 이 여러 부분이 객체이고, 객체 사이의 상호작용은 객체가 주고 받는 메시지 속에 녹아 있다.
- 수신하는 객체에 대한 이 지식이 두 객체 사이의 의존성을 만들어 내고, 이런 의존성이 애플리케이션을 수정하기 어렵게 만든다.
- 객치지향 디자인은 의존성을 관리하는 것이고, 객체가 변화를 받아들일 수 있도록 의존성을 정리하는 코딩 기술의 묶음이다.
- 디자인이 결여되어 있을 때, 객체가 서로에 대해 너무 많이 알고 있기 때문에 관리되지 않은 의존성은 재앙을 불러온다. 다시 사용하기 어렵고 테스트하기도 힘들며 중복되기도 쉽다.
🎈 디자인의 실용적 정의
- 모든 애플리케이션은 코드의 묶음이고, 코드를 배치하는 것이 곧 디자인이다.
- 디자인의 어려움 중 하나는 모든 문제가 두 부분으로 구성되어 있 다는 점이다. 오늘 완성해야 하는 기능을 구현하는 코드를 짜야하고, 동시에 내일 쉽게 바꿀 수 있는 코드를 짜야한다.
- 실용적 디자인은 우리의 애플리케이션에 어떤 일이 벌어질지를 예측하는 것이 아니라, 단지 언젠가 무언가는 변한다는 사실 그리고 지금은 무엇이 변경될지 알 수 없다는 사실을 받아들이는 것이다.
- 디자인은 나중에 디자인할 수 있는 여지를 남겨 놓기 위한 것이고, 그 최종 목표는 변화의 비용을 최소화하는 것이다.
📚 디자인 도구들
🎈 디자인 원칙들
- 디자인 원치을 뜻하는 SOLID는 객체지향 디자인의 잘 알려진 디자인 원칙 다섯 가지를 대변한다.
- 단일 책임(Single Responsibility), 개방-폐쇄(Open-Closed), 리스코프 치환(Liskov Substitution), 인터페이스 분리(Interface Segregation), 의존성 역전(Dependency Inversion)이다.
- 데메테르 프로젝트에서 시작된 데메테르의 원칙(Law of Demeter-LoD)
🎈 디자인 패턴