목록codecomplete (11)
no swim no life
논리적인 명령문 테이블에 입력된 데이터는 논리적인 명령문(코드로 작성된 데이터)보다 유지 보수하기 쉽다. 직접 접근 방식 데이터 자체를 참조 키로 사용 간단하고 빠름 참조 키 조작 데이터를 키 값으로 사용할 수 있도록 수정 월별일수, 보험료 테이블 등 인덱스 접근 방식 어떤 값을 테이블의 키 값으로 직접 쓰기 어려운 경우 메인 테이블을 유지하고, 이를 참조하는 인덱스 테이블을 구성 검색 속도의 이점 메인 테이블에 있는 각 엔트리들의 크기가 크다면, 인덱스 테이블을 이용하여 공간을 줄일 수 있음 인덱스 사용으로 공간적인 이익을 얻을 수 없더라도, 메인 테이블에 있는 엔트리보다 인덱스에 있는 엔트리를 다루는 것이 더 간단 단계적 접근 방식 인덱스 방식처럼 간접적 접근 불규칙적인 값으로 테이블 인덱스를 만들기..
여러 곳에서 리턴하는 루틴 return, exit 문은 프로그램이 원하는 순간에 루틴으로 부터 빠져나갈 수 있는 제어 구조 보다 읽기 쉬운 코드를 만들기 위해서 return을 사용 어떤 루틴에서 답을 알고 있을 때 정리작업 후 곧바로 호출 루틴으로 리턴 복잡한 오류 처리를 단순화하기 위해서 보호절을 사용 정상적인 작업을 수행하기 전에 많은 오류 조건들을 검사해야 하는 코드 재귀적 용법 재귀적 용법에서는 한 루틴이 문제의 작은 부분을 해결하고 그 문제를 더 작은 부분으로 나눈 다음, 더 작은 부분의 각각을 해결하기 위해서 자신을 호출 작은 문제의 그룹인 경우에는 간단하고 훌륭한 해결책이 될 수 있다 재귀적 용법의 예 미로 해결 재귀 호출 사용 팁 재귀 호출이 중단되는지 확인 무한 재귀 호출을 막기 위해서 ..
루프 제어 루프에 영향을 미치는 요소의 수를 최소화 될 수 있는 한 제어 부분을 루프의 밖에 입력하고, 루프 내에서 실행되어야 하는 조건들을 분명히 한다. 루프 진입 한 위치에서만 진입한다. 루프가 시작되기 바로 전에 초기화 코드를 입력한다. 무한 루프는 while ( true )를 사용한다. 루프 처리 루프에 있는 명력문들을 둘러싸기 위해서 { 과 }을 사용한다. 빈 루프를 피한다. 루프에서 보조 관리 작업들(housekeeping)은 루프의 시작이나 끝에 놓는다. 루프가 하나의 기능만 수행하도록 한다. 루프 종료 종료되는지 확인한다. 종료 조건을 명확하게 한다. 루프를 종료하기 위해서 for 루프의 인덱스를 조작하지 않는다. 루프 인덱스의 마지막 값에 의존하는 코드를 피한다. while 루프에서 bo..
14: 직선형 코드 구성하기 의존성이 분명한 코드 구성 의존성을 분명히 하기 위해서 루틴 매개변수를 사용 의존성이 분명하지 않은 부분은 주석으로 문서화 15: 조건문 사용 정상적인 경우를 else가 아니라 if 문 다음에 입력 4개 이상의 조건에 대해 CASE 사용
구조체 데이터 관계를 이해하기 쉽게 하기 위해서 구조체를 사용 포인터 메모리 상의 위치 (32bit) 메모리의 내용을 해석하는 방법 (type) 포인터 오류의 빠른 발견이 중요 포인터를 선언과 동시에 정의 포인터를 할당된 곳과 같은 영역 내에서 삭제 dog-tag 필드의 사용 start-bit와 end-bit를 사용할 수 있으며 dog-tag는 포인터 영역의 상태를 표시 여분의 포인터 변수를 사용 포인터 연산을 단순화시킴으로써 발생하는 성능 향상 연결 리스트나 서로 다른 깊이의 포인터들을 올바른 순서로 삭제 경우에 따라 임시 메모리를 유지하여 메모리 부족시에 이용 중요한 데이터는 메모리를 해제하기 전에 쓰레기 데이터(0xcc)로 덮는다. wapping function 사용 메모리를 삭제하거나 해제한 다음..
명명된 상수 매직 넘버(magic number)를 피한다. 매직 넘버는 100이나 47524와 같이 아무런 설명도 없이 프로그램 한가운데 나타나는 리터널 숫자이다. (문자열도 마찬가지) named constant를 이용하며, 필요하다면 1, 0은 그냥 사용한다. 정수 곱셈으로 인한 정수 오버플로우에 주의한다. 아래는 정수의 표현범위 이다. 정수형 범위 부호 있는 8비트 -128 ~ 127 부호 없는 8비트 0 ~ 255 부호 있는 16비트 -32,768 ~ 32,767 부호 없는 16비트 0 ~ 65,535 부호 있는 32비트 -2,147,483,648 ~ 2,147,483,647 부호 없는 32비트 0 ~ 4,294,967,295 부호 있는 64비트 -9,223,372,036,854,775,808 ~ ..
문제 지향성(Problem Orientation) 기억하기 쉬운 이름은 일반적으로 해결책보다 문제에 대해서 말한다. 좋은 이름은 "어떻게" 보다 "무엇"을 표현하는 경향이 있다. 일반적으로 이름이 문제보다 해결 과정의 어떤 측면을 가리키고 있다면, 이는 "무엇" 보다는 "어떻게"에 대한 것이다. 문제 자체를 가리키는 이름을 사용하도록 한다. 변수 이름의 일반적인 반의어들 begin/end first/last locked/unlocked min/max next/previous old/new opened/closed visible/invisible source/target source/destination up/down 전형적인 불린 변수의 이름 done 무언가 수행되었다는 것을 가리키기 위해서 done을 ..
데이터 사용 능력 테스트 친숙한 용어 옆에 1점을, 알지만 확신할 수 없다면 0.5점을 입력한다. ___ 추상 데이터 형 ___ 배열 ___ 비트맵 ___ 불린 변수 ___ B-트리 ___ 문자 변수 ___ 컨테이너 클래스 ___ 배 정도 ___ 연장 스트림 ___ 열거 형 ___ 부동소수점 ___ 힙 ___ 인덱스 ___ 정수 ___ 연결 리스트 ___ 명명된 상수(named constant) ___ 리터럴(literal) ___ 지역 변수 ___ 참조 테이블 ___ 멤버 테이터 ___ 포인터 ___ private ___ 소급 시냅스(retroactive synapse) ___ 참조 무결성 ___ 스택 ___ 문자열 ___ 구조적 변수 ___ 트리 ___ typedef ___ union ___ 값 체인..
게으름 재미없는 작업을 다시 수행할 필요가 없도록 툴을 작성하는 것 지적인 정직함 전문가가 아님에도 전문가인 것처럼 행동하지 않는 것 실수를 기꺼이 인정하는 것 오류 메시지를 막기보다는 컴파일러 경고를 이해하기 위해서 노력하는 것 작동하는지 확인해 보기 위해서 컴파일을 하기보다는 프로그램을 명백하게 이해하는 것 현실적인 일정표를 제공하고 관리자가 일정을 조절할 수 있는지 물었을 때 자신의 입장을 지키는 것 어떤 바보라도 자신의 실수에 대해서 정당성을 주장할 수 있으며 대부분의 바보들이 그렇게 한다.
저는 주석이 책의 표제나 목차와 같기를 바랍니다. 주석은 올바른 섹션을 찾는 데 도움을 주며, 그 다음부터 코드를 읽기 시작합니다. 프로그래밍 언어로 작성된 20줄의 코드를 읽는 것보다는 영어로 작성된 한 문장을 읽는 것이 훨씬 빠릅니다. .... 마치 당신들은 한 번도 다른 사람이 작성한 코드를 수정해야 했던 적이 없었던 것처럼 들리는군요. 저는 제가 바꿔야 하는 두 줄짜리 코드를 찾기 위해서 엄청나게 집중해서 수 백 줄의 코드를 읽을 필요는 없다고 생각합니다.
한 줄에 지나치게 많은 연산을 수행 strcpy( char * t, char * s ) { while ( *++t = *++s ); } strcpy( char * t, char * s ) { do { ++t; ++s; *t = *s; } while ( *t != '\0' ); } t 와 s 는 *s 가 *t 에 복사되기 전에 증가, 첫 번째 문자가 빠진다. 5,000,000 문자열을 복사할 때 첫 번째 버전은 4.81초, 두 번째 버전은 4.35초가 걸렸다. 이 경우에서는 "머리를 굴린" 버전이 11% 정도 속도가 느렸으며, 결국 쓸데없이 머리를 굴린 꼴이 되었다.