상세 컨텐츠

본문 제목

아! 달콤한 유혹, Copy and Paste ㅜ.ㅜ

etc

by ryujt 2010. 12. 16. 11:36

본문

어제 하루 종일 버그 하나를 찾지 못해서 끙끙 대고 있었습니다.  버그가 전체 운영에 심각한 영향을 줄 거 같지 않은 상태였습니다.  (실행 중에는 멀쩡하다가 종료 시에만 에러가 나는 상태)

일단 다른 것부터 작업해 놓고 나중에 고칠까? 하는 유혹이 샘 솟았지만, 버그를 방치해 두면 나중에는 감당 할 수 없는 괴물로 성장 될 것은 뻔하기 때문에 끝까지 추적해봤습니다.

디버깅 툴에 위치조차 나타나지 않아서, 상당히 애를 먹고 있다가 코드를 하나 하나 읽는 동안 얼핏 이상한 점 발견!  사실 발견한 게 더 대단해 보였습니다.  해당 모듈의 구석 언저리에 있는 중요하지도 않는 자그마한 클래스에서 Copy and Paste로 인한 버그가 발견 된 겁니다.

type
  TChildClass = class (TParentClass)
    ....
  end;

  TClassSomebody = class
    Subject : TParentClass;
  end;
  ....
  constructor TClassSomebody.Create;
  begin
    Subject := TParentClass.Create;
  end; 

위의 소스에서 문제점이 보이시나요?  사실 소스 자체만으로 문제가 있다고 보기에는 어렵습니다.  하지만, 저의 의도는 Subject := TChildClass.Create; 를 하고 싶었던 겁니다.  단지, 다형성을 이용하기 위해서, Subject를 부모 클래스 타입으로 선언한 것 뿐 이었습니다.

하지만, 습관처럼 7: 라인을 그대로 복사해서 12: 라인에 붙여 놓고 Create 등만을 수정 했기 때문에 컴파일도 되고 실행도 되지만, 에러를 발견 할 수 없는 상태가 되어 버린 것 입니다.

운영상에 문제가 없을 거라는 예상도 완벽하게 빗나간 것이죠.  이상태로 계속 프로젝트를 진행했었다면, 추후 엄청난 대가를 치루게 될 것은 자명합니다.

예전부터 저는 자바나 C# 같이 델파이도 interface가 사라지는 것도 좋겠다는 생각을 해봤습니다.  대부분 델파이 프로그래머들이 제 의견에 반대를 하더군요.  

메소드야 자동으로 interface 부분에서 선언한 것을 implementation에 구현 해 주기 때문에 편하기도 하고 이러한 문제가 없지만, 클래스 타입의 멤버 변수들은 매번 이런 작업을 하다가 보면, "Copy and Paste"의 유혹을 받게 됩니다.  Delphi의 Open Tool's API를 이용해서 클래스 타입의 멤버 변수들을 생성자와 소멸자에서 자동으로 생성하고 삭제하는 모듈이라도 만들까 하는 생각만 듭니다.  ^^;

관련글 더보기