SlideShare une entreprise Scribd logo
1  sur  24
Télécharger pour lire hors ligne
Modern
C++
Design
단위전략 기반의
클래스 디자인
Modern C++ Design
• Generic programming
• Design Pattern Applied
단위전략 기반의 클래스 디자인
무엇인가?
왜 써야하나?
어떻게 구현하나?
무슨 장점이 있나?
무슨 장점이 있나?
단위전략policy 기반의 클래스 디자인
• 매우 단순한 동작이나 구조만을 갖는 작은 클래스(policy)들을 모아
서 복합된 기능을 하는 새로운 클래스를 만들어내는 디자인 방식
• 단위전략들은 서로 간에 연동되거나 조합되어 사용될 수 있으므로
다양한 결과물을 얻어낼 수 있음
policy classes host class
소프트웨어 디자인의 다양성
• 디자인 문제에 있어서 올바른 해법은?
• 단일 vs 다중 스레드, 안정성 vs 성능, 감시자 vs 콜백, 가상 함수 vs 템플릿
• 소프트웨어 시스템 디자인은 문제를 해결하는 다양한 해법들 중 올
바른 방법을 끊임없이 선택하는 과정
• 유연하고, 안전하고, 사용자가 쉽게 조절할 수 있고
적절한 양의 코드로 다양성의 재앙과 맞서 싸우기 위한 방법은?
Do-It-All 인터페이스의 문제점
• 모든 기능에 대한 인터페이스를 구현(Do-It-All 인터페이스)할 경우,
• 기능이 런타임에 수행되므로 컴파일 시점에 검사할 수 있는 내용이 축소됨
문법적으로는 옳지만 의미상으로는 옳지 않은 코드가 만들어질 수 있음
• 서로 다른 디자인 요소들을 작은 별개의 클래스로 구현할 경우,
• 지나치게 다양한 선택의 조합이 난립할 수 있음
• 미리 규정된 라이브러리 제한 조건보다는
사용자가 만든 디자인 스스로의 제한 조건을 가지도록 설계해야 함
• 프로그래머가 선택하고 커스터마이징을 할 수 있도록 설계해야 함
다중 상속이 해결책이 될 수 있을까요?
• 잘 디자인된 기반 클래스 여러 개를 상속받는 것으로 될까?
• 기반 클래스의 조합은 가능하지만 부족한 부분이 있음
• 다중 상속은 단지 기반 클래스들을 포개어놓고 멤버를 접근하기 위한 기능
이므로 상속된 컴포넌트들을 제어하거나 취합하는 것은 직접 해야 함
• 기반 클래스들은 자신이 모르는 클래스에 대한 작업을 해야 함
• 기반 클래스가 상태를 가질 경우 가상 상속을 이용해야만 함
템플릿의 이점
• 선택한 자료형에 따라 컴파일 시점에 코드를 컴파일러가 생성해줌
• 부분 특화Specialization를 통해 사용자가 특화된 기능 추가가 가능
• 다중 인자 클래스 템플릿의 부분 인자 특화로 인한 확장성
• 단점
• 멤버 변수 수준의 template 적용은 불가능
• 멤버 함수의 부분 특화는 불가능
• 다중 상속과 템플릿의 병용하여 라이브러리를 작성함
template <class T, class U> class SmartPtr;
template <class U> class SmartPtr<Widget, U> {
// some codes
};
template <class T> class Widget {
void Fun() { /* codes */ }
};
template <> void Widget<char>::Fun() {
// some specialized codes
}
template <class T, class U> class Gadget {
void Fun() { /* codes */ }
};
template <class U>
void Gadget<char, U>::Fun() {
// compile error!
}
template <> void Gadget<char, int>::Fun() {
// it’s ok!
}
템플릿 인자를 부분 특수화할 수 있다.
완전 특수화를 하여 멤버 함수를 정의할 수는 있지만,
멤버 함수는 부분 특수화를 할 수 없다.
단위전략과 단위전략 클래스
• 단위전략 클래스: 단위전략에 대한 구현물
• 명시적 인터페이스 구현이 아니라 template에 의해 모호하게 정의됨
• 호스트 클래스: 단위전략을 사용하는 클래스
• 특정 부분을 마음대로 구성할 수 있는 효과적인 방법을 제공
template <class T> struct OpNewCreator {
static T* Create() { return T; }
};
template <class CreationPolicy>
class WidgetManager : public CreationPolicy {
};
typedef WidgetManager<OpNewCreator<Widget>>
MyWidgetMgr;
template <class T> struct MallocCreator {
static T* Create() {
void* buf = std::malloc(sizeof(T));
return buf == nullptr ? nullptr : new (buf)T;
}
};
template <class T> struct PrototypeCreator {
PrototypeCreator(T* pObj = nullptr)
: pPrototype_(pObj) {}
T* Create() {
return pPrototype_ ? pPrototype_ > Clone() : nullptr;
}
T* GetPrototype() { return pPrototype_; }
void SetPrototype(T* pObj) { pPrototype_ = pObj; }
private:
T* pPrototype_;
};
템플릿 인자로 합성해서 사용한다.
생성에 대한 각기 다른 단위전략을 구현하고,
모두 Create()라는 함수를 갖지만 명시적 interface는 없다.
PrototypeCreator처럼 상태를 가질 수 있으므로
CreationPolicy를 상속받아 구현한다.
템플릿 템플릿 인자를 통한 구현
• 템플릿 템플릿 인자를 사용한 단위전략 구성
• 보다 유연한 코드를 작성할 수 있게 해줌
• 사용자가 보다 애플리케이션에 정확히 들어맞는 고유의 생성 전략
을 제공할 수 있음
template <template <class Created> class CreationPolicy>
class WidgetManager : public CreationPolicy<Widget> {
void DoSomething() {
Gadget* pW = CreationPolicy<Gadget>().Create();
}
};
typedef WidgetManager<OpNewCreator> MyWidgetMgr;
template <template <class> class CreationPolicy = OpNewCreator>
class WidgetManager;
템플릿 템플릿 인자로 CreationPolicy를 받는다.
보다 편리하게 사용할 수 있도록 기본 단위전략을 지정해 줄 수 있다.
이 지점에서 Created는 의미가 없으므로 생략 가능하다.
생성 시 Type을 지정하지만 상속 시의 Type은 Widget이므로,
PrototypeCreator일 경우 Gadget은 Widget을 상속받아야 한다.
템플릿 멤버 함수를 통한 구현
• 구형 컴파일러에서도 잘 동작함
• 템플릿 클래스에 비해 논의, 정의, 구현, 사용법이 까다로움
struct OpNewCreator {
template <class T>
static T* Create() {
return new T;
}
};
단위전략 인터페이스의 보강
• 라이브러리가 아닌 사용자 자신이 어떤 단위전략 클래스를 사용
• 기능을 지원하지 않는 다른 단위전략 클래스를 사용하면 컴파일러
가 경고
typedef WidgetManager<PrototypeCreator> MyWidgetManager;
// ...
Widget* prototype = CreatePrototype();
MyWidgetManager mgr;
mgr.SetPrototype(prototype);
// ... PrototypeCreator 단위전략 함수를 갖게되어 인터페이스가 보강됨
단위전략 클래스의 소멸자
• 단위전략 클래스로 강제 casting 후 소멸자 호출 막기 위해 소멸자
를 protected로 변경
• 가상 소멸자를 정의하는 것은 불필요한 부담을 야기
typedef WidgetManager<PrototypeCreator>
MyWidgetManager;
MyWidgetManager mgr;
PrototypeCreator<Widget>* creator = &mgr;
delete creator; // ???
template <class T>
struct PrototypeCreator {
// ...
protected:
~PrototypeCreator() {}
};
불완전한 구체화를 통한 부가기능
• 템플릿에서 전혀 사용되지 않는 멤버 함수는 구체화 시 무시됨
• 컴파일러에 따라 다르지만 심볼 유효성 등 문맥적 검사는 하지 않음
template <template <class> class CreationPolicy>
class WidgetManager : public CreationPolicy<Widget> {
void SwitchPrototype(Widget* newPrototype) {
CreationPolicy<Widget>& myPolicy = *this;
delete myPolicy.GetPrototype();
myPolicy.SetPrototype(newPrototype);
}
};
OpNewCreator를 쓰면서 SwitchPrototype()을 부르지 않으면 OK
PrototypeCreator를 쓸 경우 SwitchPrototype()을 불러도 OK
단위전략 클래스 간의 조합
• 호스트 클래스는 여러 단위 전략을 조합하여 다양한 동작을 정의할
수 있음
template <
class T,
template <class> class CheckingPolicy,
template <class> class ThreadingModel
>
class SmartPtr;
typedef SmartPtr<Widget, NoChecking, SingleThreaded> WidgetPtr;
typedef SmartPtr<Widget, EnforceNotNull, SingleThreaded> SafeWidgetPtr;
template <class T> struct NoChecking {
static void Check(T*) {}
};
template <class T> struct EnforceNotNull {
static void Check(T* ptr) {
if (!ptr)
throw NullPointerException();
}
};
template <
class T,
template <class> class CheckingPolicy,
template <class> class ThreadingModel
>
class SmartPtr
: public CheckingPolicy<T>
, public ThreadingModel<SmartPtr<T, CheckingPolicy, ThreadingModel>> {
public:
T* operator -> () {
typename ThreadingModel<SmartPtr>::Lock guard(*this);
CheckingPolicy<T>::Check(pointee_);
return pointee_;
}
private:
T* pointee_;
};
적절한 단위전략을 선택하여 어떠한 동작을 할지 결정할 수 있다.
단위전략 클래스를 통한 커스터마이징
• 단위전략과 상속을 사용하여 클래스의 구조를 변경
template <class T>
class DefaultSmartPtrStorage {
public:
typedef T* PointerType;
protected:
PointerType GetPointer() { return ptr_; }
void SetPointer(PointerType ptr) { ptr_ = ptr; }
private:
PointerType ptr_;
};
template <
class T,
template <class> class Storage = DefaultSmartPtrStorage
>
class SmartPtr : public Storage<T> {};
T*가 아닌 type에 대해서도 사용하기 위해 Storage 추상화
Storage에 필요한 저장 구조를 포함하기 위해 상속
호환/비호환 단위전략
• 호환 가능한 단위전략을 위해 단위전략 간의 형변환 구현(복사 생성자
나 형변환 연산자) 후 단위전략 단위로 복사를 하도록 구현
template <
class T,
template <class> class CheckingPolicy>
class SmartPtr : public CheckingPolicy<T> {
template <
class T1,
template <class> clsas CP1>
SmartPtr(const SmartPtr<T1, CP1>& other)
: pointee_(other.pointee_), CheckingPolicy<T>(other)
{}
};
다른 policy를 갖는 SmartPtr을 인자로 받아서,
policy의 복사 생성자를 불러준다.
때문에 policy간의 복사 생성자가 구현되어 있을 때만 허용된다.
클래스를 단위전략으로 분리해 내기
• 극단적인 경우 호스트 클래스는 단위전략의 집합체로만 표현됨
• 이 경우 템플릿 인자가 지나치게 많아지는 경우가 있지만,
장황한 정의는 장황한 구현에 비해 코드 이해와 유지보수 측면에서 별 문제
가 되지 않는다.
• 비독립 단위전략을 피해야 함
• 어쩔 수 없다면 캡슐화를 포기하고 의존성 최소하는 방향으로 분리
• 예) Array 단위전략과 Destroy 단위전략의 충돌
요약
• 단위전략 클래스 구현
• 적은 수의 기본적인 장치들을 조합해서 유연한 코드를 생성해야 함
• 사용자들도 자신만의 구현체를 만들 수 있어야 함
• 인터페이스 보강, 커스터마이징, 형변환 유연성
• 클래스 분리
• Trade-off 관계거나 다양한 방법으로 구현될 수 있다면 찾아내어 분리
• 다른 단위전략에 영향을 끼치지 않도록 독립적으로 구현
끝
참 쉽죠?

