본문 바로가기
데이터 통신

코드 혼잡화

by 방구석 infp 2023. 6. 4.
반응형

06 | 코드 혼잡화

끈기를 가지고 혼잡성, 슈퍼 복잡성, 장황함을 피하라. 읽을 수 없는 C 인터넷의 읽을 수 없는 C 경연대회에 참석하고 스승님의 책상다리 근처에 앉아 경청하라. 방법을 찾거나 APL 권위자를 찾으라 이 세계에서는 코드는 간결하고 동작을 괴이할수록 더 많은 존경이 따라올 것이다. 나는 수십 개를 이용할 것이다 아무 문제 없이 두 개 혹은 세 개를 이용할 수 있는 상황에서 문제를 처리하는 한 개의 변수만을 사용하지 말라. 알려지지 않은 자 같은 작업을 수행하더라도 가장 잘 알려지지 않은 방식을 사용하라. 예를 들어, 배열을 이용해 정수를 문자열로 변경하는 대신 다른 코드를 이용할 수 있다. 일관성에 대한 고집은 아량이 없는 말썽꾸러기 요정이나 하는 짓이다. ‘ ’, 32, 0x20, 040과 같이 하나의 문자 상수를 다양한 방법으로 표현할 수 있다. C나 자바에서는 10과 010을 동일시하지 않는다는 사실을 자유롭게 활용하길 바란다. 모든 데이터는 void *고 넘겨서 적절한 구조체로 형 변환해서 사용한다. 구조체로 형 변환하지 않고 바이트 오프셋을 이용한 데이터 접근하는 것도 색다른 재미가 있다.

중첩된 switch


중첩된 switch 구문(switch문 내의 switch)은 사람을 가장 혼란스럽게 하는 중첩 가운데 하나다.

암시적 변환을 악용하라


프로그래밍 언어에서 제공하는 모든 미묘한 암시적 변환 규칙을 기억한 다음 그들을 최대한 활용하자. 절대 picture(코볼이 내 PL/I에서) 변수를 사용하지 말고 일 반적인 변환 루틴(C의 sprint와 같은)도 사용하지 말자. 소수점 변수를 배열 인덱스로, 문자를 루프 카운터로, 문자열 함수를 숫자에 사용해보자. 잘 정의한 함수 덕분에 우리 코드는 한결 단순해진다. 우리가 만든 코드를 유지보수할 프로그래머는 암시적 데이터형 변환 전체 장을 읽어야만 하는 기회를 준 것에 대해 우리에게 감사할 것이다. 물론 대부분의 프로그래머가 이전에도 암시적 데이터형 변환을 살펴봤을 테지만, 아마도 다시 공부해야 할 필요성을 절실히 느꼈을 것이다.

정수(int) 그대로

Combo Box를 사용하면서 switch 구문이 필요할 때는 이름을 붙인 상수를 사용하는 것보다는 정수를 그대로 사용하는 것이 바람직하다.

간접적으로 변환하라

자바는 변환이 필요할 때마다 코드를 혼잡하게 만들 기회를 제공한다. 간단한 예로 double을 String으로 변환해야 한다면 Double·to String(d)(d)보다는 우회적인 방법을 사용해서 new Double(d)·to String()()과 같이 하는 것이 좋다. 물론 예제에서 설명한 것보다 더 우회적인 방법을 사용해도 된다. 변환 대필자가 제안하는 변환 기법은 되도록 피해야 한다. 변환하면서 생긴 임시 오브젝트로 힙 heap 메모리을 낭비하므로 추가 점수를 획득할 수 있음을 잊지 말자.

중첩

가능한 한 깊이 중첩하라. 훌륭한 독자는 한 라인에 사용한 10개의 ( )를 이해할 수 있고, 하나의 메소드에 사용한 20개의 { }도 이해할 수 있다. C++의 경우 전처리기 중첩을 이용할 수 있다. 전처리기 중첩은 코드의 중첩 구조와는 독립적이므로 보 다 강력한 옵션이다. 인쇄된 코드에서 블록의 시작과 끝이 같은 페이지에 나오지 않게 할 수 있다면 추가 점수를 획득할 수 있다. 가능하다면 중첩된 if 문을 중첩된 [A?B...] 구문으로 바꾸는 것이 바람직하다. 게다가 한 줄 이상의 코드로 확장할 수 있다면 금상첨화다.

