C语言的设计原则、最佳实践和设计模式(或一般的过程编程)?
在设计C项目时,是否有任何已知的设计原则、最佳实践和设计模式可以遵循?还是程序(命令式)编程的有用设计原则C语言的设计原则、最佳实践和设计模式(或一般的过程编程)?,c,design-patterns,principles,C,Design Patterns,Principles,在设计C项目时,是否有任何已知的设计原则、最佳实践和设计模式可以遵循?还是程序(命令式)编程的有用设计原则 (我是“面向对象的一代”的孩子,不得不第一次设计一个大型的C项目)信息隐藏——正如Parnas()所支持的那样 仔细管理标题和可见性: 源文件中可以对外部世界隐藏的所有内容都应:;只有记录在案的外部接口才应公开 公开的所有内容都在头中声明 该标题用于需要功能的地方(以及定义功能的地方) 标题是自包含的——当您需要它时,您可以使用它,您不必担心“我还必须包含哪些其他标题”,因为标题通过包含
(我是“面向对象的一代”的孩子,不得不第一次设计一个大型的C项目)信息隐藏——正如Parnas()所支持的那样 仔细管理标题和可见性:
- 源文件中可以对外部世界隐藏的所有内容都应:;只有记录在案的外部接口才应公开
- 公开的所有内容都在头中声明
- 该标题用于需要功能的地方(以及定义功能的地方)
- 标题是自包含的——当您需要它时,您可以使用它,您不必担心“我还必须包含哪些其他标题”,因为标题通过包含使其工作所需的任何内容来确保其工作
- 头是自我保护的,所以它是否被多次包含并不重要
#ifndef HEADER_H_INCLUDED #define HEADER_H_INCLUDED ...rest of header contents, including other #include lines if necessary #endif /* HEADER_H_INCLUDED */
- 设计一组函数来处理“对象”(通常是结构)——并使用这些函数,而不是在使用它的代码中插入结构的内部。可以将其视为自我强加的封装
我认为自己是一个面向对象的程序员,而且我在嵌入式应用方面做了很多工作。在ANSIC之上创建一个完整的OO框架可能非常诱人,但要想正确实现它需要花费大量的时间和精力。你越是喜欢,你就越会花更多的时间调试你的框架,而不是在真正的项目上工作。以清晰的头脑处理任务,并良好、扎实地掌握知识。祝你好运
OOP是一种方法而不是一种技术。所以我的第一点建议是不要把它看作是过程编程 按照e.James的观点,您不想尝试重新创建一种面向对象的语言,也不想假装您拥有这种语言的功能。只要坚持几个简单的原则,你仍然可以做所有正确的事情:- 编写单元测试。他们将帮助你专注于一个适合你的问题的设计。比单纯依靠预先思考要好得多
- 从第一天开始安装并运行内存泄漏检测器(有各种各样的库)。一旦程序/测试退出,让该库打印出所有泄漏。这将允许您在引入漏洞时立即发现漏洞,从而使其修复的痛苦大大降低
- 用C编写OOP代码。没那么难。虽然可以模拟方法重写,但我建议您从模拟简单对象开始。即使是这个简单的机械装置也能让你跑得更远李>
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;
}
typedef结构向量{
整数大小;
整数极限;
整数*整数;
}载体;
向量*Vector_new(){
Vector*res=(Vector*)malloc(sizeof(Vector));
res->limit=10;
res->size=0;
res->ints=(int*)malloc(sizeof(int)*res.limit);
返回res;
}
无效向量(向量*v){
免费(v->ints);
免费(五);
}
空向量加(向量*v,整数n){
如果(v->size==v->limit){
v->limit=v->limit*2+10;
v->ints=realloc(v->ints,v->limit);
}
v->ints[v->size]=n;
++v->尺寸;
}
int Vector_get(向量*v,int索引){
如果(索引>=0&&indexsize)
返回v->int[索引];
断言错误;
}
您可能对这个问题的答案感兴趣:在发布我的问题之前,我做了一些互联网和大学图书馆的研究,绝对没有被有关C软件设计的书籍所淹没。我想问您最喜欢的(不谈一般的C语言书籍,不谈有意义的变量名之类的编码约定,而是更高的抽象、软件架构级别)。此外,我不同意你“依赖他人”的指责。你的意思是每个程序员都应该自己找出最佳实践和良好的设计模式?这肯定是一个需要借鉴他人经验的问题。对不起,迪米,这不是关于你的,我不是很清楚。这些东西过去是pas口头传统和其他任何方式一样,都会让人失望:没有一套名义上的官方“模式”,Jonathon的答案是你在书中能找到的,但每个人都知道信息隐藏。似乎口头传统正在消失,许多年轻程序员认为OOP发明了封装和分离。这个社区似乎没有我想看到的那么了解自己的历史。因此我承认我脾气暴躁老人领地。我无法分享您的回顾,因为我刚刚涉足该领域,但我接受您的建议。感谢您更清晰地表达自己,对于阅读有经验的人的观点总是非常有价值的。我非常感谢您的贡献。SEI CERT C编码标准提供了您应该提供的内容尽量避免使用。谢谢你,e.James。我不想在ANSI C上创建一个面向对象的框架,但要寻找特殊和适当的程序编程设计原则。MISRA-C提示非常有用,特别是因为它实际上是一个嵌入式项目。我将更仔细地看一看。啊,嵌入式C的乐趣。不要忘了你