Contenu connexe

Tendances

결합도 관점에서 본 VO 문제점
결합도 관점에서 본 VO 문제점결합도 관점에서 본 VO 문제점
결합도 관점에서 본 VO 문제점JavaCommunity.Org
 
The roadtocodecraft
The roadtocodecraftThe roadtocodecraft
The roadtocodecraftbbongcsu
 
2016 Staccato track3 Android를 더 잘 개발하려면? (MVP, MVVM, Clean Architecture)
2016 Staccato track3 Android를 더 잘 개발하려면? (MVP, MVVM, Clean Architecture)2016 Staccato track3 Android를 더 잘 개발하려면? (MVP, MVVM, Clean Architecture)
2016 Staccato track3 Android를 더 잘 개발하려면? (MVP, MVVM, Clean Architecture)승용 윤
 
테스트자동화 성공전략
테스트자동화 성공전략테스트자동화 성공전략
테스트자동화 성공전략SangIn Choung
 
테스터가 말하는 테스트코드 작성 팁과 사례
테스터가 말하는 테스트코드 작성 팁과 사례테스터가 말하는 테스트코드 작성 팁과 사례
테스터가 말하는 테스트코드 작성 팁과 사례SangIn Choung
 
Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례SangIn Choung
 
Effective unit testing ch3. 테스트더블
Effective unit testing   ch3. 테스트더블Effective unit testing   ch3. 테스트더블
Effective unit testing ch3. 테스트더블YongEun Choi
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven DevelopmentChangHyeon Bae
 
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)SangIn Choung
 
