제목:중복 코드 제거를 위한 공통 이벤트 처리 방법(동적 이벤트 처리)
델파이 게시판에서 재밌는 질문을 하나 찾았다. 이 질문 내용을 요약하면 다음과 같다.
[질문 내용 시작]
....제목 : 동적 이벤트 Procedure할당 관련....
반복되는 코딩을 줄여 볼 방법이 없을까 요즘은 고민을 하게 되네요. 여러 폼의 OnShow 이벤트에 공통된 루틴을 실행해야할 필요가 있어서, 이를 처리하기 위해 다음과 같은 클래스를 만들었습니다.
Type
TLibClass = class
Public
class procedure onshow(Sender:TObject);
end;
Implementatin
Class procedure onshow(Sender:TObject)
begin
공통된 내용 코드들
end;
이런식으로 클래스를 만들어 놓고 폼의 OnCreate 이벤트에서 다음과 같이 처리했습니다.
OnShow := LibClass.onshow;
요렇게 해서 중복을 피했습니다....
그런데.. 이런 꽁수를 생각하고 나니 다시 문제가 생기네요...
form1에서는 memo1.setfocus; 라는 별도의 코딩이 필요하고
form2에서는 edit1.setfocus; 라는 별도의 코딩이 필요한데....
이와 같이 form 별도 공통된 내용을 처리하면서도, 별도의 다른 내용을 처리할 수 있도록 라이브러리를 구축을 할려면 어떻게 해야 할까요?
OOP의 대가님들....도움을 부탁드립니다.
[질문 내용 끝]
이 개발자의 중복코드를 피하려는 노력은 참으로 높이 평가할 만하다. 중복 코드가 많아지면 후일 최악의 사태를 불러올 수 있기 때문에, 어떻게든 중복코드는 제거함이 바람직하다. 또한 공통 루틴 처리를 위해서 별도의 클래스까지 만든 것도 좋은 시도이다. 질문자는 꽁수라고 했지만, 이 방법은 꽁수가 아닌 정석적인 객체지향 접근법이다.
그런데, 여러 개발자들이 이 개발자처럼, 객체지향에 서서히 맛을 들이기 시작하면서, 다음 단계에서 고민하게 된다. 객체지향에서 클래스는, 관련된 코드와 데이타를 합해서 어떤 작업을 보편화(라이브러리)화 하는 것인데, 클래스의 이런 보편성을 깨지 않으면서도 특수성을 어떻게 첨가하느냐라는 것이다.
이 개발자의 질문 내용 핵심은, 꺼집어낸 공통 코드에서 특정 폼마다 특정 루틴이 별도로 필요한데, 이를 어떻게 처리하는가이다. 일단 이 개발자의 질문에 대한 처리 방법만 제시해 보도록 하자.
다음은 첨부한 프라젝트의 메인폼 소스이다.
{...중략...}
type
TGlobalEvent = class(TComponent)
public
FocusControl : TWinControl; // 포커스를 줘야할 콤포넌트
procedure DoShow(Sender:TObject);
end;
TForm1 = class(TForm)
Edit1: TEdit;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
{...중략...}
implementation
{$R *.dfm}
procedure TForm1.FormCreate(Sender: TObject);
begin
with TGlobalEvent.Create(Self) do
begin
FocusControl := Edit3;
OnShow := DoShow;
end;
end;
{ TGlobalEvent }
procedure TGlobalEvent.DoShow(Sender: TObject);
begin
// 공통 작업 처리 코드
ShowMessage('Gloval Event Show is called');
// 특정 콘트롤로 포커스 주기
FocusControl.SetFocus;
end;
위에서 제시한 방법은 사실 최선은 아니다. 비록 원래 질문 내용인 각 폼마다 특정 콘트롤에 포커스를 주는 것은 해결되었지만, 실전 프라젝트에서는 단순히 특정 콘트롤에 포커스 주는 것 이상으로, 각 폼마다 아주 별개적이고 복잡한 루틴을 실행해야하는 경우가 많기 때문이다.
이를 객체지향적으로 어떻게 해결할지는 11월 세미나에서 다루도록 하겠다. 사실 이 내용은 무지 복잡하고 한두회의 강좌로 이해될 성격의 것도 아니다.
[노트] 예제에서는 TGlobalEvent 클래스를 메인폼 소스에 두었지만, 실전 코딩에서는 별도 유닛에 둬야할 것이다.
세미나 주제로 참으로 좋은 소재를 던져 주신, 이 질문자에게 무지 고마움을 표하면서 이글을 마칠까 한다.
http://cafe.daum.net/delphinegong 델파이 강좌 주정섭