编码标准应该是什么?[关闭]


Answers:


40

每个要求的原因。这样,遵循该标准就不会成为某种形式的货物崇拜,并且人们知道,如果不再使用该标准的原因,可以更改该标准,或者在理由显然不适用的特定情况下违反该标准。


3
绝对。标准中的每个项目都应具有明确规定的理由。
AShelly

4
有时没有充分的理由选择,但是希望每个人都做同样的事情。我不知道为什么我们所有人都在右边开车来类比汽车,但是比右边一半和左边一半要好得多。
David Thornley 2010年

9
@David:这是拥有编码标准的完全合理的理由。如果那是原因,那么就应该这样简单地声明,即“原因:提高代码库的一致性”。
dsimcha 2010年

事实上,关于编码标准中最重要的事情是,有一个。里面的东西真的是次要的。
约尔格W¯¯米塔格

20

制表符与空格!当我的一位同事不小心将很多标签提交到空间转移到存储库时,我得到了疯狂的更新


1
我完全同意!
matiash

2
恕我直言,这是唯一值得纳入编码标准的东西。
P Shved


2
恕我直言,这是编码标准不应该涵盖的一个很好的例子。
Bjarke Freund-Hansen 2010年

@bjarkef,您喜欢混合制表符和空格代码吗?
JE队列

19

命名约定

编辑:这是指命名准则,而不是命名规则。

例如,准则为All boolean values should begin with Is/Can/Has/etc when possible。一条规则是All boolean values must start with Is


3
LPSZ * lppsz_CPP_MrKim_ClassOfStudents [] [];
Mateen Ulhaq 2010年

3
-1:这正是导致开发人员忽略标准的底层细节。您最好要求每个人都戴领带。
TMN 2010年

2
@TMN:缺乏命名约定是导致开发人员绝望地了解代码的确切原因。他们不必挑剔,但一些通用准则将极大地帮助您。
David Thornley 2010年

1
@Rachel:是的,我们有“所有布尔属性必须以'Is'开头”的标准。破坏了诸如IsCanUpdate和的属性IsHasChildren。当然,这是错误的,但是它是标准中的一项法令。这就是我的观点:一旦开始指定这些内容,就必须确保涵盖所有基础,否则人们会遇到标准未涵盖或覆盖不清的内容,然后他们写错了内容,或他们开始忽略标准。无论哪种方式,球队都会输。
TMN 2010年

1
这就是为什么我认为它应该包括有关如何命名对象的准则,而不是规则。确切的名称仍留给开发人员。我将编辑我的答案。
雷切尔2010年

10

组的编码标准应包括必须解决的警告和错误编译器选项

程序员应该可以自由地为自己的代码增加警告,但是必须有一个基线,以便阅读和使用他人的代码不会使您从编译器获得的输出混乱。

这样的标准还必须解决程序员应该如何逐案禁用此类警告的情况,如果有例外的代码片段否则将不符合要求。


同意 我要补充的另一部分是,如果您将其保留为警告,则必须通过更改它或取消警告来解决。否则,警告很快就会变得毫无用处(在大型项目中太多),您最好将其关闭。在VS中,我更喜欢看到Warnings破坏了构建并迫使您对其进行处理。
MIA 2010年

这不是您应该放入makefile中而不是标准中的东西吗?
Bjarke Freund-Hansen 2010年

@bjarkef:最终,这些选项将进入Makefile中,是的。但是将其纳入标准的目的是使必须解决的问题标准化。例如,开发人员应始终创建序列化ID吗?由团队决定是否应强制执行或忽略此操作。
Macneil 2010年

@bjarkef:当然可以,但是当您开始一个新项目并必须编写一个新的makefile(或者您的新项目使用Make以外的其他东西作为其构建工具)时,最好将它们作为标准参考。
TMN 2010年

9

我喜欢一些标准(我知道有很多标准,但是我更喜欢这些标准):

  • 80%的单元测试覆盖率
  • 代码的集体所有权(编写要由队友而非编译器读取的代码)
  • 写评论。将您要说的话写给新人。
  • 把事情简单化