Design patterns
Design patternsDesign patterns
Design patternsdf
 
사용자 스토리 대상 테스트 설계 사례(테스트기본교육 3장 3절)
사용자 스토리 대상 테스트 설계 사례(테스트기본교육 3장 3절)사용자 스토리 대상 테스트 설계 사례(테스트기본교육 3장 3절)
사용자 스토리 대상 테스트 설계 사례(테스트기본교육 3장 3절)SangIn Choung
 

Tendances (12)

결합도 관점에서 본 VO 문제점
결합도 관점에서 본 VO 문제점결합도 관점에서 본 VO 문제점
결합도 관점에서 본 VO 문제점
 
The roadtocodecraft
The roadtocodecraftThe roadtocodecraft
The roadtocodecraft
 
2016 Staccato track3 Android를 더 잘 개발하려면? (MVP, MVVM, Clean Architecture)
2016 Staccato track3 Android를 더 잘 개발하려면? (MVP, MVVM, Clean Architecture)2016 Staccato track3 Android를 더 잘 개발하려면? (MVP, MVVM, Clean Architecture)
2016 Staccato track3 Android를 더 잘 개발하려면? (MVP, MVVM, Clean Architecture)
 
테스트자동화 성공전략
테스트자동화 성공전략테스트자동화 성공전략
테스트자동화 성공전략
 
TEST?
TEST?TEST?
TEST?
 
테스터가 말하는 테스트코드 작성 팁과 사례
테스터가 말하는 테스트코드 작성 팁과 사례테스터가 말하는 테스트코드 작성 팁과 사례
테스터가 말하는 테스트코드 작성 팁과 사례
 
Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례Io t에서의 소프트웨어단위테스트_접근사례
Io t에서의 소프트웨어단위테스트_접근사례
 
Effective unit testing ch3. 테스트더블
Effective unit testing   ch3. 테스트더블Effective unit testing   ch3. 테스트더블
Effective unit testing ch3. 테스트더블
 
