C 프로젝트를 설계하는 동안 따를 수있는 알려진 설계 원칙, 모범 사례 및 설계 패턴이 있습니까? 아니면 일반적으로 절차 적 (명령 적) 프로그래밍에 유용한 설계 원칙이 있습니까?
(저는 '객체 지향 세대'의 자식이며 처음으로 대규모 C 프로젝트를 설계해야합니다.)
C 프로젝트를 설계하는 동안 따를 수있는 알려진 설계 원칙, 모범 사례 및 설계 패턴이 있습니까? 아니면 일반적으로 절차 적 (명령 적) 프로그래밍에 유용한 설계 원칙이 있습니까?
(저는 '객체 지향 세대'의 자식이며 처음으로 대규모 C 프로젝트를 설계해야합니다.)
답변:
정보 숨김-Parnas ( Software Fundamentals ) 가지지하는대로 .
헤더 및 가시성의 신중한 관리 :
헤더는 자체 보호되므로 여러 번 포함 되어도 상관 없습니다.
#ifndef HEADER_H_INCLUDED
#define HEADER_H_INCLUDED
...rest of header contents, including other #include lines if necessary
#endif /* HEADER_H_INCLUDED */
'객체'(일반적으로 구조)에서 작동하도록 함수 세트를 설계하고이를 사용하는 코드에서 구조의 내부를 파고 드는 대신 해당 함수를 사용합니다. 자체 부과 캡슐화로 생각하십시오.
나의 세 가지 조언 :
예를 들면 다음과 같습니다.
typedef struct Vector {
int size;
int limit;
int* ints;
} Vector;
Vector* Vector_new() {
Vector* res = (Vector*) malloc(sizeof(Vector));
res->limit = 10;
res->size = 0;
res->ints = (int*) malloc(sizeof(int) * res.limit);
return res;
}
void Vector_destroy(Vector* v) {
free(v->ints);
free(v);
}
void Vector_add(Vector* v, int n) {
if(v->size == v->limit) {
v->limit = v->limit * 2 + 10;
v->ints = realloc(v->ints, v->limit);
}
v->ints[v->size] = n;
++v->size;
}
int Vector_get(Vector* v, int index) {
if(index >= 0 && index < v->size)
return v->ints[index];
assert false;
}
malloc
.
C로 객체 지향 코드를 작성하는 주제를 다루는 ANSI-C를 사용한 Object-Oriented Programming 이라는 제목의 좋은 무료 온라인 책 이 있습니다. "object-oriented C"에 대한 Google 검색 은 또한 많은 다른 장점을 산출합니다. 예와 자원.
프로젝트가 안전에 중요한 경우 MISRA-C 는 좋은 규칙 세트입니다. 주로 임베디드 c를위한 것이지만 다른 영역에서도 유용 할 수 있습니다.
저는 제 자신을 OO 코더라고 생각하고 임베디드 -C로 많은 작업을합니다. 특히 대규모 프로젝트에 대해 제가 드릴 수있는 최선의 조언은 과용하지 말라는 것입니다. ANSI C를 기반으로 완전한 OO 프레임 워크를 만드는 것은 매우 유혹적 일 수 있지만 제대로 작동하려면 많은 시간과 노력이 필요합니다. 더 좋아질수록 실제 프로젝트 에서 작업하는 대신 프레임 워크를 디버깅하는 데 더 많은 시간을 할애하게됩니다 . 명확한 머리와 YAGNI를 잘 이해하고 작업에 접근하십시오 . 행운을 빕니다!
{ }
블록 상단)에 변수를 선언해야한다는 것을 잊지 마십시오 . 그 하나는 항상 한 번 또는 두 번 나에게 물린:)
OOP는 기술이 아닌 방법론입니다. 그래서 첫 번째 조언은 그것을 절차 적 프로그래밍으로 생각하지 말라는 것입니다.
e. James의 지적에 따르면, 객체 지향 언어를 재창조하거나 그 능력이있는 척하고 싶지는 않습니다. 몇 가지 간단한 원칙을 고수하면 모든 올바른 일을 할 수 있습니다.