본문 바로가기
개발일지/아키텍트

Delphi 투게더의 Observer 패턴 소스 오류

by 사악신 2012. 4. 19.

최근 XE2 에서 패치되었는지 모르겠지만, 투게더가 Delphi 에 포함되고 난 이후(2006부터~) 지금까지 이 소스 버그는 사라지지 않고 있다. 나야 UML 작성시 투게더를 사용하고 있지 않아 그냥 수정한 소스를 쓰고있지만, 만약 Pattern Organizer 에 등록된 Observer 패턴을 사용하여 소스를 생성하는 경우라면 네이티브 환경에서 사용시 AV 에러가 발생한다.

 

패치한 소스는 다음과 같다.

IObserver = interface
  procedure UpdateObserver(ASubject: TSubject); // 폼에서도 사용할 수 있게 메소드명을 변경함
end;

TSubject = class
strict private
var
  FObservers: TList;
strict protected
  procedure NotifyObservers;
public
  constructor Create;
  procedure Attach(const AObserver: IObserver);
  procedure Detach(const AObserver: IObserver);
end;

// 투게더에 의해 생성되는 코드에 오류가 있으므로,
// Attach, Detach, NotifyObservers 메소드를 수정하여야함.
procedure TSubject.Attach(const AObserver: IObserver);
begin
  FObservers.Add( Pointer(AObserver) );
end;

procedure TSubject.Detach(const AObserver: IObserver);
var
  idx: Integer;
begin
  idx := FObservers.IndexOf( Pointer(AObserver) );
  if idx <> -1 then
  begin
    FObservers.Delete( idx );
  end;
end;

procedure TSubject.NotifyObservers;
var
  Current: Pointer;
  i: Integer;
begin
  for i := 0 to FObservers.Count - 1 do
  begin
    Current := FObservers.Items[i];
    IObserver( Current ).UpdateObserver( Self );
  end;
end;

 

이 버그가 한두해도 아니고 계속 유지되는 것은 아무래도 해외나 국내나 투게더를 사용하지 않는다는 의미가 아닐까? 나아가서 디자인 패턴 자체를 안쓰고 있다는 얘기인 것 같기도 하고... 그럼 난 왜 quality central 에 버그 등록을 안했느냐?^^ 이 놈이 언제 리포팅되는지 정말 궁금해서였는데... 그것이 역으로 투게더와 디자인 패턴의 사용 빈도 증가에 대한 반증이라는 생각이 들었기 때문이다. 뭐, 영어 때문이 아니냐고 물으신다면.... 그것도 빙고~ ^^

 

반응형

댓글