일반적인 숫자

매직넘버는 피한다 : 아무 의미 없는 혹은 의미를 알기 힘든 숫자를 사용하는 것을 지양한다

ex for i= 0 to 99 do... 이것보다는 for i = 0 to MAX_ENTRIES - 1 do... 이 코드의 가독성도 높이고 숫자가 의미하는 바가 확실하다.

하지만 필요하다면 0과 1은 그냥 사용한다

0으로 나눔오류를 미연에 방지한다.

형변환을 명확하게 수행한다. -> 잘못된 형변환은 값의 손실을 가져온다.

서로 다른 형을 비교하지 않는다. -> 이것 역시 잘못된 결과값이나 값의 손실을 가져올수 있다.

컴파일러의 경고에 주의를 기울여라

 

정수

정수나눗셈을 검사한다 - 7/10 의 결과는 반드시 0.7이 아닐수 있고 언어마다 다를수 있다. 가장 좋은 방법은 (10 * 7) / 10으로 바꾸는 것이다.

정수 오버플로우를 검사한다

중간 결과에 오버플로우를 검사한다

 

부동소수점

부동소수점에서 가장 중요하게 고려해야 할 사항은 많은 분수값이 디지털 컴퓨터의 0과 1을 사용하여 정확하게 표현될수 없다는 점이다.

서로 크기가 매우 다른 수를 더하거나 빼지 않는다

동치비교를 피한다

라운딩 오류를 예측한다 - 더 큰 정밀도를 갖는 변수 형으로 변경한다, 이진화 십진 표기법 변수로 변경한다, 부동소수점을 정수형 변수로 변경한다

특정 데이터형을 지원하는 언어와 라이브러리가 있는지 확인한다

 

문자와 문자열

매직 문자와 문자열을 사용하지 않는다

하나 모자름(off-by-one)오류를 주의한다 - 서브 문자열은 배열처럼 인데스로 나타낼수 있기때문에, 문자열의 범위를 지나서 읽거나 쓰는 하나 모자름 오류를 주의한다

사용하고 있는 언어의 환경에서 유니코드를 어떻게 지원하는지 알아보도록 한다

국제화/ 지역화 전략을 초기에 결정한다 - 나한테 다국어버전 이슈로 다가옴!!!!

문자열 타입간에 일관된 변환 전략을 결정한다

 

C에서의 문자열

문자열 포인터와 문자 배열간의 차이점을 이해하도록 한다

 C방식의 문자열을 CONSTANT+1의 길이를 갖도록 선언한다

ex. char name[NAME_LENGTH + 1] = {0}; // 길이가 NAME_LENGTH인 문자열

끝이 없는 문자열을 피하기 위해서 문자열을 널(null)로 초기화한다

ex. char EventName[MAX_NAME_LENGTH + 1] =  {0};

C언어에서 포인터 대신 문자 배열을 사용한다 - 메모리 제약만 없다면 모든 문자열 변수들을 문자 배열로 선언한다

끝이 없는 문자열을 피하기 위해서 strcpy()대신 strncpy()를 사용한다

 

 Boolean 변수

프로그램을 문서화하기 위해서 불린 변수들을 사용한다. - 불린 표현식을 테스트 하는 대신, 표현식의 의미가 보다 명확하도록 변수에 할당한후 테스트를 수행한다

ex. 불린 테스트의 목적이 명확하지 않은 자바 예제

if((elementIndex < 0) || ( MAX_ELEMENTS < elementIndex) || (elementIndex == lastElementIndex)){ ... }

ex. 불린 테스트의 목적이 명확한 자바 예제

finished = (elementIndex < 0) || ( MAX_ELEMENTS < elementIndex);

repeatedEntry = (elementIndex == lastElementIndex);

if( finished || repeatedEntry) { ... }

복잡한 테스트를 단순하게 하기 위하여 불린 변수를 사용한다 - 여러개의 조건을 나누어 불린 변수에 넣고 그 변수로 if문의 조건을 만든다. 위의 예처럼.

필요하다면, 고유한 불린 타입을 만든다.

 

열거형

가독성을 향상시키기 위해서 열거형을 사용하라

신뢰성을 위해서 열거형을 사용한다

수정 용이성을 위해서 열거형을 사용한다

불린 변수에 대한 대안으로 열거형을 사용한다.

타장하지 않은 값을 검사하라 - if나 case문에서 열거형을 사용할때, 타당하지 않은 값을 검사한다. 타장하지 않은 값을 잡기 위해서 case문에서는 else문을 사용한다

ex. 열거형에서 타당하지 않은 값을 검사하는 풀륭한 VB예제

Select Case screenColor

case Color_Red //...

case Color_Blue //...

case Color_Green //...

case Else -> 여기에서 타장하지 않은 값을 테스트하고 있다.

        displayInternalError()

반복문의 범위를 지정하기 위해서 열거의 처음과 마지막 엔트리를 정의한다

열거형의 첫번째 항목을 타당하지 않은 값으로 남겨둔다 - 많은 컴파일러들은 열거 형의 첫번째 요소를 0으로 할당한다. 0으로 매핑된 해당요소를 타당하지 않은 값으로 선언하면 초기화되지 않은 변수들은 0일 확률이 높기때문에, 그러한 변수들을 잡는데 도움을 준다.

프로젝트 코드작성표준에서 처음과 마지막 요소가 어떻게 사용될 것인지를 정확하게 정의한 후, 일관성 있게 사용한다

열거의 요소에 명시적인 값을 할당할때 발생할수 있는 위험요소들을 주의한다

 

만약 언어가 열거형을 지원하지 않는 다면? 전역변수나 클래스로 열거형을 흉내낼수 있다.

ex 열거형을 흉내내는 자바예제

class Country

{

private Country()

{

public static final Country China = new Country();

public static final Country England = new Country();

public static final Country Korea = new Country();

//..

}

}

 

명명된 상수

데이터선언에서 명명된 상수를 사용해라 - 가독성과 유지보수에 도움을 준다

"확실한" 리터럴이라도 리터럴은 피한다.

적절하게 지역변수나 클래스를 사용하여 명명된 상수를 흉내낸다

명명된 상수를 일관성 있게 사용해라

 

배열

배열은 모든 항목이 동일한 형이고 배열 인덱스를 사용하여 직접적으로 접근 가능한 항목을 포함한다

배열의 모든 인덱스가 배열의 경계내에 있는지 확인한다

배열 대신 컨테이너의 사용을 고려하거나 배열을 순차적인 구조체로 생각하라

배열의 마지막 위치를 확인해라

다차원 배열에서는 첨자(subscript)가 정확한 순서대로 사용되고 있는지를 확인하도록 한다

인덱스가 혼선(cross-talk)되지 않도록 주의한다 - 중첩된 루프경우 Array(i)를 Array(j)이라고 작성하기 쉽다. 조심하자.

C에서는 배열을 다루기 위해서 ARRAY_LENGTH()매크로를 사용한다.

ex #defineARRAY_LENGTH (x) (sizeof(x) / sizeof(x[0]))

 

새로운 형 만들기

새로운형을 만들기 위한 지침들

기능 지향적인 이름으로 형을 생성한다 - 새로운 형이 표현하고 있는 실제 세계문제의 일부분을 가르키는 형이름을 사용한다.

미리 정의된 형을 피한다

미리 정의된 형을 재정의하지 않는다 - 표준형의 선언을 변경하면 혼란스럽다

이식성을 위해서 대체형을 정의하라

tyepdef를 사용하는 대신 클래스 생성을 고려해본다.`

이 글은 스프링노트에서 작성되었습니다.

by 무위자연 2008. 1. 19. 16:58