더 많은 코드를 계속 작성하면 코드를 구성하기가 어려울 때가 있습니다.
이것이 당신의 문제입니다. 조직을 올바르게 설정하고 스타일이 더 쉽게 흐를 것입니다.
코드 정리를 기다리지 말고 코드를 정리하십시오. 비록 언어가 당신을 위해 그것을하지 않지만, 코드는 여전히 낮은 결합과 높은 응집력을 가진 모듈로 구성되어야합니다.
그런 다음 이러한 모듈은 자연스럽게 네임 스페이스를 제공합니다. 충돌을 피하기 위해 모듈 이름 (길이가 긴 경우)을 약칭하고 함수 이름 앞에 해당 모듈을 붙입니다.
개별 식별자의 수준에서 이들은 주관적인 순서로 대략 증가합니다.
- 컨벤션을 고수
- 예를 들어,
function_like_this(struct TypeLikeThis variable)
일반적입니다
헝가리어 표기법을 피하십시오 (죄송합니다 JNL)
원래 의도대로 사용하지 않으려는 경우, 이는 끔찍한 시스템 버전이 아닌 Simonyi의 앱 표기법 을 의미 합니다
왜? 이에 대한 에세이를 쓸 수는 있지만 대신 Joel Spolsky가 작성한 이 기사 를 읽은 다음 관심이있는 경우 좀 더 찾아보십시오. 아래쪽에 Simonyi의 원본 용지에 대한 링크가 있습니다.
포인터 유형 정의가 실제로 불투명 한 쿠키 유형이 아닌 한 포인터 유형 정의를 피하십시오.
struct Type *ok;
typedef struct Type *TypePtr;
TypePtr yuck;
불투명 한 쿠키 유형 은 무엇을 의미 합니까? 클라이언트 모듈에 전달 해야하는 모듈 (또는 라이브러리 또는 기타) 내부에서 사용되는 것을 의미하지만 해당 클라이언트 코드는 직접 사용할 수 없습니다 . 라이브러리로 다시 전달합니다.
예를 들어, 데이터베이스 라이브러리는 다음과 같은 인터페이스를 노출 할 수 있습니다.
/* Lots of buffering, IPC and metadata magic held in here.
No, you don't get to look inside. */
struct DBContextT;
/* In fact, you only ever get a pointer, so let's give it a nice name */
typedef struct DBContexT *DBContext;
DBContext db_allocate_context(/*maybe some optional flags?*/);
void db_release_context(DBContext);
int db_connect(DBContext, const char *connect);
int db_disconnect(DBContext);
int db_execute(DBContext, const char *sql);
이제 내부를 볼 수 없기 때문에 컨텍스트가 클라이언트 코드에 불투명 합니다. 라이브러리로 다시 전달하면됩니다. 같은 FILE
것도 불투명하고 정수 파일 설명자는 쿠키 이지만 불투명하지 않습니다.
디자인에 대한 메모
나는 설명없이 낮은 결합과 높은 응집력 이라는 문구를 사용했으며 그것에 대해 약간 나쁘게 느낍니다. 당신은 그것을 검색하고 좋은 결과를 찾을 수 있지만, 나는 그것을 간단히 설명하려고 노력할 것입니다.
위에서 스케치 한 DB 라이브러리 는 외부 인터페이스에 작은 인터페이스를 제공하기 때문에 낮은 커플 링을 보여줍니다 . 구현 세부 정보 (불투명 쿠키 트릭 포함)를 숨기면 클라이언트 코드가 해당 세부 정보에 의존하지 않게됩니다.
불투명 쿠키 대신 컨텍스트 구조를 선언하여 내용이 표시되고 데이터베이스에 대한 TCP 연결을위한 소켓 파일 설명자가 포함되어 있다고 가정합니다. DB가 동일한 머신에서 실행될 때 공유 메모리 세그먼트 사용을 지원하도록 구현을 변경하는 경우, 클라이언트는 단지 재 링크가 아니라 재 컴파일되어야합니다. 더 나쁜 것은 클라이언트가 파일 설명자를 사용 하기 시작했을 수 있습니다 ( 예 : setsockopt
기본 버퍼 크기를 변경하기 위한 호출). 이제 코드도 변경해야합니다. 이러한 모든 세부 사항은 가능한 경우 모듈 내부에 숨겨져 있어야하며, 이는 모듈 간의 낮은 결합 을 제공 합니다.
또한 모듈의 모든 메소드가 동일한 작업 (DB 액세스)과 관련되어 있다는 점에서 높은 응집력 을 보여줍니다 . 것을 코드 만이 수단 필요가 디버깅을 단순화 구현 세부 사항에 대해 알 수있는 (즉, 우리의 쿠키의 내용) 실제로에 액세스 할 수 있습니다.
또한 단일 관심사가 있으면 이러한 기능을 그룹화 할 접두사를 쉽게 선택할 수 있습니다.
이제이 예제가 좋다고 말하는 것은 쉽지만 (특히 완전하지 않기 때문에) 즉시 도움이되지는 않습니다. 비결은 코드를 작성하고 확장 할 때 유사한 작업을 수행하거나 동일한 유형 (자체 모듈의 후보 일 수 있음)에서 작동하는 기능과 '별도의 별도 작업을 수행하는 기능'을 감시하는 것입니다. t 정말 관련이 있고, 분할 후보가 될 수 있습니다.