C的设计原则,最佳实践和设计模式(或一般的程序编程)?

时间:2010-03-22 13:16:10

标签: c design-patterns principles

在设计C项目时,是否有任何已知的设计原则,最佳实践和设计模式?或者一般来说,程序(命令式)编程的有用设计原则是什么?

(我是'面向对象的一代'的孩子,并且必须首次设计一个大型的C项目)

5 个答案:

答案 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)

我的三个建议:

  • 编写单元测试。它们将帮助您在设计过程中为您的问题提供支持。比单纯依靠预先思考的思维要好得多。
  • 从第一天开始安装并运行内存泄漏检测器(有各种各样的库)。一旦程序/测试退出,此库就会打印出所有泄漏。这将使您在引入泄漏时立即发现泄漏,从而使其修复更少痛苦。
  • 在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;
}

答案 3 :(得分:7)

OOP是一种方法而非技术。所以我的第一点建议就是不再将其视为程序编程。

对于e.James而言,您不想尝试重新创建面向对象的语言或假装您具备其功能。你仍然可以坚持一些简单的原则来做所有正确的事情:

  1. 试驾一切。
  2. 查找不同的内容并将其封装起来。
  3. 设计界面。

答案 4 :(得分:4)

SEI CERT C编码标准提供了Good set of Rules and Common good practices以及您应该尝试避免使用的内容。