TDD - Test Driven Development
TDD - Test Driven DevelopmentTDD - Test Driven Development
TDD - Test Driven Development
 
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
(편집-테스트카페 발표자료) 1인 QA 수행사례로 발표한 자료 (W프로젝트 사례)
 
Design patterns
Design patternsDesign patterns
Design patterns
 
사용자 스토리 대상 테스트 설계 사례(테스트기본교육 3장 3절)
사용자 스토리 대상 테스트 설계 사례(테스트기본교육 3장 3절)사용자 스토리 대상 테스트 설계 사례(테스트기본교육 3장 3절)
사용자 스토리 대상 테스트 설계 사례(테스트기본교육 3장 3절)
 

En vedette

[피키캐스트] 5학년선배 ppt 템플릿 레이아웃
[피키캐스트] 5학년선배 ppt 템플릿 레이아웃[피키캐스트] 5학년선배 ppt 템플릿 레이아웃
[피키캐스트] 5학년선배 ppt 템플릿 레이아웃o_senior
 
컬러배스3
컬러배스3컬러배스3
컬러배스3연 하
 
게임의 정의
게임의 정의게임의 정의
게임의 정의귀희 김
 
Bmg lecture note 20111102
Bmg lecture note 20111102Bmg lecture note 20111102
Bmg lecture note 20111102Yeounjoon Kim
 
SNS 를 통한 비즈니스 프로세스 실행 방안 - 프로세스 코디를 기반으로
SNS 를 통한 비즈니스 프로세스 실행 방안 - 프로세스 코디를 기반으로SNS 를 통한 비즈니스 프로세스 실행 방안 - 프로세스 코디를 기반으로
SNS 를 통한 비즈니스 프로세스 실행 방안 - 프로세스 코디를 기반으로uEngine Solutions
 
JBoss Community's Application Monitoring Platform
JBoss Community's Application Monitoring PlatformJBoss Community's Application Monitoring Platform
JBoss Community's Application Monitoring Platformjbugkorea
 
디자인의 정의
디자인의 정의디자인의 정의
디자인의 정의Sohee Kim
 
파이썬 class 및 인스턴스 생성 이해하기
파이썬 class 및 인스턴스 생성 이해하기파이썬 class 및 인스턴스 생성 이해하기
파이썬 class 및 인스턴스 생성 이해하기Yong Joon Moon
 
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration수홍 이
 
Kotler Keller 마케팅관리론 14판 요약 강의 1장. 마케팅 정의
Kotler Keller 마케팅관리론 14판 요약 강의 1장. 마케팅 정의Kotler Keller 마케팅관리론 14판 요약 강의 1장. 마케팅 정의
Kotler Keller 마케팅관리론 14판 요약 강의 1장. 마케팅 정의Korea Institute of Marketing Education
 
Alipay 이용 방법
Alipay 이용 방법Alipay 이용 방법
Alipay 이용 방법PayGate
 
What is business model?-비즈니스 모델이란?
What is business model?-비즈니스 모델이란?What is business model?-비즈니스 모델이란?
What is business model?-비즈니스 모델이란?ROA Invention LAB Inc. CEO
 
빅데이터 분석 시각화 분석 : 4장 빅데이터와 시각화 디자인
빅데이터 분석 시각화 분석 : 4장 빅데이터와 시각화 디자인빅데이터 분석 시각화 분석 : 4장 빅데이터와 시각화 디자인
빅데이터 분석 시각화 분석 : 4장 빅데이터와 시각화 디자인Ji Lee
 
발표자료만들때 알아야할 기본사항들
발표자료만들때 알아야할 기본사항들발표자료만들때 알아야할 기본사항들
발표자료만들때 알아야할 기본사항들김 성남
 
디발자가 말하는 시선을 끄는 PPT
디발자가 말하는 시선을 끄는 PPT디발자가 말하는 시선을 끄는 PPT
디발자가 말하는 시선을 끄는 PPTJungwon An
 
Habits at Work - Merci Victoria Grace, Growth, Slack - 2016 Habit Summit
Habits at Work - Merci Victoria Grace, Growth, Slack - 2016 Habit SummitHabits at Work - Merci Victoria Grace, Growth, Slack - 2016 Habit Summit
Habits at Work - Merci Victoria Grace, Growth, Slack - 2016 Habit SummitHabit Summit
 

En vedette (20)

[피키캐스트] 5학년선배 ppt 템플릿 레이아웃
[피키캐스트] 5학년선배 ppt 템플릿 레이아웃[피키캐스트] 5학년선배 ppt 템플릿 레이아웃
[피키캐스트] 5학년선배 ppt 템플릿 레이아웃
 
컬러배스3
컬러배스3컬러배스3
컬러배스3
 
프롬(From)
프롬(From)프롬(From)
프롬(From)
 
게임의 정의
게임의 정의게임의 정의
게임의 정의
 
Bmg lecture note 20111102
Bmg lecture note 20111102Bmg lecture note 20111102
Bmg lecture note 20111102
 
SNS 를 통한 비즈니스 프로세스 실행 방안 - 프로세스 코디를 기반으로
SNS 를 통한 비즈니스 프로세스 실행 방안 - 프로세스 코디를 기반으로SNS 를 통한 비즈니스 프로세스 실행 방안 - 프로세스 코디를 기반으로
SNS 를 통한 비즈니스 프로세스 실행 방안 - 프로세스 코디를 기반으로
 
