본문 바로가기

Language/C++ Design Pattern

(7)
Visitor 패턴 (std::variant) (C++ 소프트웨어 디자인 책 정리)  앞서 구현한 Visitor 패턴을 std::variant, std::visit을 사용해서 구현해보자. std::variantstd::variant 는 변수를 여러 타입을 선택하여 만든 후 선택한 타입 중 하나만 담을 수 있다.아래 main() 예시를 보자.int main(){ //0으로 초기화한 'int'를 담고 있는 기본 variant를 생성한다. std::variant v{}; v = 42; //'int' 형 에 대입 v = "Hyojin" // 문자열 string 에 대입 v = 3.14 // 'double' 대입 int tmp = std::get(v); // 값에 직접 접근한다 (참조형으로 return) int pTmp = std::get..
Visitor 패턴 (C++ 소프트웨어 디자인 책 정리) 비지터 디자인 패턴은 GoF 서술한 고전적인 디자인 패턴 중 하나다. 타입보다는 연산을 자주 추가할 수 있게 하는데 중점을 둔다.비지터 패턴의 의도는 객체 구조의 요소에 대해 수행할 연산을 나타낸다. 비지터를 사용하면 연산 대상 요소의 클래스를 변경하지 않고 새 연산을 정의할 수 있다. 아래 shape의 상송 계통을 보자 위 UML 에서 Shape클래스는 특정 도형에 대한 기초 클래스다. 지금 예에서는 Circle, Square, Trapezoid  클래스가 있다. 위 구조를 가지고 유지보수를 하던 중 새로운 연산 'rotate 함수' 를 구현해야 한다고 하자. Shape 클래스에 'rotate'연산을 추가하고 직접 정의한 파생 타입은 약간의 추가 노력으로 훌훌 털어..
DIP 원칙 의존성 역전 원칙(Dependency Inversion Principle, DIP) (C++ 소프트웨어 디자인 책 정리)가장 유연한 시스템은 소스 코드 의존성이 구체화(concretion)가 아닌 추상화만 참조하는 시스템이다. 이 원칙은 의존성을 위해 구체 타입이나 구현 상세 대신 추상화에 의존할 것을 조언한다.상속 계통에 대해서는 아무 말도 하지 않고 일반적인 추상화만 언급한다. 지금부터 자동 입출금기(ATM)의 논리를 구현한다고 생각해보자. ATM은 인출, 입금, 송금 등 여러가지 연산을 제공한다. 이 모든 연산은 실제 돈을 다루므로 완전히 완료하거나 오류가 있으면  중단하고 모든 변경을 되돌려야 한다. 이런 행위를 일반적으로 transaction 이라고 한다.결과적으로 Transaction이라는 추..
LSP 원칙 리스코프 치환 원칙 (C++ 소프트웨어 디자인 책 정리)하위 타입(subtype) 요구 사항: ψ(x) 를 T 타입 객체 x에 대해 증명할 수 있는 특성이라 하자. 이 때 S가 T의 하위 타입이라면 ψ(y)는 S 타입 객체 y에 대해 참이어야한다. LSP는 세 번쨰 SOLID원칙이며 행위적 서브타이핑, 즉 추상화로 기대하는 행위와 관련이 있다.이 원칙은 흔히 IS-A 관계라고 하는 것을 공식화 한다. 이 관계, 즉 추상화의 기대를 하위타입에서 반드시 따라야 한다.Struct X{ virtual ~X() = default; // 사전 조건: 함수는 0보다 큰 모든 'i'를 받아들인다 virtual void f( int i) const { assert(i > 0); // ... }};..
OCP 원칙 개방-폐쇄 원칙(Open-Close Principle OCP)(C++ 소프트웨어 디자인 책 정리)(클래스, 모듈, 함수 등) 소프트웨어 산출물은 확장에는 열려 있지만 수정에는 닫혀 있어야 한다. OCP는 소프트웨어를 확장할 수 있어야 한다고 말한다(확장에 열려 있음). 하지만 확장이 쉬워야 하고, 최선의 경우 새 코드를 추가하는 것만으로 확장 가능해야 한다. 즉, 기존 코드를 수정할 필요가 없어야 한다(수정에 닫혀 있음). 위 원칙을 설명하기 앞서 다른 원칙에서 설명을 했던 Document 클래스를 살펴보자.class Document{ public: // ... virtual ~Document() = default; virtual void exportToJSON( /*...*/ ) const ..
ISP 원칙 인터페이스 분리 원칙 (Interface Segregation Principle ISP)(C++ 소프트웨어 디자인 책 정리)사용하지 않는 메서드에 클라이언트가 의존하도록 강요해서는 안 된다. 앞서 SRP 법칙의 document  예제를 다시 보자.이번에는  document 클래스의 개별 함수가 아닌 전체 인터페이스에 집중한다.class Document{ public: // ... virtual ~Document() = default; virtual void exportToJSON( /*...*/ ) const = 0; virtual void serialize( ByteStream bs, /*...*/) const = 0; //...}; Document에는  JSON 내보내기와 직렬화를 모두..
SRP 원칙 단일 책임 원칙 (Single-Responsibility Principle SRP)(C++ 소프트웨어 디자인 책 정리) 클래스를 변경하는 이유는 단 하나여야 한다.모든 것은 오직 한가지 일만 해야 한다. 설명이 모호한데, 이 법칙의 아이디어는 항상 같다. 즉, 진정 함께 속하는 것만 하나로 묶고 엄격히 속하지 않는 것은 모두 분리한다.바꿔말하면, 여러가지 이유로 변경하는 것을 분리한다.이렇게 함으로써 코드의 서로 다른 관심사 사이에 인위적인 결합을 낮추고 소프트웨어가 변경에 . 더 잘 적응할 수 있게 돕는다.최선의 경우 소프트웨어의 특정 측면을 정확히 한 곳에서 변경할 수 있다. 인위적인 결합 예코드 예제로 관심사 분리를 설명해 보자. 아래 Document 추상 클래스 보면,class Document{ ..