有关单元测试覆盖率的要求是可以纳入编码标准的最好的事情之一。
亚当·克罗斯兰

关于测试覆盖率:为什么只有80%?这又是80/20规则的一个例子,根据您的经验,最终20%的人将需要100%的努力才能实现?另外,什么样的承保范围?[例如声明的覆盖范围?功能覆盖范围?决策范围?病情覆盖?]
Macneil's

@Macneil:是的。我发现对于大多数班级来说,有80%的人“足够好”,这是一个很好的数字。我曾经尝试达到95%,这确实是浪费时间。当然,如果某些课程很容易达到100%,那就继续吧

那该声明涵盖了吗?似乎许多工具不能给您带来更多的收益。您使用什么工具?
Macneil

我使用TestDriven.net并为其构建了nCover

7

编码标准帮助,当你编写代码的第一次一点,他们帮助很大 ,当你或你的更换,有2年后更新代码。

理想的标准导致出现代码,您可以在其中跳转到代码中的任意页面,并在第一次通读时确切地了解它的作用,因为

  • 这些名称清楚地描述了正在处理的数据,
  • 大括号使控制流程清晰明了,
  • 注释说明了任何非显而易见的算法,等等。

另一方面,太多的任意标准会破坏编写代码的流程。因此,我认为应根据以下两个标准对提议的编码约定中的每个项目进行评估:

  • 此规则有助于确保代码正确吗?
  • 此规则有助于确保代码清晰吗?

如果都不正确,则该项目只是任意的,可能不必要


我将在编写的标准中包括以下内容:

为清晰起见:

  • 文件组织:为文件中的项目指定固定顺序,可使团队轻松浏览其他文件。您不必去寻找#defines或结构定义。

  • 命名约定:一致的命名有助于可读性。但是,避免过多指定太多规则,这会损害可写性。

  • 代码结构。Curly Brace的位置,缩进级别,空格与制表符等。是的,这可能是个人的强烈偏爱,但目标是明确的代码。为团队找到最佳选择,并坚持下去。

正确性:

  • 针对您的问题类型的最佳实践:有关内存分配,并发性或可移植性的规则。

  • “常量Correctnesss”,正确使用staticvolatile等。

  • 有关预处理器宏的规则,以及该语言的其他容易滥用的功能。



4

编码标准应该是什么?尽可能少。少则多。并请有正当理由。

并不是因为我是一个不需要任何过程的牛仔编码员,而是因为我看到了繁重的编码规范,其背后没有逻辑(大概),“我在'95年代的某个地方的网上发现了这个,最终变成了一场官僚的噩梦。

某些人似乎诚实地相信,通过提高标准,他们会看到代码“质量”的相应提高,也许通过这种方式,他们会发现。同时,他们将忽略体系结构,性能,常识和其他一堆比文件中的行数重要得多的事情。


3

代码审查以执行标准的过程。哦,也可以找到错误。


3

一些良好的旧常识不会出错。太多的编码标准文档都在无关紧要的方面进行工作(字体类型和大小等项目是我所见过的更极端的项目之一)。

如果您在一组开发人员中,最好的做法是互相交谈并查看代码,就可以接受的内容达成共识,以及是否需要将要点写下来作为准则,但要保留它们作为准则。只是那个准则。如果您无法证明与指南之间存在任何差异,那么您应该考虑为什么这样做。

归根结底,清晰易懂的代码比对布局或版式的任何严格规定更为重要。


如何检查字体类型和大小?
JE队列

@xepoch,当时是在视觉上。当时的标准是双重的,当经理打印出来并且指定字体来解决间距问题(需要等宽)时,对于经理来说更容易阅读。排列整齐。
GrumpyMonkey 2010年

噢,上帝-让我想起了强制所有内容之间使用空行的标准-我满意的方法之间(因为大量空格有助于区分大块),但在每个注释块之前和之后,以及在fn声明之后,在功能代码等之前...最后有点傻了。
gbjbaanb 2012年

