Booch and Rumbaugh’s Unified Notation 0.8

UML 탄생 이전에 존재했다고 판단되는, 부치의 Diagram이라고 생각됩니다. 간단하고 명확하며, 특히 개발자에게는 꼭 필요한 내용을 전달하는 좋은 다이어그램 같습니다.


별다른 설명이 없이도 명확합니다. 비록 클래스 관계만을 제시하지만, UML에서 개발자에게 클래스 관계도가 가장 최고의 설계문서 아니겠습니까?

정리하는 차원에서 살펴보면… Base Class를 기준으로하여 .. “Base Class”가(주어) “Used”를 사용하며.. “Had by Reference”와 “Had By Value”를 맴버 변수로 가지고 있는데, 각각 참조(C++에서는 포인터*나 참조형&)으로 가지고 있다는 의미이고 “Derived 1″과 “Derived 2″에 대한 부모 클래스라는 것입니다. 지금의 클래스 관계도(UML에서)를 처음 접하는 초보 사용자에게 있어서 Composition이냐? Aggregation이냐? 라는 애매모한 정의가 없다는 점이 매우 매력적입니다.

한번쯤 숙지해 놓고, 사용해 볼만한 다이어그램이라고 생각됩니다.

사용하기 간단한 Memory Pool 클래스

프로젝트 진행 중에, 다중 스레드에서 사용할 Memory Pool 클래스를 인터넷을 통해 검색해보다가 마땅히 사용만하다 판단되는 것이 없어 직접 만들어 사용하고 있는 클래스입니다. 물론 기존에 공개된 Memory Pool 클래스의 기능이 좋지 않다는 것이 아니라, 제 기준, 수준에 너무 사용하기가 어렵고 복잡하다는 생각에서입니다. 물론 그 기능과 성능은 뛰어나겠지만 말입니다. 이에.. 사용하기 쉽고, 매우 간단하게 적용할 수 있는 메모리풀 클래스를 공개해 봅니다.

먼저 사용 방법은 아래와 같습니다. 전역변수로 CMemoryPool을 생성해 놔야 합니다. 싱글리톤 패턴을 적용해야할테지만.. .일단 적용하지 않았습니다. 다른 분께서 적용해 보시고 공개해주시면 매우 영광이겠습니다.

#include "MemoryPool.h"

CMemoryPool MP(10, 1024*1024);

생성자 중 첫번째 인자는 메모리풀에 생성할 메모리 덩어리의 개수이고 두번째 인자는 메모리 덩어리의 크기입니다. 즉, 여러개의 스레드에서 동시에 10개의 메모리 덩어리를 얻어 사용할 수 있으며, 한 덩어리의 크기가 1메가라는 의미입니다.

메모리 덩어리를 얻어 사용하는 방법은 다음과 같습니다.

CMemoryPool::MEMORY_DESC *pMD = MP.Take();

BYTE *pBuffer = pMD->pBuffer; 

// .
// .
// use memory ..
// .
// .

MP.Release(pMD);

다 사용했으면 최종적으로 Release를 호출해줘서 메모리 풀에 반환해줘야 함을 잊어서는 않됩니다. 아무쪼록…. 저처럼 쉽게 사용할만한 메모리풀 소스 코드를 찾지 못하신 분들에게 도움이 되시길 바랍니다.

공간검색 알고리즘 문서

예전에 찾아서 한번(?) 읽어본 공간검색에 관련된 알고리즘 문서입니다. 깨끗하게 출판된 알고리즘 서적에 나와 있는 것보다 훨씬 더 나은, 더 정확한 정보를 얻을 수 있을 겁니다.

알고리즘은 다음과 같습니다.

  • R*-Tree
  • R-Tree
  • X-Tree

필요하신분은 한번 꼭 살펴보시길 바랍니다. 대부분… 이 알고리즘을 그대로 사용하지 않고 나름대로 약간 변형/응용하여 활용합니다. 참고로 살펴보시고 힌트로써 활용하여 자기 나름대로 적용을 하시길 바랍니다.

Patterns in “PATTERN-ORIENTED SOFTWARE ARCHITECTURE”