JBoss Community's Application Monitoring Platform
JBoss Community's Application Monitoring PlatformJBoss Community's Application Monitoring Platform
JBoss Community's Application Monitoring Platform
 
컬러배뜨
컬러배뜨컬러배뜨
컬러배뜨
 
디자인의 정의
디자인의 정의디자인의 정의
디자인의 정의
 
파이썬 class 및 인스턴스 생성 이해하기
파이썬 class 및 인스턴스 생성 이해하기파이썬 class 및 인스턴스 생성 이해하기
파이썬 class 및 인스턴스 생성 이해하기
 
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
스프링캠프 2016 발표 - Deep dive into spring boot autoconfiguration
 
[필립 코틀러] 마케팅관리론 해설강의 1장
[필립 코틀러] 마케팅관리론 해설강의 1장[필립 코틀러] 마케팅관리론 해설강의 1장
[필립 코틀러] 마케팅관리론 해설강의 1장
 
Kotler Keller 마케팅관리론 14판 요약 강의 1장. 마케팅 정의
Kotler Keller 마케팅관리론 14판 요약 강의 1장. 마케팅 정의Kotler Keller 마케팅관리론 14판 요약 강의 1장. 마케팅 정의
Kotler Keller 마케팅관리론 14판 요약 강의 1장. 마케팅 정의
 
Business model canvas(korean)
Business model canvas(korean)Business model canvas(korean)
Business model canvas(korean)
 
Alipay 이용 방법
Alipay 이용 방법Alipay 이용 방법
Alipay 이용 방법
 
What is business model?-비즈니스 모델이란?
What is business model?-비즈니스 모델이란?What is business model?-비즈니스 모델이란?
What is business model?-비즈니스 모델이란?
 
빅데이터 분석 시각화 분석 : 4장 빅데이터와 시각화 디자인
빅데이터 분석 시각화 분석 : 4장 빅데이터와 시각화 디자인빅데이터 분석 시각화 분석 : 4장 빅데이터와 시각화 디자인
빅데이터 분석 시각화 분석 : 4장 빅데이터와 시각화 디자인
 
발표자료만들때 알아야할 기본사항들
발표자료만들때 알아야할 기본사항들발표자료만들때 알아야할 기본사항들
발표자료만들때 알아야할 기본사항들
 
디발자가 말하는 시선을 끄는 PPT
디발자가 말하는 시선을 끄는 PPT디발자가 말하는 시선을 끄는 PPT
디발자가 말하는 시선을 끄는 PPT
 
Habits at Work - Merci Victoria Grace, Growth, Slack - 2016 Habit Summit
Habits at Work - Merci Victoria Grace, Growth, Slack - 2016 Habit SummitHabits at Work - Merci Victoria Grace, Growth, Slack - 2016 Habit Summit
Habits at Work - Merci Victoria Grace, Growth, Slack - 2016 Habit Summit
 

Similaire à Policy based Class Design

[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿해강
 
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2SeungHyun Hwang
 
프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들Lee Geonhee
 
분석과 설계
분석과 설계분석과 설계
분석과 설계Haeil Yi
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿AnselmKim
 
S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션codercay
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.Ryan Park
 
Android DI With Hilt
Android DI With HiltAndroid DI With Hilt
Android DI With HiltSSLEE14
 
Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Kyoung Up Jung
 
Pycon korea 2018 kaggle tutorial(kaggle break)
Pycon korea 2018 kaggle tutorial(kaggle break)Pycon korea 2018 kaggle tutorial(kaggle break)
Pycon korea 2018 kaggle tutorial(kaggle break)Yeonmin Kim
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Ryan Park
 
Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4연우 김
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)익성 조
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509영석 조
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Daum DNA
 
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...Taekyu Lim
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기Chris Ohk
 

Similaire à Policy based Class Design (20)

