p. 214 ~ p. 224
디미터 법칙을 준수하고 묻지 말고 시켜라 스타일을 따르면서 의도를 드러내는 인터페이스 설계하는 쉬운 방법 → 메시지를 먼저 선택하고 그 후에 메시지를 처리할 객체를 선택
훌륭한 메시지를 얻는 출발점은 책임 주도 설계 원칙을 따르는 것 중요한 것은 협력에 적합한 메시지 not 객체
오퍼레이션의 시그니처에는 단지 오퍼레이션의 이름과 인자와 반환값의 타입만 명시할 수 있다. 어떤 조건이 만족되어야만 오퍼레이션을 호출할 수 있고 어떤 경우에 결과를 반환받을 수 없는지를 표현할 수 없다.
→ 협력을 위해 두 객체가 보장해야할 실행시점의 제약을 인터페이스에 명시할 방법이 존재 x
이를 해결하기 위해 등장한 개념이 계약에 의한 설계(Design By Contract)
클라이언트와 서버가 준수해야 하는 제약을 코드 상에 명시적으로 표현하고 강제할 수 있는 방법.
실제로 문제를 해결하기 위해 사용하는 저장소는 장기 기억이 아닌 단기기억. 하지만 문제 해결에 필요한 요수의 수가 단기 기억의 용량을 초과하는 순간 문제 해결 능력의 급격한 감소 → 인지 과부화
이를 방지하는 가장 좋은 방법은 단기 기억에 보관할 정보 양을 조절하는 것 → 불필요한 정보만을 제거하고 현재 문제 해결의 핵심만 남긴다 → 추상화
큰 문제를 해결 가능한 작은 문제로 나누는 작업 → 분해
추상화를 더 큰 규모의 추상화로 압축하여 단기 기억의 한계를 초월할 수 있다. → ex. 11자리 정수 8개 기억 vs 11자리 전화번호 8개 기억
모든 프로그래밍 패러다임은 추상화와 분해의 관점에서 설명할 수 있다.
현대 프로그래밍 언어를 특정짓는 중요한 추상화 메커니즘 2가지
프로그래밍 패러다임이란 적절한 추상화의 윤곽을 따라 시스템을 어떤 식으로 분해할 것인지 결정하는 원칙과 방법의 원칙이다. 따라서 현대 프로그래밍 패러다임은 위 방법을 중심으로 시스템을 분해한다.
프로시저 추상화 중심 → 기능 분해(functional decomposition), 알고리즘 분해
데이터 추상화 중심
2-1. 타입 추상화 → 추상 데이터 타입(Abstract Data Type)
2.2. 프로시저 추상화 → 객체 지향(Object-Oriented)
프로그래밍 언어의 관점에서 객체지향이란 데이터를 중심으로 데이터 추상화와 프로시저 추상화를 통합한 객체를 이용해 시스템을 분해하는 방법이다.
→ 이를 위해 대부분의 객체지향 언어는 클래스라는 도구를 제공한다.
기능 분해의 관점에서 추상화의 단위는 프로시저이며 시스템은 프로시저를 단위로 분해된다.
프로시저는 반복적으로 실행되거나 거의 유사하게 실행되는 작업을 하나에 모아넣음 → 로직 재사용 + 중복 방지하는 추상화 방법
프로시저를 통해 잠재적인 정보은닉이 가능하지만 부족한 부분이 있다.
전통적인 기능 분해 방법으로 하향식 접근법(Top-Down Approach)가 있다. 시스템을 구성하는 가장 최상위 기능을 정의하고 이를 좀 더 작은 단계의 기능으로 분해하는 방식이다. (마지막 하위 기능이 프로그래밍 언어로 구현 가능한 수준이 될 때 까지)
먼저 최상위의 추상적인 함수 정의는 시스템의 기능을 표현하는 하나의 문장으로 나타내고 문장을 구성하는 세부적인 단계의 문장으로 분해해 나가는 방식을 따른다.
→ 하나의 문장을 여러 개의 더 작은 기능으로 분해
각 정제 단계는 이전 문장의 추상화 수준을 감소시켜야 한다. → 하나 이상의 좀 더 단순하고 구체적은 문장들의 조합으로 분해
기능 분해를 위한 하향식 접근 법은 기능을 중심으로 먼저 필요한 기능을 생각한다. 기르고 이를 분해하고 정제하는 과정에서 필요한 데이터 종류와 저장 방식을 식별한다.