Layer A.P. 어플케이션을 구조화하기 위해 서브 태스크(Subtask)들을 그룹으로 묶기 위해 분해한다. 공통된 추상 레벨에 있는 서브 태스크들끼리 묶어서 그룹으로 분류한다.

Pipes and Filters A.P. 데이터 스트림을 처리하는 시스템 구조를 제공한다. 각 프로세싱 단계는 필터 컴포넌트로 추상화한다. 데이터는 파이프를 통해 연관된 필터들에게 전달된다. 필터들을 다양하게 재조합하여 시스템을 재구축할 수 있다.

Blackboard A.P. 정의되지 않은 도메인에서의 문제를 해결할때 유용하다. 솔루션에 대한 부분적이거나 대략적인 해법을 수립하기 위해 몇가지 특수한 서브시스템들의 지식을 조합한다.

Broker A.P. 분산 소프트웨어 시스템을 구조화할때 유용하다. 분산 소프트웨어 시스템은 분리된 컴포넌트들이 서로 유기적으로 조합되어 운영되는 시스템으로, 이러한 컴포넌트들 간의 통신을 관장하는 역활을 하는 것이 Broker이다.

Model-View-Controller A.P. 모델은 핵심기능과 데이터를 의미하고 뷰는 기능에 의한 데이터의 표현이며 컨트롤은 사용자의 입력에 대한 처리이다. 뷰와 컨트롤러는 사용자의 인터페이스를 구성하며 사용자 인터페이스와 모델간의 일관성 및 정합성을 보장한다.

Presentation-Abstraction-Control A.P. 계층구조를 이루는 에이전트들이 상호작용하는 소프트웨어 시스템에 대한 패턴. 각각의 에이전트는 하나의 어플리케이션의 특정 부분을 전담하며 에이전트는 프리젠테이션/추상/컨트롤로 구성된다.

Microkernel A.P. 변화하는 시스템에 대한 요구사항을 수용할 수 있도록 하는 패턴. 시스템에서 가장 최하단에 위치하는 핵심 기능을 추출해 내며, 추가된 요구사항에 대해 확장기능으로 정의하여 시스템에 손쉽게 추가할 수 있도록 한다.

Reflection A.P. 소프트웨어 시스템의 구조와 동작을 동적으로 변경할 수 있는 메커니즘을 제공.

Whole-Part D.P. 전체(Whole) 객체를 구성하는 컴포넌트(Part)를 정의한다. Whole 객체를 통해 Part 컴포넌트들의 관계를 맺으며, 이 Whole 객체를 통해서만 Part 컴포넌트와 통신할 수 있다.

Master-Slave D.P. 마스터 컴포넌트는 슬레이브 컴포넌트에게 작업을 분산시켜서 최종적으로 슬레이브로부터 그 결과를 취합한다.

Proxy D.P. 실제 컴포넌트가 아닌 대리자를 앞단에 두어 이 대리자를 통해 실제 컴포넌트와 통신을 한다. 실제 컴포넌트의 위치 추상화, 실제 컴포넌트를 사용하기 위한 인증 등과 같은 전처리는 물론 후처리에 대한 기능 추가가 용이하다.

Command Processor D.P. 사용자의 요청을 하나의 객체로 정의하여 관리하며 Undo/Redo와 같은 처리가 가능하다.

View Handler D.P. 시스템의 모든 뷰를 관리하는 책임을 분리하여 뷰들 간의 관계성과 연관된 작업을 쉽게 처리할 수 있도록 한다.

Forwarder-Receiver D.P. 투명한 IPC를 제공하고 Peer를 분리하기 위해 Forwarder와 Receiver를 분리한다.

Client-Dispatcher-Server D.P. 클라이언트와 서버 사이에 디스패처 레이어를 도입한다. 위치 투명성을 제공하고 클라이언트와 서버간의 통신에 대한 세부적인 구현을 캡출화한다.

Publisher-Subscriber D.P. 서로 긴밀하게 관계를 맺고 있는 컴포넌트들 간의 상태에 대해 정합성을 유지하는데 용이하다. Publisher가 책임을 지고 하나의 변경에 대해 다수의 Subscriber에게 변경을 통지한다.