C语言编程原理

用Doug Gwyn的话来说,“Unix不是为了阻止你做愚蠢的事情,因为这也同样会阻止你做聪明的事情“。C是一个非常强大的工具,但它是需要小心且遵守纪律地使用。但是学习这些纪律是值得努力的尝试,因为C是最好的编程语言之一。一个有纪律的C程序员应该会...

喜欢维护性。不需要聪明时不要聪明。相反,寻求满足要求的最简单和最易理解的解决方案。大多数问题,包括性能,相对可维护性是次要的。你应该对你的代码有一个性能估算尺寸,在这个尺寸你尽可以大胆放心为可维护下考虑设计。

更重要的是,让新手能够理解你的代码,不要使用一些有趣的方式来解决问题,这样会妨碍他们理解。理想情况下,新手将会理解你的代码并从中学到东西。写代码时,想象一下,维护代码的人好像应该就是去年的你。

避免魔法。不要使用宏。不要使用typedef隐藏指针或避免写“struct”。避免编写复杂的抽象。保持您的构建系统简单和透明。不要使用愚蠢的hacky crap,不能因为它是解决这个问题的一个很酷的方法。即使没有上下文,你的代码的基本行为应该是明显的。

C的最大优点之一是其透明性和简单性。这个优点应该被积极拥抱,而不是颠覆。

识别和避免危险模式。不要使用固定大小的缓冲区 - 这总是要计算需要多少空间并分配它。需要将不安全的用户输入转换为干净的C结构。如果以后必须向用户提供此数据,请将其保存在C结构中,直到最后一个可能的时刻。学习和使用需额外敏感关心的函数像strcat。

写C有时像玩枪。枪是很重要的工具,但如果出了事故可能非常糟糕。你必须小心的对待枪支:你不要指向任何你喜欢的东西,你需要有良好纪律去使用它,你对待它就像它总是加载子弹一样。就像枪是用在能将物体击穿成洞一样,C在写内核时是有用的。

需要关心组织代码。不要将代码放在一个header中。不要使用 inline关键字。分离关注到单独的文件中。使用静态函数来组织你的逻辑。使用一种编码风格,给予一切足够的空间,这样眼睛才容易看得过来。当目的是不言而喻的时,使用单字母变量名;不是时,使用描述性的名字。

我喜欢将我的代码组织成实现一些组函数的目录,并给每个函数自己的文件。这个文件通常包含许多静态函数,但它们都用于组织这个文件负责实现的行为。写一个header能让其他人访问这个模块。并使用Linux内核的编码风格。

仅使用标准功能。不要假定平台是Linux。不要假定编译器是gcc。不要假定libc是glibc。不要假设架构是x86。不要假设coreutils是GNU。不要定义_GNU_SOURCE。

如果必须使用特定平台的功能,请为其描述接口,然后单独编写特定平台的支持代码。在任何情况下都不应该使用gcc扩展或glibc扩展。GNU已经枯萎,不要让它侵染你的代码。

使用规范的工作流程。有一个严格的版本控制方法。编写周到的提交消息 - 简要解释第一行中的更改,并在扩展提交消息中为其添加正当理由。在功能分支中使用明确定义的目标,并且不要包括不服务该目标的任何更改。不要害怕改变和编辑您的分支的历史,以便更清楚地显示您的修改。

当你以后返回到你的代码时,你会感谢你自己写的详细的提交消息。其他与您的代码交互的人也将感谢这一点。当你看到一些愚蠢的代码,很高兴地能够知道这个混蛋在当时的想法,特别是当这个有问题的混蛋正好是你。

做严格的测试和审查。确定您的更改可能采用不同的可能代码路径。测试他们的正确行为。给它不正确的输入。给它可能“永不发生”的输入。特别注意容易出错的模式。寻找地方来简化代码,使过程更清晰。

接下来,将您的更改提交给其他人审核。这个人应该应用相同的过程,并签署您的更改。还要遵守纪律,采取所有相同的步骤。

从错误中学习。首先,修复bug。然后,修复真正的bug:因为你的进程竟然允许这个bug发生。让你的代码审查者参与讨论 - 这也有他们的错。严格检查编写,审查和部署此代码的过程,并找出根本原因。

重要的是要记住规则是用来被打破。

Principles for C programming - Drew DeVault’s Blog