모던 C++ 디자인
Modern C++ Design| 작가 | 안드레이 알렉산드레스쿠 |
|---|---|
| 언어 | 영어 |
| 제목 | C++ |
| 출판사 | 애디슨 웨슬리 |
발행일자 | 2001 |
| 페이지 | 323 페이지 |
| ISBN | 978-0-201-70431-0 |
| OCLC | 45129236 |
| 005.13/3 21 | |
| LC Class | QA76.73.C153 A42 2001 |
최신 C++ 디자인: 적용된 제네릭 프로그래밍과 디자인 패턴은 안드레이 알렉산드레스쿠가 쓴 책으로 2001년 애디슨-웨슬리가 출간했다.이 책은 스콧 메이어스에 의해 "가장 중요한 C++[1] 책 중 하나"로 여겨져 왔다.
이 책은 템플릿 메타프로그래밍이라고 불리는 C++ 프로그래밍 기술을 활용하고 탐구한다.알렉산드레스쿠는 이 기술을 발명하지 않았지만 프로그래머들 사이에서 대중화했다.그의 책에는 C++ 프로그래머들이 직면할 수 있는 현실적인 문제들에 대한 해결책이 담겨 있다.현재 C++ 커뮤니티 내에서 현대의 C++(C/C++ 스타일에 반대되는)와 정책 기반 설계 및 유형 목록이라는 일반적인 용어로 이 책의 몇 구절이 사용되고 있다.
책에 묘사된 모든 암호는 그의 도서관 로키에서 자유롭게 이용할 수 있다.이 책은 2001년부터 여러 언어로 재출판되어 번역되었다.
정책 기반 설계
정책 기반 설계(Policy-based class design) 또는 정책 기반 프로그래밍(Policy-based programming)이라고도 하는 정책 기반 설계(Modern C++ Design)에서 정책(Policy)으로 알려진 C+++의 관용어에 기초한 설계 접근에 사용되는 용어다.전략 패턴의 컴파일 시간 변형으로 설명되어 왔으며, C++ 템플릿 메타프로그래밍과 연관성이 있다.안드레이 알렉산드레스쿠에 의해 모던 C++ 디자인, C/C++ Users Journal에 칼럼 Generic<Programming>과 함께 C+++에서 처음 대중화되었으며, 2003년경에는 흔치 않았던 템플릿에 대한 매우 강력한 지원을 가진 컴파일러가 필요하기 때문에 현재 C++와 D와 밀접한 관계가 있다.
매개변수화된 일반 코드에 기초한 이 설계 접근법의 이전 예로는 ML 언어의 파라메트릭 모듈(기능자)[2]과 메모리 관리 정책을 위한 C++ 할당자가 있다.
정책 기반 설계의 중심 관용어는 클래스 템플릿(호스트 클래스라고 함)으로, 사용자가 선택한 유형(정책 클래스라고 함)으로 인스턴스화하고, 각각 특정 암묵적 인터페이스(정책이라고 함)를 구현하며, 베이의 일부 직교(또는 대부분 직교) 측면을 캡슐화한다.즉석 호스트 클래스의 선구자각 정책에 대해 서로 다른 일련의 통조림 구현과 결합된 호스트 클래스를 제공함으로써, 라이브러리 또는 모듈은 컴파일 시간에 해결되고 호스트 클래스 템플릿의 인스턴스화에서 서로 다른 제공된 정책 클래스를 혼합하고 일치시킴으로써 선택되는 기하급수적인 수의 다른 동작 조합을 지원할 수 있다.또한, 주어진 정책의 맞춤형 구현을 작성함으로써, 정책 기반 라이브러리는 도서관 구현자가 예상하지 못한 행동을 요구하는 상황에서 사용될 수 있다.각 정책의 구현이 두 개 이상 사용되지 않는 경우에도, 한 클래스를 정책으로 분해하면 모듈성을 높이고 직교 설계 결정이 이루어진 위치를 정확히 강조함으로써 설계 프로세스에 도움이 될 수 있다.
교환 가능한 모듈로부터 소프트웨어 구성요소를 조립하는 것은 새로운 개념과는 거리가 멀지만, 정책 기반 설계는 개별 계층의 행동을 정의하는 (상대적으로 낮은) 수준에서 그 개념을 적용하는 방식의 혁신을 나타낸다.정책 클래스는 콜백(callback)과 어느 정도 유사하지만, 단일 함수로 구성되기 보다는 정책 클래스에 일반적으로 여러 가지 관련 기능(방법)이 포함되며, 주로 상태 변수 또는 중첩 유형과 같은 기타 시설과 결합된다.정책 기반 호스트 클래스는 유형으로 대표되는 일련의 동작을 입력으로 취하고, 그러한 동작을 기능적인 전체로 결합한 결과를 나타내는 유형으로 반환하는 일종의 전치(metafunctions)라고 생각할 수 있다.(그러나, MPL 메타퓨전과는 달리, 출력은 대개 인스턴스화된 호스트 클래스 자체에 의해 표현된다.중첩된 출력 유형 대신)
정책 관용어의 주요 특징은 일반적으로(엄정히 필요한 것은 아니지만) 호스트 클래스가 (공용) 다중 상속을 사용하여 각 정책 클래스에서 파생(자체 하위 클래스로 만들기)된다는 것이다. (대체로 호스트 클래스는 각 정책 클래스 유형의 멤버 변수만 포함하거나 정책 클래스를 상속하는 것이다.그러나 정책 클래스를 공개적으로 상속하는 것은 정책 클래스가 인스턴스화된 호스트 클래스에 의해 상속되고 사용자가 액세스할 수 있는 새로운 메서드를 추가할 수 있다는 큰 이점을 가지며, 호스트 클래스 자체는 알 필요도 없다.)정책 관용어의 이러한 측면의 주목할 만한 특징은 객체 지향 프로그래밍과 관련하여 정책이 기본 클래스와 파생 클래스 간의 관계를 역전시킨다는 것이다. 반면에 OOP 인터페이스에서는 전통적으로 정책 기반 설계에서 (추상) 기본 클래스와 파생 클래스에 의한 인터페이스 구현으로 표현된다.host) 클래스는 인터페이스를 나타내고 기본(정책) 클래스는 인터페이스를 구현한다.정책의 경우, 공공 상속은 호스트와 정책 계층 간의 관계를 나타내지 않는다.이는 전통적으로 OOP 맥락에서 설계 결함의 증거로 간주되지만, 정책 관용구의 맥락에서는 적용되지 않는다.
현 정책에서 정책의 단점은 정책 인터페이스가 코드에서 직접적이고 명시적인 표현을 하지 않고 오히려 오리 타이핑을 통해 암묵적으로 정의되며 코멘트에 별도로 그리고 수동으로 문서화되어야 한다는 것이다.공통성-변수성 분석을 통해 유형을 고정 구현과 인터페이스, 정책 기반 클래스, 그리고 다른 정책으로 나누는 것이 주요 아이디어다.요령은 무엇이 메인 클래스로 들어가고, 어떤 정책을 만들어야 하는지 아는 것이다.위에 언급된 기사는 다음과 같은 답을 준다: 우리가 가능한 제한적인 설계 결정을 내려야 할 필요가 있는 곳이라면, 우리는 그 결정을 연기해야 한다. 우리는 그것을 적절한 이름의 정책에 위임해야 한다.
정책 클래스는 구현, 유형 정의 등을 포함할 수 있다.기본적으로 기본 템플릿 클래스의 설계자는 정책 클래스가 제공해야 할 사항과 구현해야 할 사용자 지정 지점을 정의한다.
적절한 숫자(예: 필요한 최소치)만 제대로 된 정책 세트를 만드는 것이 섬세한 작업이 될 수 있다.서로 다른 사용자 지정 지점은 스토리지 정책, 검증 정책 등과 같은 하나의 정책 논쟁에 들어가야 한다.그래픽 설계자는 운영이나 사소한 구현 세부사항을 나타내는 정책이 아니라 개념을 나타내는 정책에 이름을 붙일 수 있다.
정책 기반 설계에는 다른 유용한 기법이 포함될 수 있다.예를 들어, 템플릿 방법 패턴은 컴파일 시간을 위해 재해석하여 메인 클래스에 스켈레톤 알고리즘을 사용할 수 있으며, 사용자 지정 시점에서는 일부 정책의 적절한 기능을 호출한다.
이는 향후 버전의 C++에서[3] 개념에 의해 동적으로 달성될 것이다.
간단한 예
아래에 제시된 것은 C++ 헬로 월드 프로그램의 간단한 (경쟁) 사례로, 인쇄할 텍스트와 인쇄 방법을 정책을 사용하여 분해한다.이 예에서 HelloWorld는 두 가지 정책이 필요한 호스트 클래스인데, 하나는 메시지를 표시할 방법을 지정하기 위한 것이고 다른 하나는 실제 메시지를 인쇄하기 위한 것이다.일반적인 구현이 다음 위치에 있다는 점에 유의하십시오.Run따라서 두 정책(두 정책)이 없으면 코드를 컴파일할 수 없다.Print그리고Message)이 제공된다.
#include <아이오스트림> #include <끈> 템플릿 <타이프 이름 출력정책, 타이프 이름 언어정책> 계급 안녕 세계 : 사유의 출력정책, 사유의 언어정책 { 공중의: // 행동 방법. 공허하게 하다 달리다() 경시하다 { // 두 가지 정책 방법. 인쇄하다(메시지()); } 사유의: 사용. 언어정책::메시지; 사용. 출력정책::인쇄하다; }; 계급 OutputPolicyWriteToCout { 보호받는: 템플릿 <타이프 이름 메시지 유형> 공허하게 하다 인쇄하다(메시지 유형&& 메세지) 경시하다 { 찌꺼기::뻐드렁니가 나다 << 메세지 << 찌꺼기::끝을 맺다; } }; 계급 LanguagePolicy English { 보호받는: 찌꺼기::끈을 매다 메시지() 경시하다 { 돌아오다 "안녕, 월드!"; } }; 계급 LanguagePolicyGerman { 보호받는: 찌꺼기::끈을 매다 메시지() 경시하다 { 돌아오다 "할로 웰트!"; } }; 인트로 본래의() { // 예 1 사용. 헬로월드 영어 = 안녕 세계<OutputPolicyWriteToCout, LanguagePolicy English>; 헬로월드 영어 hello_world; hello_world.달리다(); // "Hello, World!" 인쇄 // 예 2 // 동일한 작업을 수행하지만 다른 언어 정책을 사용한다. 사용. 헬로월드독일어 = 안녕 세계<OutputPolicyWriteToCout, LanguagePolicyGerman>; 헬로월드독일어 hello_world2; hello_world2.달리다(); // "Hallo Welt!"를 인쇄한다. } 디자이너는 더 쉽게 쓸 수 있다.OutputPolicys 멤버 함수와 함께 새 클래스를 추가함Print그리고 그것들을 새로운 것으로 받아들인다.OutputPolicys
로키 도서관
로키는 안드레이 알렉산드레스쿠가 자신의 저서 모던 C+++ 디자인(Modern C++ Design)의 일부로 쓴 C++ 소프트웨어 라이브러리의 이름이다.
도서관은 C++ 템플릿 메타프로그래밍을 광범위하게 사용하고 있으며, 타이프리스트, 펑터, 싱글톤, 스마트 포인터, 오브젝트 팩토리, 방문자, 멀티모드 등 일반적으로 사용되는 몇 가지 도구를 구현하고 있다.
원래 라이브러리는 C++ 컴파일러(CodeWarrior 및 Comeau C/C++): 이후 다양한 컴파일러(이전의 Visual C++ 6.0, Borland C+ Builder 6.0, Clang 및 GCC 포함)에서 사용할 수 있게 되었다.컴파일러 벤더는 호환성 벤치마크로 로키를 사용해 호환 컴파일러의 수를 더욱 늘렸다.[4]
로키의 유지와 추가 개발은 소스포지 프로젝트로 피터 킴멜과 리차드 스포사토가 이끄는 오픈소스 커뮤니티를 통해 계속되어 왔다.많은 사람들의 지속적인 기여는 도서관의 전반적인 건전성과 기능성을 향상시켰다.로키는 이미 새로운 구성요소(예: StrongPtr, Printf, Scopeguard)가 많아 더 이상 책에 얽매이지 않는다.로키는 부스트 도서관 소장품에도 있는 유사한 도구와 기능성에 영감을 주었다.[citation needed]
참고 항목
참조
- ^ 스콧 마이어스, 가장 중요한 C++ 책들...영원히
- ^ https://www.cl.cam.ac.uk/~LP15/MLBook/PDF/chapter7.pdf[bare URL PDF]
- ^ http://www.stroustrup.com/good_concepts.pdf[bare URL PDF]
- ^ C++ 및 2011년 이후: "Ask Us Anything" 세션, http://channel9.msdn.com/Shows/Going+Deep/C-and-Beyond-2011-Scott-Andrei-and-Herb-Ask-Us-Anything 51:40-51:51