http://www.delmadang.com/community/bbs_view.asp?bbsNo=3&bbsCat=0&indx=453858&page=1
우리가 업무용 프로그램을 만들때마다 입력값이 제대로 들어 왔는지를
검사하는 루틴이 들어가게 된다. 하지만 이런 루틴은 입력값의 량의따라
아주 지저분한 코드들을 만들어 낸다.
이부분을 다소 깔끔하게 정리할 수 있는 팁을 소개한다.
본 팁은 원래 본인이 질문과 답변란에 질문한 내용인데
다윗(심재용)님께서 아이디어를 주셔서 해결한 문제이다.
<원시코드 루틴>
procedure A;
begin
if EditBox1.Text = '' then
begin
EditBox1.SetFocus;
Exit;
end;
end;
<1차 리팩토링>
function TForm1.chkInputVal(Sender: TObject): Boolean;
begin
result := false;
if TEdit(Sender).Text = EmptyStr then TEdit(Sender).SetFocus
else result := true;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if Not chkInputVal( Edit1 ) then exit;
end;
1차 리팩코링을 통해 setfocus 한줄을 줄일수 있으나
여전히 exit; 코드는 줄이지 못함.
exit 코드를 줄인다는 의미는 chkInputVal 루틴안에서 Button1Click 루틴까지
빠져 나가게 할 수 있는 코드가 필요하다.
본인은 이 부분에 대한 닶을 못찾고 있었는데 다윗(심재용)님께서 좋은 아이디어를
주셔서 이 문제를 깔끔하게 해결할 수 있었다.
<2차 리팩토링>
function TForm1.chkInputVal(Sender: TObject): boolean;
label
goAbort;
begin
result := false;
if (Sender is TEdit) and ((Sender as TEdit).Text = EmptyStr) then goto goAbort;
if (Sender is TComboBox) and ((Sender as TComboBox).Text = EmptyStr) then goto goAbort;
if (Sender is TMemo) and ((Sender as TMemo).Text = EmptyStr) then goto goAbort;
if (Sender is TListBox) and ((Sender as TListBox).Count = 0 ) then goto goAbort;
result := true;
exit;
goAbort :
(Sender as TWinControl).SetFocus;
Raise EAbort.Create(''); //<== 요 녀석이 핵식코드 임.
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
chkInputVal( Edit1 );
chkInputVal( ComboBox1 );
chkInputVal( Memo1 );
chkInputVal( ListBox1 );
ShowMessage('입력값 모두 정상');
end;
다윗(심재용)님의 말에 의하면
Raise EAbort.Create(''); 부분이 강제로 Exception 을 발생시키는데,
발생된 곳에서 Try..Exception 으로 잡아내지 않으면 소속된 프로시저나
이벤트핸들 영역에서 빠져나감.
다만, 잘 알고 사용하시면 중급프로그램을 하실 수 있는데, 잘 모르고 사용하면
가독성이 떨어지고, 코딩이 지저분해 질 수 있음.
라고 한다.
다윗(심재용)님 덕분에 본인은 이 팁을 활용해 지저분한 입력값 체크 코드들을
상당 부분 말끔히 걷어낼수 있었다
'언어 > delphi' 카테고리의 다른 글
자바의 Toast VCL용입니다 (0) | 2018.05.15 |
---|---|
TBitmap 원본으로부터 크기조정한 비트맵 얻기 (Transparent, Antialiased) (0) | 2018.05.15 |
초를 0시간 0분 0초식으로 리턴 (0) | 2018.05.15 |
익명함수+쓰레드를 활용한 간단한 쓰레드 사용 방법 (0) | 2018.05.15 |
TFrame의 생성 및 해제를 편하게 해주는 TFrame 관리 클래스입니다.. (0) | 2018.04.27 |