▣ 01장: 소프트웨어 디자인 기술지침 1: 소프트웨어 디자인의 중요성을 이해하라__기능은 소프트웨어 디자인이 아니다__소프트웨어 디자인: 의존성과 추상화 관리 기술__소프트웨어 개발의 세 가지 수준__기능에 집중하기__소프트웨어 디자인과 디자인 원칙에 집중하기지침 2: 변경을 위한 디자인__관심사 분리(separation of concerns)__인위적인 결합 예__논리적 결합 대 물리적 결합__반복하지 말 것__너무 이른 관심사 분리를 피한다지침 3: 인터페이스를 분리해 인위적인 결합을 피하라__인터페이스를 분리해 관심사 분리하기__템플릿 인자의 요구 사항 최소화하기지침 4: 테스트 용이성을 위한 디자인__비공개 멤버 함수 테스트 방법__진정한 해결책: 관심사 분리지침 5: 확장을 위한 디자인__개방-폐쇄 원칙__컴파일 시점의 기능 확장성__너무 이른 기능 확장을 위한 디자인을 피한다▣ 02장: 추상화 구축 기술지침 6: 추상화로 기대하는 행위를 따르라__기대를 어기는 예__리스코프 치환 원칙__리스코프 치환 원칙에 대한 비판__좋고 의미 있는 추상화의 필요성지침 7: 기초 클래스와 콘셉트 간 유사성을 이해하라지침 8: 다중 정의 집합의 의미론적 요구 사항을 이해하라__자유 함수의 힘: 컴파일 시점 추상화 메커니즘__자유 함수의 문제: 행위에 대한 기대지침 9: 추상화 소유권에 주의하라__의존성 역전 원칙__플러그인 아키텍처에서 의존성 역전__템플릿을 통한 의존성 역전__다중 정의 집합을 통한 의존성 역전__의존성 역전 원칙 대 단일 책임 원칙지침 10: 아키텍처 문서 작성을 고려하라▣ 03장: 디자인 패턴의 목적지침 11: 디자인 패턴의 목적을 이해하라__디자인 패턴은 이름이 있다__디자인 패턴은 의도를 전달한다__디자인 패턴은 추상화를 도입한다__디자인 패턴은 입증됐다지침 12: 디자인 패턴에 대한 오해를 주의하라__디자인 패턴은 목표가 아니다__디자인 패턴은 구현 상세에 관한 것이 아니다__디자인 패턴은 객체 지향 프로그래밍이나 동적 다형성에 국한하지 않는다지침 13: 디자인 패턴은 어디에나 있다지침 14: 디자인 패턴 이름을 사용해 의도를 전달하라▣ 04장: 비지터 디자인 패턴지침 15: 타입 또는 연산 추가를 위한 디자인__절차적 해결책__객체 지향 해결책__동적 다형성에서 디자인 선택을 인식한다지침 16: 비지터를 사용해 연산을 확장하라__디자인 문제 분석__비지터 디자인 패턴 해설__비지터 디자인 패턴 단점 분석지침 17: 비지터를 구현하는 데 std::variant를 고려하라__std::variant 소개__도형 그리기를 값 기반, 비간섭 해결책으로 리팩터링하기__성능 벤치마크__std::variant 해결책의 단점 분석지침 18: 비순환 비지터의 성능에 주의하라▣ 05장: 전략 디자인 패턴과 커맨드 디자인 패턴지침 19: 전략을 사용해 작업 수행 방법을 분리하라__디자인 문제 분석__전략 디자인 패턴 해설__순진한 해결책의 단점 분석__비지터와 전략 비교__전략 디자인 패턴 단점 분석__단위 전략 기반 디자인지침 20: 상속보다 구성을 선호하라지침 21: 커맨드를 사용해 수행할 작업을 분리하라__커맨드 디자인 패턴 해설__커맨드 디자인 패턴 대 전략 디자인 패턴__커맨드 디자인 패턴 단점 분석지침 22: 참조 의미론보다 값 의미론을 선호하라__GoF 형식의 단점: 참조 의미론__참조 의미론: 두 번째 예__모던 C++ 철학: 값 의미론__값 의미론: 두 번째 예__디자인 패턴을 구현하는 데 값 의미론 사용을 선호하라지침 23: 전략과 커맨드는 값 기반 구현을 선호하라__std::function 소개__도형 그리기 리팩터링__성능 벤치마크__std::function 해결책 단점 분석▣ 06장: 어댑터 디자인 패턴, 옵서버 디자인 패턴, CRTP 디자인 패턴지침 24: 어댑터를 사용해 인터페이스를 표준화하라__어댑터 디자인 패턴 해설__객체 어댑터 대 클래스 어댑터__표준 라이브러리의 예__어댑터와 전략 비교__함수 어댑터__어댑터 디자인 패턴의 단점 분석지침 25: 추상 통지 메커니즘으로 옵서버를 적용하라__옵서버 디자인 패턴 해설__전통적인 옵서버 구현__값 의미론을 기반으로 한 옵서버 구현__옵서버 디자인 패턴의 단점 분석지침 26: CRTP를 사용해 정적 타입 범주를 도입하라__CRTP에 대한 동기__CRTP 디자인 패턴 해설__CRTP 디자인 패턴 단점 분석__CRTP의 미래: CRTP와 C++20 콘셉트 간 차이지침 27: 정적 믹스인 클래스에 CRTP를 사용하라__강타입(Strong type)의 동기__구현 패턴으로 CRTP 사용▣ 07장: 브리지 디자인 패턴, 프로토타입 디자인 패턴, 외부 다형성 디자인 패턴지침 28: 브리지를 구축해 물리적 의존성을 제거하라__동기 부여 사례__브리지 디자인 패턴 해설__핌플 관용구__브리지와 전략의 비교__브리지 디자인 패턴 단점 분석지침 29: 브리지 성능 이득과 손실을 인식하라__브리지 성능 영향__부분 브리지로 성능 향상시키기지침 30: 추상 복사 연산에는 프로토타입을 적용하라__양을 이용한 예: 동물 복사__프로토타입 디자인 패턴 해설__프로토타입과 std::variant 비교__프로토타입 디자인 패턴 단점 분석지침 31: 비간섭 런타임 다형성에는 외부 다형성을 사용하라__외부 다형성 디자인 패턴 해설__도형 그리기 다시 보기__외부 다형성과 어댑터 비교__외부 다형성 디자인 패턴 단점 분석▣ 08장: 타입 소거 디자인 패턴지침 32: 상속 계통을 형 소거로 대체할 것을 고려하라__타입 소거의 역사__타입 소거 디자인 패턴 해설__소유형 타입 소거 구현__타입 소거 디자인 패턴 단점 분석__두 타입 소거 래퍼 비교하기__ 타입 소거 래퍼의 인터페이스 분리__성능 벤치마크__용어에 대한 한 마디지침 33: 타입 소거의 최적화 잠재력을 인식하라__소규모 버퍼 최적화__함수 디스패치 직접 구현지침 34: 소유형 타입 소거 래퍼의 설정 비용을 인식하라__소유형 타입 소거 래퍼 설정 비용__간단한 비소유형 타입 소거 구현__더 강력한 비소유형 형 소거 구현▣ 09장: 데코레이터 디자인 패턴지침 35: 데코레이터를 사용해 사용자__계통적으로 추가하라__동료의 디자인 문제__데코레이터 디자인 패턴 해설__데코레이터 디자인 패턴의 고전적인 구현__두 번째 데코레이터 예__데코레이터, 어댑터, 전략 비교__데코레이터 디자인 패턴 단점 분석지침 36: 런타임과 컴파일 시점 추상__이율배반적 관계를 이해하라__값 기반 컴파일 시점 데코레이터__값 기반 런타임 데코레이터▣ 10장: 싱글턴 패턴지침 37: 싱글턴을 디자인 패턴이 아닌 구현 패턴으로 다루라__싱글턴 패턴 해설__싱글턴은 의존성을 관리하거나 줄이지 않는다지침 38: 싱글턴을 변경과 테스트 용이성을 위해 디자인하라__싱글턴은 전역 상태를 나타낸다__싱글턴은 변경 용이성과 테스트 용이성을 저해한다__싱글턴에 대한 의존성 뒤집기__전략 디자인 패턴 적용__지역 의존성 주입으로 전환▣ 11장: 마지막 지침지침 39: 디자인 패턴을 계속 배워라