P.51 ~ P.85 요약
객체지향 프로그래밍
- 확장 가능한 객체지향 설계가 가지는 특징은 코드의 의존성과 실행 시점의 의존성이 다르다는 것이다
- 코드의 의존성과 실행 시점의 의존성이 다르면 다를수록 코드를 이해하기 어려워진다
- 의존성의 양면성은 설계가 트레이드오프의 산물이라는 사실을 잘 보여준다
- 추상화의 계층만 따로 떼어 놓고 살펴보면 요구사항의 정책을 높은 수준에서 서술할 수 있다
- 추상화를 이용해 상위 정책을 표현하면 기존 구조를 수정하지 않고도 새로운 기능을 쉽게 추가하고 확장할 수 있다
- 항상 예외 케이스를 최소화하고 일관성을 유지할 수 있는 방법을 선택하라
- 유연성이 필요한 곳에 추상화를 사용하라
- 캡슐화의 약화는 자식 클래스가 부모 클래스에 강하게 결합되도록 만들기 때문에 부모 클래스를 변경할 때 자식 클래스도 함께 변경될 확률을 높인다
- 상속은 실행 시점에 객체의 종류를 변경하는 것이 불가능하다
역할, 책임, 협력
- 객체는 고립된 존재가 아니라 시스템의 기능이라는 더 큰 목표를 달성하기 위해 다른 객체와 협력하는 사회적인 존재다
- 어플리케이션 안에 어떤 객체가 필요하다면 그 이유는 단 하나여야 한다 그 객체가 어떤 협력에 참여하고 있기 때문이다
- 협력이 존재하기 때문에 객체가 존재하는 것이다
- 크레이그 라만은 객체의 책임을 크게 하는 것과 아는 것의 두가지 범주로 나누어 세분화하고 있다
- 객체는 자신이 맡은 책임을 수행하는 데 필요한 정보를 알고 있을 책임이 있다
- 객체지향 개발에서 가장 중요한 능력은 책임을 능숙하게 소프트웨어 객체에 할당하는 것이다
- 객체의 구현 방법은 상대적으로 책임보다는 덜 중요하며 책임을 결정한 다음에 고민해도 늦지 않다
- 다이어그램 대신 CRC 카드를 사용하는 이유 - 사람들은 아무것도 없는 상태에서 새로운 것을 만들어내기보다는 이미 존재하는 구체적이고 실재적인 것을 관찰하고 수정하고 그에 대한 피드백을 받으며 작업할 때 좀 더 효과적으로 일한다