처음 부터 P.50 까지 요약


  • 프로그래밍 패러다임은 개발자 공동체가 동일한 프로그래밍 스타일과 모델을 공유할 수 있게 한다
  • 프로그래밍 언어와 프로그래밍 패러다임을 분리해서 설명할 수 없다


  • 소프트웨어 모듈의 목적 (클린 소프트웨어 - 로버트 마틴)
    • 실행 중에 제대로 동작하는 것
    • 간단한 작업만으로도 변경이 가능
    • 개발자가 쉽게 읽고 이해할 수 었어야 함


  • 티켓 판매 어플리케이션
  • 관람객과 판매원이 소극장의 통제를 받는 수동적인 존재이며 우리의 상식과 다르게 동작하는 것이 문제
  • 심각한 문제는 Audience와 TicketSeller를 변경할 경우 Theater도 함께 변경해야 한다는 사실
  • Theater가 Audience와 TicketSeller에 관해 세세한 부분까지 알지 못하도록 정보를 차단해야 함


  • 캡슐화를 통해 객체 내부로의 접근을 제한하면 객체와 객체 사이의 결합도를 낮출 수 있기 때문에 설계를 좀 더 쉽게 변경할 수 있다
  • 객체는 자신의 데이터를 스스로 처리하는 자율적인 존재여야 한다
  • 외부 간섭을 최대한 배제하고 메시지를 통해서만 협력하는 자율적인 객체들의 공동체를 만드는 것이 훌륭한 객체지향 설계를 위한 지름길이다


  • 무생물도 스스로 행동하고 자신을 책임지는 자율적인 존재로 취급하여 객체를 설계하는 원칙을 가리켜 의인화라고 부른다
  • 이해하기 쉽고 변경하기 쉬운 코드를 작성하고 싶다면 차라리 한 편의 에니메이션을 만든다고 생각하라


  • 변경을 수용할 수 있는 설계가 중요한 이유는 요구사항이 항상 변경되기 때문이다
  • 요구사항 변경은 필연적으로 코드 수정을 초래하고, 코드 수정은 버그가 발생할 가능성을 높인다


  • 객체 지향적으로 생각하고 싶다면 객체를 고립된 존재로 바라보지 말고 협력에 참여하는 협력자로 바라보아야 한다


  • 객체의 외부와 내부를 구분하면 클라이언트 프로그래머가 알아야 할 지식의 양이 줄어들고 클래스 작성자가 자유롭게 구현을 변경할 수 있는 폭이 넓어진다.
  • 클래스를 개발할 때마다 인터페이스과 구현을 깔끔하게 분리하기 위해 노력해야 한다.