숫자 기호

100개의 요소를 갖는 배열이 있다면 최대한 100이라는 기호를 프로그램에서 다 능한 많이 사용해야 한다. 절대 static final을 붙인 상수로 100을 대체하거나 myArray. length와 같은 방법을 사용하지 말아야 한다. 상수를 이해하고 대체하기 어렵게 하려면 100/2보다는 50, 100-1보다는 99와 같이 표기하는 것이 좋다. a > 100보다는 a == 101을 사용하고 a >= 100보다는 a > 99를 사용하므로 100이라는 숫자가 사용되지 않은 것처럼 위장할 수 있다.

헤더에 x개, 바다에 y개, 풋 터에 z개 라인을 사용한 페이지 크기가 있다고 가정해 보자. 이때 난 독 화를 각각에 적용할 수 있으며 부분합 혹은 정체함에도 적용할 수 있다.

이 유서 깊은 기법은 특히 100개의 요소를 갖는 연관성이 없는 두 배열을 갖는 프로그램에 효과적이다. 유지보수 프로그래머가 둘 중 하나의 배열 크기를 변경하려면 프로그램에서 사용된 모든 100이라는 기호를 해독해서 어떤 배열에 해당하는 것인지 이해해야 한다. 이러한 과정에서 그가 적어도 한 번 이상 실수를 저지를 것이라고 장담할 수 있다. 운이 좋다면 그 에러가 몇 년이 지난 후에야 발견될 수도 있을 것이다. 더 사악한 변형 기법도 있다. 매우 가끔 “우발적으로” 100을 사용하므로 유지보수 프로그래머를 안심시킬 수 있다. 가장 사악한 방법은 100이나 이름을 붙인 상수를 쓰지 않고 산발적으로 우연히 100 값을 갖는 상수를 사용하는 것이다. 당연히 배열의 크기를 연상시키는 어떠한 이름도 사용하지 말아야 한다.

C의 기이한 배열 접근법

C 컴파일러는 my Array[i]를 *(myArray+i)로 변환하는데 이는 *(i+myArray)와 같고 이는 i[myArray]과 같다. 전문가들은 이와 같은 사실을 어떻게 활용해야 할지 알고 있다. 인덱스를 생성하는 함수를 이용하므로 이 사실을 숨길 수 있다. 불행히도 이 기법은 네이티브 C 클래스에서만 사용할 수 있으며 자바에서는 사용할 수 없다.

긴 줄

가능하면 많은 내용을 한 줄에 담으려 노력하라. 이 기법은 임시 변수를 줄이고, 줄 바꿈 문자나 공백 문자를 제거함으로써 소스 파일 크기를 줄이는 효과를 제공한다. 좋은 프로그래머는 몇몇 편집기의 한 줄에 들어갈 수 있는 문자 크기의 한계인 255문자까지 활용하기도 한다. 글자 크기를 6으로 맞추었을 때 글자를 읽지 못한다면 스크롤 해서 읽도록 길게 코딩하는 것이 정석이다.

예외

거의 알려지지 않은 코딩 비밀을 공유하려고 한다. 예외의 이면에는 고통이 숨겨져 있다. 제대로 구현한 코드는 실패할 일이 없으므로 예외 자체가 필요 없게 된다. 따라서 예외에 시간 낭비할 필요가 없다. 예외를 상속하는 것은 자신의 코드에 문제가 있음을 인정하는 무능력자가 하는 짓이다. 일반적으로는 전체 응용프로그램을 감싸는 하나의 try/catch를 사용(main에서)하고 문제가 생겼을 때 System. exit()를 호출함으로써 프로그램을 단순하게 만들 수 있다. 예외를 발생시킬 수 있는지와 관계없이 모든 메소드 헤더에 표준 throws 구문을 추가하자.

반응형

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

테스트, 언어선택  (0) 2023.06.05
예외를 사용 할 시기  (0) 2023.06.05
전역변수, 지역변수  (0) 2023.06.04
배열의 사용법  (0) 2023.06.04
프로그램 디자인  (0) 2023.06.03

댓글