2

正如其他人提到的那样,代码测试的覆盖范围很重要。我也喜欢看:

  • 项目结构。测试是代码的一部分,还是在单独的项目/程序包/目录中?UI代码是否与后端内容一起使用?如果没有,如何分隔?

  • 开发过程。在代码之前编写测试?修复损坏的构建优先于开发吗?什么时候进行代码审阅,应涵盖哪些内容?

  • 源代码管理。什么时候检入?设计文档和测试计划是否受版本控制?您什么时候分支,什么时候标记?您是否保留以前的版本,如果保留,则保留多少/持续多长时间?

  • 部署标准。如何打包构建?发行说明需要什么?如何创建/控制/运行升级脚本?

忘记所有有关命名约定,格式以及函数/方法/模块中可以包含多少行的内容。一条规则:在编辑的内容中使用现有样式。如果您不喜欢某人的样式,请在代码审查中加以区分。唯一的例外可能是tabs-vs-spaces,这仅仅是因为许多编辑器/ IDE会盲目地将它们转换为另一种,然后由于每一行都被更改而最终破坏了更改历史记录。


2

我认为实际上有两件事需要解决,实际上我会分开考虑它们,因为虽然我认为两者都很重要,但无法以相同的方式进行处理。

  • 技术方面:旨在避免有风险或格式错误的代码(即使已被编译器/解释器接受)
  • 表示方面:与使程序清晰易懂有关

我在技术方面符合编码标准,包括Herb SutterAndrei Alexandrescu及其C ++编码标准。我符合编码风格的演示,其中包括命名约定,缩进等。

编码标准

因为它纯粹是技术性的,所以编码标准几乎可以是客观的。因此,每条规则都应有理由支持。我在书中提到的每个项目都有:

  • 标题,简单明了
  • 摘要,说明标题
  • 讨论,它说明了进行其他操作的问题,从而阐明了理由
  • 可选一些示例,因为一个好的示例价值一千个单词
  • 可选不能应用此规则的例外列表,有时带有解决方法
  • 讨论了这一点的参考文献(其他书籍,网站)列表

基本原理和异常非常重要,因为它们概述了原因和时间。

标题应足够明确,以使得在评审过程中,只需要列出要使用的标题(备忘单)即可。显然,按类别对项目进行分组以使其更容易查找。

即使C ++被认为是毛茸茸的,Sutter和Alexandrescu仍然只能列出一百个项目;)

编码风格

这部分通常不太客观(可以是完全主观的)。这里的目的是保证一致性,因为这有助于维护人员和新手。

您不想在这里进入哪个缩进或大括号样式更好的圣战,为此有论坛:因此在此类别中,您通过共识>多数投票>领导人的任意决定来做事。

有关格式的示例,请参见“ 艺术风格”的选项列表。理想情况下,规则应该清晰,完整,以使程序可以重写代码(尽管不太可能会编写一个;))

对于命名约定,我将尝试使类/类型与变量/属性容易区分开。

我也在此类别中将“度量”分类为:

  • 宁愿从短到长的方法:通常很难就多长的时间达成一致
  • 希望尽早返回/继续/休息以减少缩进

杂项?

最后,在编码标准中很少讨论(如果有的话)一项,也许是因为它对于每个应用程序来说都是特定的:代码组织。架构问题也许是最突出的问题,将最初的设计搞砸了,从现在开始,您将为之困扰。您也许应该添加一个用于基本文件处理的部分:公共/私有头,依赖项管理,关注点分离,与其他系统或库的接口...


但是,如果它们没有被实际应用和执行,那将什么都不是。

任何违规行为都应在代码审查期间提出,并且如果未解决违规行为,则不能进行代码审查:

  • 修改代码以符合规则
  • 修正规则,使代码不再突出

显然,改变规则意味着要从领导者那里“走出去”。


2

我喜欢《框架设计指南》中的格式,它包括一个概述部分和该指南的基本原理。最有用的部分是从“执行”,“请勿”,“避免”和“考虑”开始的细节。

