본문 바로가기
데이터 통신

표기법

by 방구석 infp 2023. 5. 27.
반응형

헝가리 안 표기법

헝가리 안 표기법은 소스 코드 판독을 어렵게 하는 핵폭탄급 기법의 하나다. 헝가리 안 표기법을 사용해보자! 소스 코드는 방대하므로 헝가리 안 표기법을 활용해 적절하게 코드를 오염시킨다면, 그 어떤 방법보다도 효율적으로 유지보수 엔지니어를 쓰러뜨릴 수 있다. 아래는 헝가리 안 표기법의 본래 의도를 무력화하는 팁이다.

C++에서 “c”를 cons에 사용하라(C++). “c”는 C++ 이외의 언어에서는 보통 변수가 상수임을 가리킨다.

다른 언어에서는 다른 의미로 해석되는 헝가리 안 물혹(wart, 덧붙이는 음절이나 단어)을 찾고 사용하라. 예를 들어, C++ 코딩에서 모든 제어 형식에 “l_”과 “a_”와 같은 범위를 가리키는 접두어(파워 빌더에 l은 지역을 a는 매개변수를 가리킨다)와 VB 스타일의 헝가리 안 물혹을 사용하라. MFC 소스 코드에서 제어 형식에 헝가리 안 물혹 표기법을 사용하지 않는다는 사실을 마치 모르는 것처럼 행동하라.

공통으로 자주 사용하는 변수는 되도록 추가 정보를 포함하지 말아야 한다는 헝가리 안 원칙을 항상 위반하자. 위에서 설명한 기법들을 총동원하고 각 클래스 형식은 커스텀 접도 물혹을 가지고 있다고 주장하므로 이를 달성할 수 있다. 물혹 것은 클래스임을 의미한다는 사실을 간파할 수 없게 해야 한다. 이는 정말 중요한 원칙이다. 이 원칙을 지키지 못하면 소스 코드에 모음/자음 비율이 높아지면서 짧은 변수명이 범람하게 된다. 최악의 경우 소스 코드 판독 방해 작전이 실패할 수 있고 자신도 모르는 새에 영어 표기법이 코드에 나타날 수 있다!

함수 파라미터와 여타 심볼은 이름을 통해 의미를 나타내야 한다는 헝가리 안 개념을 노골적으로 위반하자. 그러나 헝가리 안 형식 물혹 자체의 사용이 변수를 임시 변수로 보이게 할 수 있다.

의미상 전혀 연관이 없는 헝가리 안 물혹 여러 개를 덧붙여 사용해보자. 실생활에서 활용된 예를 들면 “a_crszkvc30Last-NameCol” 같은 변수를 만들 수 있다. 유지 보수 엔지니어 팀 전체가 이 변수명을 “이 변수는 cons고 레퍼런스 형식으로 함 수 매개변수로 사용되는데 테이블의 기본 키 가운데 하나인 ‘LastName’이라는 이름의 Var char[30] 형식의 데이터베이스 열에서 가져온 데이터를 담고 있다”라고 해독하는 데 3일이 걸렸다. “모든 변수는 public이어야 한다”라는 규칙을 이 기법에 접목하면 수천 라인의 코드를 대체할 수 있는 막강한 파워를 발휘할 수 있다! 사람의 뇌는 동시에 오직 7개의 정보를 유지할 수 있다는 원칙을 마음껏 활용하자. 위 규칙을 따른다는 것은 다음과 같은 코드를 작성한다는 것을 의미한다.

하나의 할당 문에 14개의 형식과 이름 정보를 사용한다.
하나의 함수가 3개의 매개변수를 전달하고 29개의 형식과 이름 정보를
가진 결괏값을 할당한다.
적당히 복잡한 중첩 구조를 이용하면 단기 기억의 한계를 가볍게 초과할 수 없는 경우에 효과가 커진다.
수 있다. 특히 유지보수 프로그래머가 블록의 시작과 끝을 한눈에 확인할
유지보수 프로그래머가 각 블록을 한 화면에 확인하기 어렵게 만들 수
있다면 중첩 구조체로도 단기 기억 메모리 한계를 간단히 초과할 수 있다.
헝가리 안 표기법의 변형

헝가리 안 표기법을 활용한 또 다른 술책으로 “변수명은 그대로 사용하되 변수 형식을 바꾸는” 방법이 있다. 이 방법은 윈도 응용프로그램이 W in 16 WndProc(HWND HW, WORD wMsg, WORD wParam, LONG lParam)에서 W in 32 WndProc(HWND HW, UINT wMsg, WPARAM wParam, LPARAM lParam)으로 변경되는 경우와 같은 상황에서 어김없이 등장한다. 여기서 w는 words임을 가리키는 듯하지만 실제로는 long을 가리킨다. W in 64로 응용프로그램을 변경하는 경우 이 사실이 더욱 명확해진다. Win64에서는 파라미터가 64비트이지만 기존의 “w”와 “I” 접두어는 변하지 않는다.

줄이고, 재사용하고, 재활용하라

콜백 callback에 사용할 데이터를 저장할 구조체를 정의해야 한다면, 그 구조체를 PRIVDATA라고 부르자. 모든 모듈은 자신만의 PRIVDATA를 정의할 수 있다. 이 구조체로 VC++의 디버거를 교란할 수 있다. 변수 watch 윈도에 PRIVDATA 변수가 있는 상태에서 해당 변수를 펼치려고 하면 디버거는 어느 PRIVDATA를 의미하는 것인지 결정할 수 없어 아무것이나 선택한다.

쉽게 찾지 못하게 숨겨라

16진수 값 $0204F B를 할당할 상수 변수명으로 blue 대신 LancelotsFavourite Colour와 같은 이름을 사용하라. 화면에는 완전한 파란색이 나타나겠지만, 유지

보수 프로그래머는 0204F B값을 판독(아마 그래픽 도구를 이용해서)해야 의미를 파악할 수 있을 것이다. 몬티 파이선의 성배 Monty Python and the Holy Grail이라는 1975년

영국 영화를 좋아하는 광팬이라면 랜 슬롯 Lancelot이 좋아하는 색이 파란색이라는 사실쯤은 금방 알아차릴 수도 있을 것이다. 몬티 파이선의 성배 영화 전체 내용을 기억하지 못하는 유지보수 프로그래머가 있다면 프로그래머로서 자질이 없는 분이라고 생각할 수밖에 없다. 유지보수하기 어렵게 코딩하는 방법: 평생 개발자로 먹고살 수 있다.

표면으로 올라오는 시간이 오래 걸리는 버그일수록 찾기가 어렵다.

_노에다 그린Roedy Green

위장술, 숨기기, 어떤 것을 마치 다른 것처럼 보이게 하기 등의 기술은 유지보수할 수 없는 코드에 필수적인 기법이다. 이런 기술 중 대다수는 사람의 눈이나 텍스트 편집기로는 알아채기 힘들다는 약점을 이용한다.

반응형

'데이터 통신' 카테고리의 다른 글

문서화  (0) 2023.05.31
변수명 찾기 어렵게  (0) 2023.05.29
단어 교환하기  (0) 2023.05.26
유지 보수 어렵게 코딩  (0) 2023.05.25
주파수 다중화  (0) 2023.05.25

댓글