C语言的设计原则、最佳实践和设计模式(或一般的过程编程)?

C语言的设计原则、最佳实践和设计模式(或一般的过程编程)?,c,design-patterns,principles,C,Design Patterns,Principles,在设计C项目时,是否有任何已知的设计原则、最佳实践和设计模式可以遵循?还是程序(命令式)编程的有用设计原则 (我是“面向对象的一代”的孩子,不得不第一次设计一个大型的C项目)信息隐藏——正如Parnas()所支持的那样 仔细管理标题和可见性: 源文件中可以对外部世界隐藏的所有内容都应:;只有记录在案的外部接口才应公开 公开的所有内容都在头中声明 该标题用于需要功能的地方(以及定义功能的地方) 标题是自包含的——当您需要它时,您可以使用它,您不必担心“我还必须包含哪些其他标题”,因为标题通过包含

在设计C项目时,是否有任何已知的设计原则、最佳实践和设计模式可以遵循?还是程序(命令式)编程的有用设计原则


(我是“面向对象的一代”的孩子,不得不第一次设计一个大型的C项目)

信息隐藏——正如Parnas()所支持的那样

仔细管理标题和可见性:

  • 源文件中可以对外部世界隐藏的所有内容都应:;只有记录在案的外部接口才应公开
  • 公开的所有内容都在头中声明
  • 该标题用于需要功能的地方(以及定义功能的地方)
  • 标题是自包含的——当您需要它时,您可以使用它,您不必担心“我还必须包含哪些其他标题”,因为标题通过包含使其工作所需的任何内容来确保其工作
  • 头是自我保护的,所以它是否被多次包含并不重要

    #ifndef HEADER_H_INCLUDED
    #define HEADER_H_INCLUDED
    ...rest of header contents, including other #include lines if necessary
    #endif /* HEADER_H_INCLUDED */
    
  • 设计一组函数来处理“对象”(通常是结构)——并使用这些函数,而不是在使用它的代码中插入结构的内部。可以将其视为自我强加的封装


有一本很好的免费在线书籍,书名为《用C编写面向对象的代码》。关于“面向对象的C”的a还提供了许多其他很好的示例和资源

如果您的项目是安全关键的,那么有一套好的规则。它主要用于嵌入式c,但也可以用于其他领域


我认为自己是一个面向对象的程序员,而且我在嵌入式应用方面做了很多工作。在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的乐趣。不要忘了你