* Indentation
indents는 8char로 하는 것이 좋다. 간혹 4char 나 심지어 2char으로 하는 사람들이 있는데, 이들의 주장은 코드가 너무 오른쪽으로 치우친다는 것인데, indents가 3레벨이상 되면 다 똑같아지기때문에 코드를 읽기만 더 어려워진다. 따라서 8char 가 읽기도 편하고, 함수가 너무 깊이 nested되는 것을 경고할 수도 있어서 좋다.
또 장시간 모니터를 보고 있는 사람의 경우에 8char indentation이 훨씬 보기에 편하다
- 회사가 4char 사용중
* Braces
일반적으로 여는 괄호는 라인의 끝에, 닫는 괄호는 라인의 처음에 놓는다.
if (x is true) {
we do y
}
함수의 경우는 다음과 같다.
int function(int x)
{
body of function
}
do-while 문과 if-else 문 괄호는 예외이다.
do {
body of do-loop
} while (condition);
if (x == y) {
...
} else if (x > y) {
...
} else {
...
}
* Naming
C 언어는 너무 이해하기 어렵지 않은 수준에서 쓰기 쉬운 변수를 사용한다. tmp 등
너무 귀여운 변수는 필요없다. ThisVariableIsATemporaryCounter...
혼합된 변수를 사용하는 것은 보기에 좋지 않지만, 전역변수나 전역함수의 경우에는 서술적 이름을 사용하여야 한다. 예를 들면 count_active_users() 와 같이 서술적인 이름을 사용하여야지 cntusr() 과 같은 이름을 사용하면 안된다.
지역변수의 경우 짧고 핵심적으로 naming 한다. 예를 들어 loop_counter 라고 쓰는 것 보다는 단순하게 i 라고 쓰는 것이 좋다. 지역변수때문에 헷갈릴것을 두려워하지 말아라. 이것은 다음 장에서 다룰 function-growth-hormone-imbalance 신드롬이라 불리는 다른 문제이다.
* Functions
함수는 짧고 달콤해야(sweet) 한다. (혹자는 beautiful이라는 표현도)
그리고 한가지 기능만을 해야한다. 함수의 최대길이는 그 함수의 복잡도와 indentation level에 반비례한다(안복잡하면 길어도 된다) 여러 단순한 일을 하는 서로 다른 많은 case 문의 경우에는 함수의 길이가 길어져도 무방하다.
복잡한 함수의 경우에는 누가봐도 함수가 무엇에 대한 것인지를 알 수 있는가를 생각해야하고, 최대 함수길이를 엄격하게 지켜야한다. 이 경우에 서술적 이름을 가진 함수를 사용한다. 성능을 고려한다면 in-line함수를 사용하는 것도 좋다. (함수를 알아보기 쉽게 쪼개라는 말.)
함수에 대한 또다른 척도는 지역변수의 개수이다. 5-10 개를 넘지 않아야 한다. 그렇지 않다면 뭔가 잘못된 것이다. 함수를 다시 생각해서 작은 조각으로 나누어야 한다. 인간은 보통 7개의 다른 것에 대해서 정보를 유지(keep track of) 할 수 있다. 그 이상이 되면 헷갈린다. 당신이 똑똑한 것은 알지만, 2주가 지나고 나면 당신이 무엇을 했는지 궁금해할 것이다.(제아무리 똑똑해도 2주지나면 까먹으니까 지역 변수개수를 될 수 있는데로 조금 만들라는 말)
* Commenting
comment는 좋은 것이지만 over-comment는 매우 위험하다. 절대로 comment에 코드가 어떻게 작동하는지를 설명하려하지 말라. 작업이 명백하도록 코드를 작성하는게 훨씬 더 좋은 것이지, 나쁜 코딩후에 그것을 설명하는 것은 시간 낭비일 뿐이다.
코드가 어떻게 작동하는지가 아니라 무엇을 하는 것인가를 comment하라
또 함수 내부에 comment를 하지 말도록 하라. 만약 함수가 복잡해서 부분별로 comment가 필요하다면 위에 쓴 function부분을 다시 잘 읽어보길 바란다. 함수 내부에 comment하는 대신 함수 head부분에 이 함수가 무엇을 하는 것인지를 기록하도록 한다.
* option
GNU 옵션 참고
http://www.gnu.org/prep/standards/standards.html#Option-Table