분류 전체보기 299

프로토타입 패턴(Prototype Pattern)

이미 만들어진 객체(프로토타입, 원형)을 복사하여 새로운 객체를 생성하는 패턴입니다. 무에서 유를 창조하는 것은 드물다. 이미 존재하는 객체를 복제하여 사용하거나 일부를 수정하여 사용합니다. 이러한 것들이 프로토타입 패턴의 아이디어입니다. 프로토타입 패턴은 객체의 깊은 복제를 수행하되 매번 전체 초기화를 하는 대신 미리 부분적으로 만들어진 객체를 복제하여 약간의 수정만으로 이용할 수 있게합니다. 이 과정에서 원본 객체에 대한 걱정은 하지 않아도 되게 해줍니다. 객체 생성 복잡한 생성을 거쳐 잘 갖추어진 객체가 있다면 이 객체를 그대로 복제하는 것이 좋은 방법입니다. 프로토타입 패턴은 객체의 복제가 주요 기능이다. 복제를 하는 여러 방법들이 알아봅시다. 평범한 중복 처리 복제 대상 객체의 모든 항목이 값으..

팩토리 패턴(Factory pattern)

객체 생성을 대리하여 처리하는 것을 통칭하는 관용어로 팩토리라 부릅니다. 이것을 팩토리 패턴으로 부르는 사람도 있지만 엄밀히는 아닙니다. 팩터리는 두 가지중 하나입니다. 객체를 어떻게 생성하는지 알고 있는 "클래스" 호출했을 때 객체를 생성하는 "함수" 팩터리 메서드 생성할 타입의 멤버 함수로 객체를 생성하여 리턴합니다. 이 메서드는 생성자를 대신합니다. static 함수로 직교좌표 Point와 극좌표 Point를 생성하는 코드입니다. class Point { protected: Point(const float x, const float y) : x{x}, y{y} {} public: float x, y; static Point NewCartesian(float x, float y) { return{ x..

빌더 패턴(Builder Pattern)

빌더 패턴은 여러 복잡한 요소들의 조합이 필요한 객체를 생성해야 하거나 여러 개의 다양한 객체 집합을 생성해야 할 때 객체 생성만을 전담하는 컴포넌트를 정의하여 객체 생성을 간편하게 하는 것입니다. 이해가 되지 않으면 예제 코드를 보면 쉽게 이해가 되겠죠. House house = HouseBuilder::.buildWalls(). .buildDoors(). .buildWindows(). .buildRoof() .buildGarage() .getReulst(); Email mail = Email::make().from("me@mail.com") .to("you@mail.com") .subject("C++ builders") .body("I like this API, don't you?"); 컴포지트 빌더..

Inheritance(상속) 그리고 Composition(구성)

다음은 언랭의 창시자 Joe Armstrong의 유명한 "고릴라 바나나 문제"의 인용입니다. I think the lack of reusability comes in object-oriented languages, not functional languages. Because the problem with object-oriented languages is they’ve got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle. https://www.johndcook.com/blo..

C++ Core Guidlines 함수

함수 정의 규칙: F.1: 의미있는 동작들을 "묶어서" 함수로 만들고 신중하게 이름을 지어라 F.2: 함수는 하나의 논리적 동작만 수행해야 한다 F.3: 함수는 간결하고 단순하게 유지하라 F.4: 함수가 컴파일 시간에 평가되어야 한다면 constexpr로 선언하라 F.5: 함수가 매우 짧고 수행시간이 중요하다면 inline으로 선언하라 F.6: 함수가 예외를 던지지 않는다면 noexcept로 선언하라 F.7: 보편성을 고려한다면, 스마트 포인터 대신에 T*나 T& 타입의 인자를 사용하라 F.8: 순수 함수를 선호하라 F.9: 사용되지 않는 인자는 이름이 없어야 한다 매개변수 전달 표현(parameter passing expression) 규칙: F.15: 정보를 전달 할 때 단순하고 관습적인 방법을 선호..

C++ Core Guidlines 인터페이스

Interface I.1: 인터페이스는 명확하게(explicit) 작성하라 I.2: const가 아닌 전역변수를 지양하라 I.3: 싱글톤 패턴을 지양하라 I.4: 인터페이스가 타입 시스템을 정확하고 엄격하게 준수하도록 만들어라 I.5: (하나라도 있다면) 사전 조건을 기술하라 I.6: 사전 조건을 표현하고 싶다면 Expects()를 사용하라 I.7: 사후 조건을 기술하라 I.8: 사후 조건을 표현하고 싶다면 Ensures()를 사용하라 I.9: 인터페이스가 템플릿이라면 컨셉(Concept)을 사용해서 매개 변수를 문서화하라 I.10: 요구된 작업의 수행 실패를 알리기 위해 예외를 사용하라 I.11: 원시 포인터(T*) 혹은 참조(T&)를 사용해 소유권을 전달하지 마라 I.12: null이 되어선 안되는 ..

C++ Core Guidlines 철학

P.1: 아이디어를 직접 코드로 표현하라 P.2: ISO 표준 C++로 작성하라 P.3: 의도를 표현하라 P.4: 이상적으로 프로그램은 정적으로 타입 안전해야 한다 P.5: 런타임 검사보다는 컴파일 타임 검사를 선호하라 P.6: 컴파일 타임에 검사할 수 없다면 런타임에 검사할 수 있어야 한다 P.7: 런타임 오류는 초기에 잡아라 P.8: 리소스가 새도록 하지 마라 P.9: 시간이나 공간을 낭비하지 마라 P.10: 변경 가능한 데이터보다 변경 불가능한 데이터를 더 자주 사용하라 P.11: 복잡한 생성과정은 캡슐하라 P.12: 지원 도구를 적절히 활용하라 P.13: 지원 라이브러리를 적절히 활용하라 아이디어를 직접 코드로 표현해라 첫번째 month 함수는 명확히 Month를 반환하도록 선언되어 있으며, Da..

C++ Core Guidlines 소개

C++ 표준 위원회에서 작성한 C++ 핵심 가이드 라인입니다. C++ Core Guidelines는 비야네 스트롭스트룹이 주축이 되어 작성되었으며 작성되고 있습니다. 이 가이드 라인의 목적은 사람들이 모던 C++을 효과적으로 사용하도록 돕는 것입니다. 원문 : https://github.com/isocpp/CppCoreGuidelines isocpp/CppCoreGuidelines The C++ Core Guidelines are a set of tried-and-true guidelines, rules, and best practices about coding in C++ - isocpp/CppCoreGuidelines github.com 한글화 : https://github.com/CppKorea/C..

AnkhSVN Visual Studio 2019 설치 하기

최신 AnkhSVN 버젼은 Visual Studio 2019를 지원하고 있지 않습니다. vsix 파일의 사용 가능 솔루션 정보를 수동으로 수정해주면 사용가능하게 할 수 있습니다. https://ankhsvn.open.collab.net/에서 최신 ankhsvn을 다운로드 받습니다. 확장자 vsix를 zip으로 변경합니다. 압축을 풉니다. extension.vsixmanifest [15.0,16.0)를 [15.0,17.0)로 변경합니다. Change the prerequisite in this way: catalog.json Microsoft.VisualStudio.Component.CoreEditor 찾아서 "[15.0,)"로 변경합니다. manifest.json Microsoft.VisualStudio..

각종 팁/svn 2019.11.11

Boost.DI 소개

DI는 Dependency Injection(의존성 주입)입니다. 어떤 클래스가 의존하는 클래스의 인터페이스를 도입하여 의존성을 독립화하고 런타임에 의존 클래스를 결정할 수 있게끔 하는 기법입니다. 의존 클래스를 런타임에 적절한 것으로 "삽입" 한다고 해서 의존성 주입이라 합니다. 예) 전등의 전구 슬롯, 장난감의 건전지 슬롯 등등... ILogger를 ConsoleLogger에 연결한다. ILogger를 요청하면 ConsoleLogger를 전달한다. 가장 큰 장점은 di::bind().to()코드에서 ConsoleLogger를 다른 클래스로 바꾸어 주면 injector를 사용하여 생성한 모든 Car의 Logger를 바꿀 수 있다는 것입니다. #include #include using namespace ..