시작은 미미하나 끝은 쥬쥬하리라.

Develop/Practical Coding 6

[C++] 소유권(Ownership)과 소속(Belonging)의 분리, 그리고 bool 플래그 소유권 이전의 함정

목차소유권과 소속bool 플래그 소유권 이전의 함정요약1. 소유권과 소속소유권(Ownership) : 이 객체를 delete 할 책임이 누구에게 있는가. 소유자는 하나여야 하고, 소유자가 사라질 때 소유물도 함께 정리되어야 함.소속(Belonging) : 이 객체가 어느 컨텍스트에 속해 있는가. 수명 책임과는 무관. 오브젝트 트리를 다루는 코드에서 이 둘을 혼동하면 이름이 거짓말을 하기 시작함. class ObjectBase{protected: ObjectBase* m_pOwner; // 위(소속)를 가리키는 화살표 하나public: ObjectBase( ObjectBase* pOwner = NULL ) : m_pOwner(pOwner) {} virtual void ..

[C++] 데이터와 표현의 분리(Data-Presentation Separation)와 부속 객체의 좌표 차용

목차데이터와 표현의 분리부모 사각형을 빌려 쓰는 부속요약1. 데이터와 표현의 분리편집 도구는 성격이 다른 두 종류의 객체를 다룸.전역 테이블이 소유하는 데이터 항목 화면에 놓여 실제로 그려지는 시각 객체. 데이터와 표현의 분리 : 하나의 데이터가 여러 곳에 서로 다른 모양으로 표시될 수 있으므로, 좌표와 선택 상태를 데이터 쪽에 두지 않는 설계 원칙. class ObjectBase // 루트. 직렬화·빌드 계약만 정의{public: virtual int Read (Reader* r) = 0; virtual int Write(Writer* w) = 0; virtual int Build(Stream* s) = 0;};class SceneEleme..

[C++] Composite 패턴과 파생 상태·좌표계 설계

목차Composite 패턴복합 오브젝트의 세 가지 설계 결정요약1. Composite 패턴 Composite 패턴 : 하나짜리와 여러 개 묶음을 같은 타입으로 취급해서, 쓰는 쪽이 둘을 구분하지 않게 하는 것. // 쓰는 쪽 코드pItem->MoveTo(rtFrom, rtTo);pItem->Draw(pPainter);pItem->Write(pWriter); - pItem 이 도형 하나든 도형 100개를 묶은 그룹이든 이 코드는 동일함.-> 그룹은 받은 호출을 자식들에게 그대로 넘기기만 하면 됨. 공통 인터페이스 DrawableBase Draw / MoveTo / Read / Write ...잎(Leaf) RectItem 자식이 없다. 자기 일만 한다복합(Composite..

[C++] 복합 오브젝트의 분류 축과 낡은 설계를 판정하는 기준

목차복합 오브젝트의 분류 축낡은 설계를 판정하는 기준요약1. 복합 오브젝트의 분류 축 그래픽 편집기(작화툴, 다이어그램 툴, UI 디자이너)를 오래 유지보수하면 그려지는 것의 베이스 클래스에 자식이 수십 개 쌓인다. DrawableBase 의 직속 자식 (42개) 순수 도형 Arc Line Poly Rectangle Text Image PipeLine ... 표 형태 RecordTable ChartTable SeriesTable HistoryTable ... WebItem -> 자식 19개 ContainerItem -> 자식 16개 (RecordPanel, ChartPanel, SeriesPanel ...) GroupItem - 목록은 평평한 하나의 리스..

[C++] 2단 상속 분리와 컴파일러가 강제하지 않는 설계 규칙

목차2단 상속 분리컴파일러가 강제하지 않는 규칙요약1. 2단 상속 분리 그래픽 편집기(작화툴, 다이어그램 툴, UI 디자이너)를 만들면 캔버스 위의 객체를 담을 베이스 클래스가 필요해짐. 이때 베이스를 한 겹으로 두느냐 두 겹으로 두느냐가 첫 갈림길. // 한 겹 — 캔버스 객체의 모든 속성을 한 클래스에class CanvasItem{protected: unsigned int m_id; std::string m_name; Rect m_bounds; Color m_edgeColor; bool m_isSelected;}; - 단순하고, 대부분의 경우 이걸로 충분함.-> 문제는 그려지지 않는 요소가 등장하는 순간 발생. 그려지지 않..

[C++] 오브젝트 공통 계약(Read/Write/Build) 설계와 스트림 오염 방지

목차오브젝트 공통 계약응용/심화요약1. 오브젝트 공통 계약작화 툴은 사용자가 캔버스에 오브젝트를 그리고, 그 결과를 파일로 저장하고, 다시 불러오고, 최종적으로 장비에서 동작할 산출물로 변환하는 구조를 가짐. 이때 오브젝트 종류는 계속 늘어남.-> 사각형, 텍스트, 이미지 같은 단순 도형부터 게이지, 트렌드 그래프, 알람 목록 같은 복합 오브젝트까지.=> 따라서 "오브젝트가 늘어날 때 어디를 고쳐야 하는가"가 이 구조의 핵심 설계 판단. 두 가지 접근1. 중앙 집중 방식저장을 담당하는 클래스 하나가 모든 타입을 알고 분기 처리. void CProjectSaver::Save(CShapeBase* pObj, CWriter* pWriter){ switch (pObj->GetType()) { ..

반응형