在设计C项目时,是否有任何已知的设计原则,最佳实践和设计模式?或者一般来说,程序(命令式)编程的有用设计原则是什么?
(我是'面向对象的一代'的孩子,并且必须首次设计一个大型的C项目)
答案 0 :(得分:62)
信息隐藏 - 由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 */
设计用于处理“对象”(通常是结构)的函数集 - 并使用这些函数而不是在使用它的代码中围绕结构的内部。将其视为自我封装。
答案 1 :(得分:22)
有一本好的,免费的在线书籍,标题为Object-Oriented Programming With ANSI-C,其中涵盖了用C语言编写面向对象代码的主题。google search用于“面向对象的C”也产生了一个数字其他好的例子和资源。
如果您的项目对安全至关重要,MISRA-C是一套很好的规则。它主要用于嵌入式c,但它也可用于其他领域。
我认为自己是OO编码器,我使用embedded-C做了很多工作。我能给出的最好的建议,特别是对于大型项目,不是要过分。在ANSI C之上创建一个完整的OO框架可能非常诱人,但需要花费大量的时间和精力来实现它。你得到的鸽友,花在调试框架上的时间越多,而不是在真正的项目上工作。头脑清醒,对YAGNI的良好,扎实的把握,完成任务。祝你好运!
答案 2 :(得分:21)
我的三个建议:
以下是一个例子:
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;
}
答案 3 :(得分:7)
OOP是一种方法而非技术。所以我的第一点建议就是不再将其视为程序编程。
对于e.James而言,您不想尝试重新创建面向对象的语言或假装您具备其功能。你仍然可以坚持一些简单的原则来做所有正确的事情:
答案 4 :(得分:4)
SEI CERT C编码标准提供了Good set of Rules and Common good practices以及您应该尝试避免使用的内容。