[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿[아꿈사] The C++ Programming Language 13장 템플릿
[아꿈사] The C++ Programming Language 13장 템플릿
 
HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2HolubOnPatterns/chapter2_2
HolubOnPatterns/chapter2_2
 
프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들프로젝트 관리 및 지켜야 할 사항들
프로젝트 관리 및 지켜야 할 사항들
 
분석과 설계
분석과 설계분석과 설계
분석과 설계
 
[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿[스프링 스터디 1일차] 템플릿
[스프링 스터디 1일차] 템플릿
 
Cygnus unit test
Cygnus unit testCygnus unit test
Cygnus unit test
 
S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션S#03 김용현:VS2010으로 마이그레이션
S#03 김용현:VS2010으로 마이그레이션
 
카사 공개세미나1회 W.E.L.C.
카사 공개세미나1회  W.E.L.C.카사 공개세미나1회  W.E.L.C.
카사 공개세미나1회 W.E.L.C.
 
Android DI With Hilt
Android DI With HiltAndroid DI With Hilt
Android DI With Hilt
 
Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기Django를 Django답게, Django로 뉴스 사이트 만들기
Django를 Django답게, Django로 뉴스 사이트 만들기
 
Pycon korea 2018 kaggle tutorial(kaggle break)
Pycon korea 2018 kaggle tutorial(kaggle break)Pycon korea 2018 kaggle tutorial(kaggle break)
Pycon korea 2018 kaggle tutorial(kaggle break)
 
Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005Working Effectively With Legacy Code - xp2005
Working Effectively With Legacy Code - xp2005
 
Design patterns
Design patternsDesign patterns
Design patterns
 
Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4Effective c++ 정리 chapter 4
Effective c++ 정리 chapter 4
 
이펙티브 C++ (7~9)
이펙티브 C++ (7~9)이펙티브 C++ (7~9)
이펙티브 C++ (7~9)
 
Sonarqube 20160509
Sonarqube 20160509Sonarqube 20160509
Sonarqube 20160509
 
Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기Devon 2011-b-5 효과적인 레거시 코드 다루기
Devon 2011-b-5 효과적인 레거시 코드 다루기
 
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
[2022]Flutter_IO_Extended_Korea_멀티모듈을활용한플러터클린아키텍처_...
 
EC 789
EC 789EC 789
EC 789
 
청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기청강대 특강 - 프로젝트 제대로 해보기
청강대 특강 - 프로젝트 제대로 해보기
 

Plus de lactrious

Layered System prototype
Layered System prototypeLayered System prototype
Layered System prototypelactrious
 
Preprocessor Programming
Preprocessor ProgrammingPreprocessor Programming
Preprocessor Programminglactrious
 
AWS GameServer Management
AWS GameServer ManagementAWS GameServer Management
AWS GameServer Managementlactrious
 
C# Game Server
C# Game ServerC# Game Server
C# Game Serverlactrious
 
Index Analysis
Index AnalysisIndex Analysis
Index Analysislactrious
 
Synchronizing concurrent threads
Synchronizing concurrent threadsSynchronizing concurrent threads
Synchronizing concurrent threadslactrious
 
omega design proposal
omega design proposalomega design proposal
omega design proposallactrious
 

Plus de lactrious (7)

Layered System prototype
Layered System prototypeLayered System prototype
Layered System prototype
 
Preprocessor Programming
Preprocessor ProgrammingPreprocessor Programming
Preprocessor Programming
 
AWS GameServer Management
AWS GameServer ManagementAWS GameServer Management
AWS GameServer Management
 
C# Game Server
C# Game ServerC# Game Server
C# Game Server
 
Index Analysis
Index AnalysisIndex Analysis
Index Analysis
 
Synchronizing concurrent threads
Synchronizing concurrent threadsSynchronizing concurrent threads
Synchronizing concurrent threads
 
omega design proposal
omega design proposalomega design proposal
omega design proposal
 

Dernier

공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화JMP Korea
 
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?Jay Park
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP Korea
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP Korea
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법JMP Korea
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP Korea
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP Korea
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석JMP Korea
 

Dernier (8)

공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화공학 관점에서 바라본 JMP 머신러닝 최적화
공학 관점에서 바라본 JMP 머신러닝 최적화
 
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
(독서광) 인간이 초대한 대형 참사 - 대형 참사가 일어날 때까지 사람들은 무엇을 하고 있었는가?
 
JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례JMP를 활용한 가속열화 분석 사례
JMP를 활용한 가속열화 분석 사례
 
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
JMP 기능의 확장 및 내재화의 핵심 JMP-Python 소개
 
데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법데이터 분석 문제 해결을 위한 나의 JMP 활용법
데이터 분석 문제 해결을 위한 나의 JMP 활용법
 
JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!JMP가 걸어온 여정, 새로운 도약 JMP 18!
JMP가 걸어온 여정, 새로운 도약 JMP 18!
 
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement MethodologyJMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
JMP를 활용한 전자/반도체 산업 Yield Enhancement Methodology
 
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
실험 설계의 평가 방법: Custom Design을 중심으로 반응인자 최적화 및 Criteria 해석
 

Policy based Class Design

  • 2. Modern C++ Design • Generic programming • Design Pattern Applied
  • 3. 단위전략 기반의 클래스 디자인 무엇인가? 왜 써야하나? 어떻게 구현하나? 무슨 장점이 있나? 무슨 장점이 있나?
  • 4. 단위전략policy 기반의 클래스 디자인 • 매우 단순한 동작이나 구조만을 갖는 작은 클래스(policy)들을 모아 서 복합된 기능을 하는 새로운 클래스를 만들어내는 디자인 방식 • 단위전략들은 서로 간에 연동되거나 조합되어 사용될 수 있으므로 다양한 결과물을 얻어낼 수 있음 policy classes host class
  • 5. 소프트웨어 디자인의 다양성 • 디자인 문제에 있어서 올바른 해법은? • 단일 vs 다중 스레드, 안정성 vs 성능, 감시자 vs 콜백, 가상 함수 vs 템플릿 • 소프트웨어 시스템 디자인은 문제를 해결하는 다양한 해법들 중 올 바른 방법을 끊임없이 선택하는 과정 • 유연하고, 안전하고, 사용자가 쉽게 조절할 수 있고 적절한 양의 코드로 다양성의 재앙과 맞서 싸우기 위한 방법은?
  • 6. Do-It-All 인터페이스의 문제점 • 모든 기능에 대한 인터페이스를 구현(Do-It-All 인터페이스)할 경우, • 기능이 런타임에 수행되므로 컴파일 시점에 검사할 수 있는 내용이 축소됨 문법적으로는 옳지만 의미상으로는 옳지 않은 코드가 만들어질 수 있음 • 서로 다른 디자인 요소들을 작은 별개의 클래스로 구현할 경우, • 지나치게 다양한 선택의 조합이 난립할 수 있음 • 미리 규정된 라이브러리 제한 조건보다는 사용자가 만든 디자인 스스로의 제한 조건을 가지도록 설계해야 함 • 프로그래머가 선택하고 커스터마이징을 할 수 있도록 설계해야 함
  • 7. 다중 상속이 해결책이 될 수 있을까요? • 잘 디자인된 기반 클래스 여러 개를 상속받는 것으로 될까? • 기반 클래스의 조합은 가능하지만 부족한 부분이 있음 • 다중 상속은 단지 기반 클래스들을 포개어놓고 멤버를 접근하기 위한 기능 이므로 상속된 컴포넌트들을 제어하거나 취합하는 것은 직접 해야 함 • 기반 클래스들은 자신이 모르는 클래스에 대한 작업을 해야 함 • 기반 클래스가 상태를 가질 경우 가상 상속을 이용해야만 함
  • 8. 템플릿의 이점 • 선택한 자료형에 따라 컴파일 시점에 코드를 컴파일러가 생성해줌 • 부분 특화Specialization를 통해 사용자가 특화된 기능 추가가 가능 • 다중 인자 클래스 템플릿의 부분 인자 특화로 인한 확장성 • 단점 • 멤버 변수 수준의 template 적용은 불가능 • 멤버 함수의 부분 특화는 불가능 • 다중 상속과 템플릿의 병용하여 라이브러리를 작성함
  • 9. template <class T, class U> class SmartPtr; template <class U> class SmartPtr<Widget, U> { // some codes }; template <class T> class Widget { void Fun() { /* codes */ } }; template <> void Widget<char>::Fun() { // some specialized codes } template <class T, class U> class Gadget { void Fun() { /* codes */ } }; template <class U> void Gadget<char, U>::Fun() { // compile error! } template <> void Gadget<char, int>::Fun() { // it’s ok! } 템플릿 인자를 부분 특수화할 수 있다. 완전 특수화를 하여 멤버 함수를 정의할 수는 있지만, 멤버 함수는 부분 특수화를 할 수 없다.
  • 10. 단위전략과 단위전략 클래스 • 단위전략 클래스: 단위전략에 대한 구현물 • 명시적 인터페이스 구현이 아니라 template에 의해 모호하게 정의됨 • 호스트 클래스: 단위전략을 사용하는 클래스 • 특정 부분을 마음대로 구성할 수 있는 효과적인 방법을 제공
  • 11. template <class T> struct OpNewCreator { static T* Create() { return T; } }; template <class CreationPolicy> class WidgetManager : public CreationPolicy { }; typedef WidgetManager<OpNewCreator<Widget>> MyWidgetMgr; template <class T> struct MallocCreator { static T* Create() { void* buf = std::malloc(sizeof(T)); return buf == nullptr ? nullptr : new (buf)T; } }; template <class T> struct PrototypeCreator { PrototypeCreator(T* pObj = nullptr) : pPrototype_(pObj) {} T* Create() { return pPrototype_ ? pPrototype_ > Clone() : nullptr; } T* GetPrototype() { return pPrototype_; } void SetPrototype(T* pObj) { pPrototype_ = pObj; } private: T* pPrototype_; }; 템플릿 인자로 합성해서 사용한다. 생성에 대한 각기 다른 단위전략을 구현하고, 모두 Create()라는 함수를 갖지만 명시적 interface는 없다. PrototypeCreator처럼 상태를 가질 수 있으므로 CreationPolicy를 상속받아 구현한다.
  • 12. 템플릿 템플릿 인자를 통한 구현 • 템플릿 템플릿 인자를 사용한 단위전략 구성 • 보다 유연한 코드를 작성할 수 있게 해줌 • 사용자가 보다 애플리케이션에 정확히 들어맞는 고유의 생성 전략 을 제공할 수 있음
  • 13. template <template <class Created> class CreationPolicy> class WidgetManager : public CreationPolicy<Widget> { void DoSomething() { Gadget* pW = CreationPolicy<Gadget>().Create(); } }; typedef WidgetManager<OpNewCreator> MyWidgetMgr; template <template <class> class CreationPolicy = OpNewCreator> class WidgetManager; 템플릿 템플릿 인자로 CreationPolicy를 받는다. 보다 편리하게 사용할 수 있도록 기본 단위전략을 지정해 줄 수 있다. 이 지점에서 Created는 의미가 없으므로 생략 가능하다. 생성 시 Type을 지정하지만 상속 시의 Type은 Widget이므로, PrototypeCreator일 경우 Gadget은 Widget을 상속받아야 한다.
  • 14. 템플릿 멤버 함수를 통한 구현 • 구형 컴파일러에서도 잘 동작함 • 템플릿 클래스에 비해 논의, 정의, 구현, 사용법이 까다로움 struct OpNewCreator { template <class T> static T* Create() { return new T; } };
  • 15. 단위전략 인터페이스의 보강 • 라이브러리가 아닌 사용자 자신이 어떤 단위전략 클래스를 사용 • 기능을 지원하지 않는 다른 단위전략 클래스를 사용하면 컴파일러 가 경고 typedef WidgetManager<PrototypeCreator> MyWidgetManager; // ... Widget* prototype = CreatePrototype(); MyWidgetManager mgr; mgr.SetPrototype(prototype); // ... PrototypeCreator 단위전략 함수를 갖게되어 인터페이스가 보강됨
  • 16. 단위전략 클래스의 소멸자 • 단위전략 클래스로 강제 casting 후 소멸자 호출 막기 위해 소멸자 를 protected로 변경 • 가상 소멸자를 정의하는 것은 불필요한 부담을 야기 typedef WidgetManager<PrototypeCreator> MyWidgetManager; MyWidgetManager mgr; PrototypeCreator<Widget>* creator = &mgr; delete creator; // ??? template <class T> struct PrototypeCreator { // ... protected: ~PrototypeCreator() {} };
  • 17. 불완전한 구체화를 통한 부가기능 • 템플릿에서 전혀 사용되지 않는 멤버 함수는 구체화 시 무시됨 • 컴파일러에 따라 다르지만 심볼 유효성 등 문맥적 검사는 하지 않음 template <template <class> class CreationPolicy> class WidgetManager : public CreationPolicy<Widget> { void SwitchPrototype(Widget* newPrototype) { CreationPolicy<Widget>& myPolicy = *this; delete myPolicy.GetPrototype(); myPolicy.SetPrototype(newPrototype); } }; OpNewCreator를 쓰면서 SwitchPrototype()을 부르지 않으면 OK PrototypeCreator를 쓸 경우 SwitchPrototype()을 불러도 OK
  • 18. 단위전략 클래스 간의 조합 • 호스트 클래스는 여러 단위 전략을 조합하여 다양한 동작을 정의할 수 있음 template < class T, template <class> class CheckingPolicy, template <class> class ThreadingModel > class SmartPtr; typedef SmartPtr<Widget, NoChecking, SingleThreaded> WidgetPtr; typedef SmartPtr<Widget, EnforceNotNull, SingleThreaded> SafeWidgetPtr;
  • 19. template <class T> struct NoChecking { static void Check(T*) {} }; template <class T> struct EnforceNotNull { static void Check(T* ptr) { if (!ptr) throw NullPointerException(); } }; template < class T, template <class> class CheckingPolicy, template <class> class ThreadingModel > class SmartPtr : public CheckingPolicy<T> , public ThreadingModel<SmartPtr<T, CheckingPolicy, ThreadingModel>> { public: T* operator -> () { typename ThreadingModel<SmartPtr>::Lock guard(*this); CheckingPolicy<T>::Check(pointee_); return pointee_; } private: T* pointee_; }; 적절한 단위전략을 선택하여 어떠한 동작을 할지 결정할 수 있다.
  • 20. 단위전략 클래스를 통한 커스터마이징 • 단위전략과 상속을 사용하여 클래스의 구조를 변경 template <class T> class DefaultSmartPtrStorage { public: typedef T* PointerType; protected: PointerType GetPointer() { return ptr_; } void SetPointer(PointerType ptr) { ptr_ = ptr; } private: PointerType ptr_; }; template < class T, template <class> class Storage = DefaultSmartPtrStorage > class SmartPtr : public Storage<T> {}; T*가 아닌 type에 대해서도 사용하기 위해 Storage 추상화 Storage에 필요한 저장 구조를 포함하기 위해 상속
  • 21. 호환/비호환 단위전략 • 호환 가능한 단위전략을 위해 단위전략 간의 형변환 구현(복사 생성자 나 형변환 연산자) 후 단위전략 단위로 복사를 하도록 구현 template < class T, template <class> class CheckingPolicy> class SmartPtr : public CheckingPolicy<T> { template < class T1, template <class> clsas CP1> SmartPtr(const SmartPtr<T1, CP1>& other) : pointee_(other.pointee_), CheckingPolicy<T>(other) {} }; 다른 policy를 갖는 SmartPtr을 인자로 받아서, policy의 복사 생성자를 불러준다. 때문에 policy간의 복사 생성자가 구현되어 있을 때만 허용된다.
  • 22. 클래스를 단위전략으로 분리해 내기 • 극단적인 경우 호스트 클래스는 단위전략의 집합체로만 표현됨 • 이 경우 템플릿 인자가 지나치게 많아지는 경우가 있지만, 장황한 정의는 장황한 구현에 비해 코드 이해와 유지보수 측면에서 별 문제 가 되지 않는다. • 비독립 단위전략을 피해야 함 • 어쩔 수 없다면 캡슐화를 포기하고 의존성 최소하는 방향으로 분리 • 예) Array 단위전략과 Destroy 단위전략의 충돌
  • 23. 요약 • 단위전략 클래스 구현 • 적은 수의 기본적인 장치들을 조합해서 유연한 코드를 생성해야 함 • 사용자들도 자신만의 구현체를 만들 수 있어야 함 • 인터페이스 보강, 커스터마이징, 형변환 유연성 • 클래스 분리 • Trade-off 관계거나 다양한 방법으로 구현될 수 있다면 찾아내어 분리 • 다른 단위전략에 영향을 끼치지 않도록 독립적으로 구현