首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C语言的设计原则、最佳实践和设计模式(或一般的过程化编程)?

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

Stack Overflow用户
提问于 2010-03-22 21:16:10
回答 4查看 60.7K关注 0票数 94

在设计C项目时,有没有什么已知的设计原则、最佳实践和设计模式可以遵循?或者一般的过程式(命令式)编程的有用的设计原则?

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-03-22 21:34:35

信息隐藏-由Parnas (Software Fundamentals)支持。

仔细管理标头和可见性:

  • 源文件中所有可以对外界隐藏的东西都应该是;只有文档记录的外部接口应该是在header中声明的exposed.
  • Everything。
  • 该header用于需要该功能的地方(以及定义它的位置)。
  • header是自包含的-当您需要它时,您可以使用它,并且您不必担心“我还必须包含哪些其他header”,因为header通过包含它所需的任何内容来确保它的工作。
  • header是自我保护的-所以它被多次包含并不重要。

#ifndef HEADER_H_INCLUDED #定义标题内容的包含行,如有必要,包括其他# HEADER_H_INCLUDED行#endif /* HEADER_H_INCLUDED */

  • 设计函数集来处理“对象”(通常是结构)-并使用这些函数,而不是在使用它的代码中探查结构的内部。可以把它看作是自我强加的encapsulation.
票数 67
EN

Stack Overflow用户

发布于 2010-03-23 13:22:32

我的三点建议:

  • 编写单元测试。它们将帮助您在开发过程中专注于解决问题的设计。
  • 从第一天起就安装并运行了一个内存泄漏检测器(有各种各样的库)。一旦程序/测试退出,就让这个库打印出所有泄漏。这将允许您在引入漏洞时立即捕获它,从而使修复它变得更轻松。
  • 用C编写OOP代码并不难。虽然可以模拟方法覆盖,但我建议您从模拟简单对象开始。即使是这个简单的机制也能给你带来很大的好处。

下面是一个例子:

代码语言:javascript
复制
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;
}
票数 24
EN

Stack Overflow用户

发布于 2010-03-22 21:36:06

有一本很好的免费在线书籍,名为,它涵盖了用C编写面向对象的代码的主题。“面向对象的C”的google search还提供了许多其他很好的示例和资源。

如果你的项目是安全关键型的,MISRA-C是一套很好的规则。它主要用于嵌入式c语言,但在其他领域也很有用。

我认为我自己是一个面向对象的程序员,我在嵌入式C中做了很多工作。我能给出的最好的建议是,尤其是对于大型项目,不要做得太多。在ANSI之上创建一个完整的OO框架可能非常诱人,但这需要花费大量的时间和精力才能做到这一点。你得到的越多,你花在调试框架上的时间就越多,而不是花在真正的项目上。头脑清晰,对YAGNI有扎实的掌握。祝你好运!

票数 21
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2492446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档