3.2 좋은 코드를 짜기 위한 원칙
1. 간결한 코드를 작성하기
간결한 코드를 작성할 수록 오타, 버그가 줄고 디버깅도 쉬워진다. 프로그래밍 대회를 위해 작성한 코드에서는 전역 변수가 광범위하게 사용 되곤 한다. 또한, C/C++ 매크로를 사용하여 간결한 코드를 작성하는 것이다.
// 일반적인 코드
for(inr i = 0; i < array.size(); i++)
for(int j = 0; j < i; ++j)
if(array[i] == array[j])
return true;
// C++ 매크로 사용
#define FOR(i, n) for(int i = 0; i < (n); ++i)
FOR(i, array.size())
FOR(j, i)
if(array[i] == array[j])
return true;
보기엔 상당히 거슬린다고 할 수 있지만 코드 길이를 간결하게 해주며, 어이없는 실수를 피하게 해준다.
어디까지나 '흑마법' 이므로 신중하게 사용하고 남에게 자랑은 하지말자
2. 적극적으로 코드 재사용하기
코드를 모듈화 하는 것이다. 같은 코드가 반복된다면 함수나 클래스로 분리해 재사용하는 것이다. 시간이 없다고 해서 이렇게 코드를 간결하게 고치는데 주저해서는 안된다. 나중에 버그가 발생하면 위의 방법이 훨씬 디버깅이 편하다.
3. 표준 라이브러리 공부하기
학교에서 처럼 스택 큐 같은 자료 구조를 구현할 수는 없다. 표준 라이브러리 ( C++ 의 STL ) 을 편하게 사용하자.
4. 항상 같은 형태로 프로그래밍 작성하기
자주 작성하는 알고리즘이나 코드에 대해서는 한 번 검증된 코드를 작성하고 이것만을 꾸준히 사용해야 한다. 그래야 실수도 줄이며, 도구가 아니라 문제에 집중할 수 있다.
5. 일관적이고 명료한 명명법 사용하기
// 명료하지 않은 명명
bool judge(int y, int x, int cy, int cx, int cr);
// 명료한 명명
bool isInsideCircle(int y, int x, int cy, int cx, int cr);
위의 명료하지 않은 함수의 이름은 return 값이 헷갈릴 수 있다. 함수 이름 자체에 함수가 어떠한 일을 하며 어떠한 값을 return 할 것인지를 알 수 있게 해야 한다. 변수명도 마찬가지이다. (필자는 Camle-case 를 사용하겠다.)
6. 모든 자료를 정규화해서 저장하기
같은 자료를 두 가지 형태로 저장하지 않는 것이다. 같은 유리수를 기약 분수로 표현하여 통일 한다든가, 각도를 -30 으로 할지 330 이라 할지를 정하는 등 통일하는 것이다. 정규화는 프로그램이 자료를 입력받거나 계산하자마자 곧장 이루어져야 한다.
7. 코드와 데이터를 분리
사용할 데이터를 미리 배열화, 벡터화 시켜두고 정해진 데이터 내에서만 움직이게 만들거나 정해진 데이터만을 사용하는 것이 좋다. 코드의 양을 줄여서 실수를 없앨 수 있으며 명료하다. 하지만, 상수 오타 는 컴파일러가 잡아주지 못하므로 매우 유의해야 한다.