원래는 하루나 이틀뒤에 답글을 적을 예정이었는데, 너무나 정확한 답글이 일찍 등장하는 바람에 나역시 김이 확 빠지는 느낌이 든다.
박지훈님이 내가 적을 답변글을 너무나 정확하게 고스란히 대신(?)해 준탓에 별로 적을 것은 없지만, 이 문제를 피해나가는 적극적 방법에 대해서 한가지 더 보충할까 한다.
박지훈님이 이미 지적한 것처럼, 코딩에서 어떤 문제점을 발견하면, 앞으로 조심한다가 아니라, 이를 피할 수 있는 적극적 방법을 모색해봐야 한다. 즉 한번 당한 에러는 두번 당하지 않도록, 그 에러를 사전에 피할 수 있는 절차를 정해놓고 거기에 따라서 코딩해야 한다는 것이다.
내가 발견한 이전 코드의 문제점은 상수에 대한 대처 방안이 미흡했다는 것이다.
상당수의 개발자들이 문자열이나 숫자 상수값에 대해서 별다른 조치를 취하지 않는다. 이말인즉 소스 곳곳에 상수를 마구 넣어 둔다는 것이다. 문제의 저 코드 또한 그러하다. 여러 프로그래밍 관련 책에서 상수값들을 덜어내서 한곳에 모아두고 특별 관리하라고 권한다.
문제의 코드에서 '1'은 매우 중요한 상수값이다. 이러한 중요한 상수값은 코드에 바로 삽입하는 것이 아니라 별도의 조치가 필요하다. 중요한 상수에 대해서는 특별 취급을 해야 한다. 즉 상수(const)로 덜어내고, 할수만 있다면 반드시 그 상수의 타입도 명시하라는 것이다.
var
ExeName: String;
const
DefaultParamValue : string = '1'; // 상수로 덜어내면서 그 타입을 명시적으로 지정
CalledExeName : string = 'Project2.exe';
begin
ExeName:= ExtractFilePath(ParamStr( 0 ) ) + CalledExeName;
// 명시적 타입을 지정한 상수로 덜어내면 다음 두방식 모두 아무런 문제가 없다.
ShellExecute(0, 'Open', PChar(ExeName), pchar(DefaultParamValue), nil, SW_SHOW);
ShellExecute(0, 'Open', PChar(ExeName), DefaultParamValue, nil, SW_SHOW);
end;
박지훈님이 말한 방식을 쓰던, 이 방식을 쓰던 간에 중요한 것은, 에러에 대해 수동적이 아니라 적극적 대처 방법을 세운다는 것이다. 그리고 이 적극적 대처는 프로그래머로서 가져야할 매우 중요한 태도이자 자질이다.
|