본문 바로가기

개발일지/아키텍트15

Delphi 투게더의 Observer 패턴 소스 오류 최근 XE2 에서 패치되었는지 모르겠지만, 투게더가 Delphi 에 포함되고 난 이후(2006부터~) 지금까지 이 소스 버그는 사라지지 않고 있다. 나야 UML 작성시 투게더를 사용하고 있지 않아 그냥 수정한 소스를 쓰고있지만, 만약 Pattern Organizer 에 등록된 Observer 패턴을 사용하여 소스를 생성하는 경우라면 네이티브 환경에서 사용시 AV 에러가 발생한다. 패치한 소스는 다음과 같다. IObserver = interface procedure UpdateObserver(ASubject: TSubject); // 폼에서도 사용할 수 있게 메소드명을 변경함 end; TSubject = class strict private var FObservers: TList; strict protec.. 2012. 4. 19.
POSA2, Double-Checked Locking Optimization 패턴 이 녀석도 그렇게 대단한 놈은 아니지만, 멀티 스레드 환경에서 Singleton 을 사용하는 경우라면 꼭 기억해 둘 필요가 있겠다. 내 경우 Delphi 에서 보통 다음처럼 Singleton 을 작성한다. TSingleton = class protected class var Instance: TSingleton; constructor Create; destructor Destroy; override; public class function GetInstance: TSingleton; class procedure ReleaseInstance; end; { TSingleton } constructor TSingleton.Create; begin inherited; end; destructor TSinglet.. 2012. 4. 9.
POSA2, Scoped Locking, Strategized Locking 패턴 POSA2 의 동기화 관련 패턴들 중 가장 기본이라고 할 수 있는 Scoped Locking 은 사실 별 거 없다. 이런걸 굳이 패턴으로 불러야하나....싶은 부류 중 하나이다. 닥치고 소스~ TGuard = class protected FLock: TSynchroObject; FOwner: Boolean; public constructor Create(ALock: TSynchroObject); destructor Destroy; override; procedure Acquire; procedure Release; end; { TGuard } procedure TGuard.Acquire; begin if Assigned(FLock) then begin FLock.Acquire; FOwner := True.. 2012. 4. 5.
Proactor with EPOLL, SELECT IOCP 를 사용한 Proactor 구현( 2012/02/13 - [프로그래밍/OOP] - Proactor with IOCP )은 비교적 많은 곳에서 소개가 되고있지만, EPoll 과 같은 놈을 Proactor 로 구현하는 경우는 거의 없어 보인다.;; 아무튼 앞으로 사용할 통신 프레임워크에 멀티플랫폼이라는 사치품(?)을 달 계획을 추가하다보니 EPoll 이나 KQueue 혹은 기존 POSIX 류의 Select 디스패치도 같은 구조 속에 녹일 필요가 생겼다. Proactor 냐? Reactor 냐? 잠시 고민했지만~ 아무래도 개인적으로 아직까지 메인 개발은 윈도우즈인지라 IOCP 와 최고의 궁합을 보여주는 Proactor 기반으로 설계해보았으며~ 개발 작업은 기본적인 에코 서버를 구현 & 테스트하는 형태.. 2012. 3. 15.
Delphi 에서 Leader-Follower 패턴 구현 POSA2 에서 Leader-Follower 패턴의 경우 pthread 기반으로 구현하여 설명하고 있다.( 2012/03/09 - [프로그래밍/Lazarus] - FPC 에서 Leader-Follower 패턴 구현 ) 이를 Windows 기반으로 작성해보았다. unit DLNA.Thread; interface uses Winapi.Windows, System.SysUtils, SyncObjs; const NO_CURRENT_LEADER = 0; type TGuard = class protected FMutex: TMutex; FOwner: Boolean; public constructor Create(AMutex: TMutex); destructor Destroy; override; procedure A.. 2012. 3. 14.
FPC 에서 Leader-Follower 패턴 구현 FPC 에서 pthread 기반 Leader-Follower 패턴을 구현하였다. Unbound thread set 이며, 사용 용도는 Worker Thread Pool 정도~ 예외 처리 등 많이 다듬어야하지만~ 일단 관련 소스 첨부~ unit DLNA_Thread; {$mode objfpc}{$H+} interface uses Classes, SysUtils, BaseUnix, pthreads; const NO_CURRENT_LEADER = 0; type TPThreadParameter = record Mutex: ppthread_mutex_t; Condition: ppthread_cond_t; Terminated: Boolean; Suspended: Boolean; Owner: TObject; end;.. 2012. 3. 9.
POSA, 패턴 시스템 패턴 시스템에 대하여 마인드 맵으로 정리해보았다. 패턴 분류와 관련하여 GoF 디자인 패턴의 목적(purpose)과 범위(scope) 분류에 대한 부정적 서술이 눈에 띈다. 게다가 이 글을 작성한 사람은 GoF 패턴 집필진 중 한명인 Richard Helm 이다. 아울러 패턴 분류를 위한 분류 스키마를 제안하고 있는데 꽤 괜찮아보인다.(도입해야지~^^) 아키텍처 패턴 디자인 패턴 이디엄 혼돈에서 질서로 from mud to structure Layers Pipes and Filters Blackboard Interpreter 분산 시스템 distributed system Broker Pipes and Filters Microkernel 상호작용 시스템 interactive system MVC PVC 적응.. 2012. 2. 14.
Proactor with IOCP 그간 네트워크 관련 작업은 인디(Indy)에 의존하고 있었다. 하지만, 멀티플랫폼 환경(Android, Bada, iOS 등)에서 이식성을 생각하자면 아무래도 부족한 점이 많다. 하여 개인적으로 사골처럼 우려먹을 수 있는 네트워크 프레임워크를 구현하기로 마음 먹었다. 일단, 1차 결과물로 기본적인 뼈대 정도를 뽑아보았다.(델파이의 내장된 투게더의 결과물이 마음에 들지않아 자바용 UML 툴로 다이어그램을 그렸다. ㅠㅠ 덕분에 Object Pascal 과 Java 가 뒤섞인 다소 이상한 형태의 클래스 다이어그램이다.) 최초 작업은 Delphi XE2 로 윈도우즈 기반 환경이다. 대용량 접속 처리를 위해 IOCP 기반으로 하였고 demulitiplexing 및 dispatch 처리를 위하여 Asynchrono.. 2012. 2. 13.
POSA2, ACT 패턴 Asynchronous Completion Token 패턴의 마인드맵을 그려보았다. 개인적으로 정리한 것이고 추후 적용 과정에서 갱신해 나갈 생각이다. 클래스 다이어그램으로 표현하면, ACT 를 Command 패턴(2012/02/08 - [프로그래밍/OOP] - GoF, Command 패턴)으로 적용한다면, TCompletionHandler 가 TReceiver 에 해당하고 TACT 는 TCommand 가 된다. 이때 TInitiator 가 TInvoker 가 된다. 2012. 2. 8.
GoF, Command 패턴 책의 내용을 요약하여, Command 패턴의 마인드맵을 그려보았다. 클래스 다이어그램으로 표현하면, 만약, 어떤 기능을 수행하는 클래스 TReceiver 가 있다고 하자, 해당 기능을 사용하기 위하여 인스턴스를 생성하고 메소드 ActionA, ActionB 등을 호출할 것이다. 헌데, 이 기능들을 좀 더 복잡하게 사용(여러 UI 에서 접근, 기능의 조합, 매크로 기능, UnDo 기능 등..)해야하는 경우가 발생한다면 어떻게 해야할까? 애초 기능 그 자체를 클래스로 설계하거나, 기능 클래스를 정의한 뒤 실제 동작은 기존 기능을 처리하던 클래스에 위임해버리는 방법이 있을 것이다. 이때 후자를 Command 패턴이라고 한다. TInvoker 라는 놈은 기능 클래스들을 소유하고 호출하는 것으로 논리적인 개념으로.. 2012. 2. 8.
POSA, Forwarder-Receiver 패턴 POSA 의 통신관련 대표적인 패턴으로, 분산 시스템의 컴포넌트와 통신을 위해 사용하는 메커니즘 간 결합도(coupling)를 줄이는 방법 중 하나이다. 결합도를 낮추기 위하여 캡슐화와 위치 투명성을 고려하여야하는데 Forwader-Receiver 패턴은 캡슐화의 역할을 한다. 전체적인 구조에서 보았을 때, Peer 와 Peer 간의 통신을 나타내며 직접적인 송수신 파트는 Forwader 와 Recevier 가 담당한다. DCOM 이나 CORBA 관련 자료를 본 적이 있다면 마샬링이나 언마샬링 등이 익숙할 것이다. Peer : 어플리케이션 서비스를 제공한다. 다른 피어들과 통신한다. Forwarder : 메시지를 보내기 윈한 일반적인 인터페이스(SendMsg)를 제공한다. 원격 수신기에 보내는 메시지를 .. 2012. 1. 31.
POSA, Whole-Part 패턴 GoF 의 디자인패턴이 상당히 구체적이라면, POSA 의 디자인패턴은 좀 더 범위가 두루둥실하다. 사실, 이 Whole-Part 패턴의 경우 어느 정도 OOP 를 해온 경험이있다면 당연한 이야기에 이름을 붙인 정도라고 볼 수 있다. 가령, 인터페이스 혹은 추상화된 기능을 정의(클래스)하고 각 기능의 위임 역할을 하는 클래스들을 결합하여 사용하는 것은 상식에 가까운 설계이지 않을까? 여기서 추상화된 기능을 정의한 클래스가 Whole 이 되고 위임을 하게된 클래스들이 Part 가 된다. 아울러 GoF 의 디자인패턴에 비해 좀 더 범위가 크다고 했는데, Composite 패턴이 이러한 Whole-Part 패턴의 일종으로 설명되고 있다. 이때, TComposite 가 Whole 이 될 것이고 TLeaf 가 Pa.. 2012. 1. 30.
나의, UML 객체지향 설계 - 3 - UML 은 모델링 도구이며 개념설계에 있어 편리한 다이어그램으로 UseCase 와 Activity 를 설명하였다. 그러나 이것은 어디까지나 개인적인 경험에 의한 판단이고 만약, 그외 다른 UML 다이어그램으로 우리가 애초 하고자한 목적인, 의뢰자와의 커뮤니케이션을 원할하게 풀어갈 수 있다면 그것만으로 충분하다. 의뢰자의 도메인영역에 대한 이해가 어느정도 이뤄지게되고 도입하려는 프로그램에 대한 역제안이 발생하는 단계에까지 이르면 전체적인 시스템 구성을 확립하게된다. 이 단계에 적합한 다이어그램은 Deployment(배치) 이다. 사례1 2010년경 모 이동통신 회사의 동기화 프로그램의 Deployment 다이어그램이다. 노란색은 이미 존재하고있는 외부 모듈이고 파란색은 개발하여야할 부분이다. 이와 같은 색.. 2011. 12. 20.
나의, UML 객체지향 설계 - 2 - 개인적인 견해이지만, 프로젝트 실패 요인의 99% 는 개념 설계의 부재에서 온다고 본다. 만약, 회계 관련 프로그램을 제작한다고 가정하자. 해당 프로그램 개발을 가장 잘 할 수 있는 방법은 무엇일까? 그냥 상식선에서 생각해보자. 아마도 회계사이면서 프로그래밍적 지식이 높은 사람이 개발하거나... 프로그래머이면서 회계에 대하여 많은 경험을 가지고 있는 사람이 개발하는 것일 거다. 바로 여기에 프로젝트 성공의 핵심 열쇠가 숨어있다. 만약, 의뢰자인 회계사가 프로그래밍에 대한 이해가 높거나 혹은 프로그래머가 회계에 대한 이해가 높다면 분명 프로젝트는 성공할 가능성이 높다. 하지만 그런 경우는 드물다. 그렇다면 차선으로 할 수 있는 일은 무엇일까? 아마도 그것은 의뢰자에게 프로그래밍에 대한 이해와 프로그래머에게.. 2011. 12. 19.
나의, UML 객체지향 설계 - 1 - UML 을 사용하여 설계를 시작한 것은 대략 2001년경부터인데... 당시 객체지향 프로그래밍(OOP), GoF의 디자인 패턴과 더불어 나의 3대 과제 중 하나였다. 인터넷뿐만 아니라 관련 서적을 통해 공부하였으며 2004년 3판까지 나온 "초보자를 위한 UML 객체지향 설계"의 1판을 최소 5회 이상 읽었던 것으로 기억한다. 그리고 지금도 객체지향 설계와 관련한 책추천을 받으면 반드시 이 책을 소개하곤한다. 초보자를 위한 UML 객체지향 설계 (제3판)국내도서>컴퓨터/인터넷저자 : 조셉슈멀러 / 오종범,곽용재역출판 : 정보문화사 2004.10.09상세보기 처음 실무 적용은 그야말로 혼돈이었다. 어떤 상황에 어떤 다이어그램을 그려야하는지? 혹은, 클래스를 추출하기 위한 명사, 동사 테이블에 분류할 명사의.. 2011. 12. 16.