프겔의 영원한 명저 "유지보수를 어렵게 코딩하는 방법"을 요약해봤다
코드에 사용한 이름은 화면 표시 이름과 달라야 한다.
화면에 표시되는 값과 변수명은 전혀 관련이 없도록 해야 한다. 예를 들어, 화면에는 “Postal Code”로 표시되는 변수의
이름을 “zip”과 같이 색다르게 정할 수 있다.
이름을 변경하지 마라
전체적으로 이름을 바꾸는 방법으로 두 섹션 코드를 동기화하는 것보다는 같은 심볼에 여러 TYPEDEF문을 사용하는 것이
바람직하다.
금지된 지역변수를 감추는 방법
전역 변수는 “악”과 같은 존재이므로 전역적으로 사용할 모든 데이터를 저장할 구조체를 정의하고 EverythingYoullEv-
erNeed와 같이 똘똘한 이름을 붙여준다. 모든 함수가 이 구조체에 대한 포인터(포인터명은 handle이라고 함으로써 혼란을
더할 수 있다)를 갖게 할 수 있다. 실제로는 “handle”을 통해 전역변수를 마음껏 사용하면서 다른 이에게는 우리가 전역 변
수를 사용하지 않는다는 인상을 줄 수 있다. 전역 변수를 사용하는 모든 코드에서 정적 변수를 선언하는 것도 좋은 방법이다.
동의어로 인스턴스 숨기기
유지보수 프로그래머가 뭔가를 수정하고 그로 인해 발생할 수 있는 부수효과를 확인할 때 일반적으로 프로그램 전체에서 사
용된 변수명을 검색할 것이다. 동의어 사용이라는 간단한 방법으로 이러한 유지보수 프로그래머의 시도를 좌절시킬 수 있다.
#define xxx global_var // in file std.h
#define xy_z xxx // in file ..\other\substd.h
#define local_var xy_z // in file ..\codestd\inst.h
위 정의를 서로 다른 include 파일에 흩어놓아야 한다. 특히 include 파일이 서로 다른 디렉터리에 위치한 경우 효과적이다.
가능한 모든 범위에서 이름을 재사용하는 기법도 있다. 컴파일러는 정확하게 모든 이름을 구별할 수 있겠지만, 단세포적인
텍스트 검색기로는 이름을 구별하기 어려울 것이다. 불행하게도 SCID(Source Code in Database)가 점점 발전하면서 편집
기가 컴파일러처럼 범위 규칙을 이해하게 되면 간단한 기법은 더 이상 사용할 수 없게 될 것이다.
길고 비슷한 변수명
변수명이나 클래스명은 되도록이면 길게 만들고 두 개 이상의 이름이 필요할 경우 한 글자만 바꿔놓거나 대소문자만 다르게
한다. 변수명 swimmer와 swimner는 좋은 예다. 대부분의 폰트로는 ilI1|나 oO08를 명확하게 구별하기 어렵다는 점을 악
용하자. 예를 들어, parselnt와 parseInt 혹은 D0Calc와 DOCalc를 명확히 구분하기 어렵다. 이 중에서도 l은 얼핏 보기에
1과 구별하기 힘들기 때문에 변수명으로 사용하기 가장 좋은 알파벳 중 하나다. 뿐만 아니라 대부분의 폰트에서 rn은 m처럼
보이는 경우가 많다. 따라서 swimmer와 쉽게 구별하기 어려운 swirnrner도 좋은 변수명이다. HashTable과 Hashtable처
럼 한 글자의 대소문자만 살짝 변경해서 변수명을 만드는 것도 좋은 방법이다.
비슷하게 발음되고, 비슷하게 보이는 변수명
xy_z라는 변수명 이외에 xy_Z, xy__z, _xy_z, _xyz, XY_Z, xY_z, Xy_z처럼 다양한 변수명을 사용하지 말라는 법은 없다.
때로는 변수명을 소리나는 대로 혹은 스펠링으로 기억하는 프로그래머를 많이 볼 수 있는데 대소문자나 밑줄로만 구별되는
변수명이 이들을 혼란에 빠뜨릴 것이다.
오버로드 그리고 당황
C++에서 #define을 사용해 라이브러리 함수를 오버로드하자. 얼핏 보면 친숙한 함수를 쓰고 있는 것처럼 보이겠지만 사실
은 완전 다른 기능을 하게 할 수 있다.
-열심히 익혀서 어떤 사람도 쉽게 너의 것을 못바꾸게 하자. 유지보수는 너만 할 수 있도록 하자
댓글 0