본문 바로가기

언어/delphi

입력값 검사루틴 - 코드 리팩토링

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 으로 잡아내지 않으면 소속된 프로시저나 

이벤트핸들 영역에서 빠져나감. 


다만, 잘 알고 사용하시면 중급프로그램을 하실 수 있는데, 잘 모르고 사용하면 

가독성이 떨어지고, 코딩이 지저분해 질 수 있음. 


라고 한다. 


다윗(심재용)님 덕분에 본인은 이 팁을 활용해 지저분한 입력값 체크 코드들을

상당 부분 말끔히 걷어낼수 있었다