这是“ 实现接口成员 ”部分中的一个示例,它明确包含以下内容(请注意,为求简单,我放弃了基本原理)

避免在没有充分理由的情况下显式实现接口成员

如果仅通过接口调用成员,则考虑显式实现接口成员。

不要将显式成员用作安全边界。

提供一个受保护的虚拟成员,它提供了相同的功能>明确执行成员,如果该功能是指由派生类专业。

这会产生良好的总体音调。通过使用“避免并考虑”,您可以允许开发人员使用他们的判断。另外,由于它们只是准则而非规则,因此开发人员可能会发现它们更可口,从而更有可能遵循它们。


我目前在哪里工作,必须明确实现所有接口,这是一个很大的痛苦。如果只有他们在编写编码标准之前已经阅读了《框架设计指南》。
马丁·布朗

1

似乎没有人提到安全性-在编码标准中,您必须参考安全代码要求(例如,使用输入验证模块,不允许使用已知的弱函数(例如strcpy,错误处理要求等))


+1:即使是有经验的开发人员,这种和多线程注意事项通常也不为人所知或被误解了。
TMN 2010年

1

例子。整齐排列,不平凡,贴近现实的示例,充分利用了每个规则。注释(不一定是代码的一部分)示例的哪一部分遵循哪个规则。

模板。不是C ++类型,而是复制粘贴并实时填充的内容。当您有引用要复制时,更容易获得正确的24行样板注释。


1

第一功能:绝对最多两页。

这是您希望每个开发人员都阅读并记住的内容。您不必在每次需要编写新函数(或更糟的是新行)时都查看标准。因此,请保持简短,并仅保留确实为最终产品增加价值的规则。


1

编码标准实际上是以下几项:

编码约定

  • 这些事情除了“代码库的一致性”之外,不需要其他原因。是否在私有成员变量中使用“ _”。
  • 可能有几种正确的方法。只需选择一个即可保持一致性。对于前。使用异常或错误代码处理错误。

最佳实践

  • 这些项目总是需要一个很好的理由,并提供一些明确的例子

对于前。 尝试后绝不留空渔获

try { Foo(); } catch { //do nothing }

1)如果Foo()抛出异常,则可能导致后面的函数出现其他问题(假定foo成功)。

2)全局错误处理程序在产品上发生异常时不会通知支持团队异常

  • 涵盖了“防御性编码”的实践,例如使用断言来检验您的假设。

编码环境

  • 整个团队使用的工具。对于前。VS 2010,Resharper,窑炉等。

0

当写在纸上的编码标准非常有效时。我喜欢Go发布其编码标准的方式。它具有将gofmt程序文本格式化为格式的工具。关于编码格式的任何辩论都将仅仅是对以下来源的补丁gofmt

至于格式应该是什么,

  • 如何命名变量,宏,常量,文字,函数等
  • 当涉及到{,},(,),[,]时如何放置 if,函数主体,语句块是否出于任何其他目的,
  • 压痕应该有多宽
  • 一行文本允许多少个字符
  • 在拒绝/发送代码以进行重构之前,允许多少级缩进
  • 在每个函数返回给重构之前,每个函数允许多少行代码
  • 函数被送回进行重构之前可以接受的最大参数数量
  • 如果主体超过了屏幕代码的一页,则在函数开始简要解释其功能之前,需要进行几行注释;将对象的实现方式留给函数体内的代码

当我阅读别人的(主要是C语言)代码时,如果变量/函数名称在项目上下文中不直观,或者超过五个缩进级别,或者函数采用了六个或七个以上的参数,或者函数运行超过屏幕上只有两三页,阅读和理解代码变得非常困难。当要求对其进行增强/维护工作时,只会增加难度。这让我希望gofmt为每个项目(甚至语言)编写程序,并在将每个程序提交到项目之前通过该程序运行每个源代码文件。


已经有很多年的代码美化了。Google为您提供一种语言,您会找到一种。
gbjbaanb 2012年


By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.