你被强制遵守的最奇怪的编码规范是什么?

173

当我在这个问题中询问时,几乎总是得到明确的回答,你应该有编码标准。

你被强制遵循的最奇怪的编码标准规则是什么?

我所说的最奇怪是指最有趣、最糟糕或者只是非常奇怪的规则。

在每个答案中,请提及编程语言、您的团队规模以及它对您和您的团队产生的不良影响。


19
阅读完这份清单后,我突然感觉自己的职业生涯非常幸运,可以避免接受这些强制标准的乱七八糟! - matt b
下次我面试工作时,我会浏览这些问题作为“红旗。立刻离开!”的标志。编码规范反模式,确实如此。 - Stu Thompson
5
我很不好意思地承认,在我职业生涯的早期阶段,我曾经向团队强加了一个答案。对不起,伙计们。 - JasonFruit
112个回答

433

当禁止使用多个返回时,我讨厌这种情况。


27
这个规则的意图是什么?就我个人而言,如果通过添加另一个返回语句可以使代码更易读,那么我会因此未能通过代码审查。 - Mark Baker
23
另一方面,在代码开头消除像 "if(param == null) return null" 这样的选项可以大大简化您的代码,禁止它而不是鼓励它有点过分了。 - Bill K
40
解决方法:如果(!Initialize()),{ RetVal=ERR_BADINIT; 转到ReturnPoint; }(更多代码)ReturnPoint: 返回RetVal; }问题解决了! ;) 注:Workaround可以翻译为“解决方法”或“变通方法”,此处根据上下文选择了“解决方法”。 - Marc Bernier
9
直到最近,多重返回是被禁止的。然后有人揭示这是C语言遗留问题,在C++中已经被RAII和函数大小小于15行所淘汰。此后,就像《勇敢的心》电影中的角色一样:“自由!!!”…:-p… - paercebal
123
你的选择:多个返回或更多嵌套的if语句。我会选择多个返回。 - Lance Fisher
显示剩余28条评论

333

反向缩进。例如:

    for(int i = 0; i < 10; i++)
        {
myFunc();
        }

并且:

    if(something)
        {
// do A
        }
    else
        {
// do B
    }

153
天啊...我能见一下想出这个的反社会人格吗?他可以教我一些关于厌人症的事情。 - John Rudy
23
那不可能是真的。 - Dane
192
每当你反转缩进,上帝就会杀死一名维护开发者。 - Chris Vest
14
天啊,你在开玩笑吧? - Andrea Ambu
21
节省宝贵的字节...无价,多加使用。 - Spikolynn
显示剩余17条评论

325

也许不是你听过的最古怪的事情,但我非常讨厌在数据库表名前加上“tbl”


5
这不就是针对数据库的匈牙利命名法吗? - ARKBAN
19
这不就像在变量前加上 var 的前缀吗? - Brian R. Bondy
26
类似地,我讨厌数据库中的ID列以表名为前缀,比如在产品表中有一个productid列。这种冗余有时会使得没有ORM的脚本编写更加困难,比必要性还要严重。 - Andrew Ingram
30
我更喜欢将ID列的前缀设为表名,这样编写查询会更容易一些。对于外键,您可以将外键字段与关键字字段相同。 - Craig
38
类似的,当表名必须单数形式时,我很讨厌这种情况。我的直觉是将保存客户信息的表命名为“Customers”,而不是“Customer”。这似乎是微小的问题,但一旦你意识到只需将表命名为“Transactions”而不是“[Transaction]”,你可以避免很多麻烦。 - Atario
显示剩余12条评论

247

几乎任何一种匈牙利命名法。

匈牙利命名法的问题在于它经常被误解。最初的想法是为变量添加前缀以使其含义清晰。例如:

int appCount = 0; // Number of apples.
int pearCount = 0; // Number of pears.

但大多数人使用它来确定类型。

int iAppleCount = 0; // Number of apples.
int iPearCount = 0;  // Number of pears.

这很令人困惑,因为尽管这两个数字都是整数,但众所周知,你不能将苹果和梨进行比较。


72
看看Joel on Software的这篇文章,了解如何 正确 使用匈牙利命名法可以帮助减少错误:http://www.joelonsoftware.com/articles/Wrong.html - flicken
9
当然,如果使用C++而不是C语言编写代码,你可以让编译器在将苹果与梨进行比较时报错。 - Andreas Magnusson
5
是的,Joel说得对。我希望编译器可以被制作成强制执行Joel所说的版本。 - Loren Pechtel
9
这句话翻译为:这不应该是“int cntApples = 0; int cntPeas = 0;”吗?也就是说,前缀是变量“kind”。 - Blorgbeard
43
至少第一个是正确的...所有带有“苹果”字样的东西都需要在前面加上“i”。;) - Johannes Charra
显示剩余11条评论

239

我目前工作的地方不允许使用三元操作符:

int value = (a < b) ? a : b;

...因为并不是每个人都“懂得”。如果你告诉我:“不要使用它,因为当结构变得太复杂(嵌套三元运算符,有人吗?)时,我们必须重写它们”,那么我就明白了。但是当你告诉我一些开发人员不理解它们......嗯......好吧。


237
你的老板说“大家”,其实是指他自己。 - Brian R. Bondy
13
我曾经属于这个阵营,但是我已经超越了它,并学会了在恰当的情况下喜欢条件运算符。 - John Rudy
22
如果说有什么规则的话,那就应该是“总是使用三元运算符”,它是一种纯美的运算符 :) - Bobby Jack
16
我很喜欢它,但我最常听到的不使用它的原因和你的经历一样:“人们不会理解它”。我的观点是,如果他们不能理解这个概念,那么他们不应该在工作。 - Aidos
8
如果不想编写全新的函数(这对于代码的可读性没有什么帮助),还有什么其他方式可以有条件地初始化常量变量呢?在本地“变量”中使用const比禁用三元运算符更有助于理解和跟踪代码。 - Andreas Magnusson
显示剩余12条评论

239

在进行更改时,不要删除任何代码。我们被告知要对所有更改进行注释,注意我们使用源代码控制。由于开发人员对此的抗议以及其会使代码难以阅读,这一政策没有持续多久。


3
我非常讨厌...这里有几个人这样做(虽然这不是标准或者任何规定)。 - chills42
7
像这样的规则是我为什么觉得有必要将从他人那里继承的源代码以彩色打印出来的原因。每一页一角钱,这对我的公司来说不太好——但这是我如果必须打印它才能阅读的唯一方法。(我们继承了很多遵循这个规则的代码……) - John Rudy
3
听起来像是在源代码管理出现之前制定的规则,或者是因为程序员每周只提交一次代码所导致的。 - Craig
6
我喜欢阅读这些回答,因为它让我的工作看起来好了100倍。 - rjh
2
我理解你的感受...我们使用SVN已经4年多了,但是资深开发人员讨厌它,每两个月才检查一次代码,然后花费接下来的三天抱怨代码出了问题 :/ - Viktor Svub
显示剩余5条评论

204

我曾经在一位强大的VB之王的暴政下工作。

这位VB之王是MS Excel、VBA以及数据库的纯粹大师(因此他的姓氏:开发人员使用编译器工作,而他则与Excel玩耍。如果在数据库问题上挑战他会对你的职业产生不利影响...)。

当然,他的巨大技能给了他一个独特的发展问题和项目管理解决方案的视角:虽然不是严格意义上的编码标准,但VB之王经常有关于“编码标准”和“最佳实践”的新想法,并试图(并且往往成功地)强加给我们。例如:

  • 所有C/C++数组应该从索引1开始,而不是0。事实上,使用0作为数组的第一个索引已经过时,已被Visual Basic 6的深思熟虑的数组索引管理所取代。

  • 所有函数都应该返回错误代码:VB6中没有异常,那么我们为什么需要它们呢?(例如,在C++中)

  • 由于“所有函数都应该返回错误代码”对于返回有意义类型的函数来说不太实用,因此所有函数都应该有一个错误代码作为第一个[in/out]参数。

  • 我们所有的代码都会检查错误代码(这导致了我职业生涯中看到的最糟糕的VBScript if-indentation。当然,由于“else”子句从未被处理,因此直到太晚之前没有发现任何错误)。

  • 既然我们是在使用C++/COM,从今天开始,我们将用Visual Basic编写所有DOM实用程序函数。

  • ASP 115错误是邪恶的。出于这个原因,在我们的VBScript/ASP代码中使用On Error Resume Next来避免它们。

  • XSL-T是一种面向对象的语言。使用继承来解决你的问题(这让我惊讶得差点张开嘴巴)。

  • 不使用异常,因此应该将其删除。出于这个原因,我们将取消复选框中有关异常解缠调用的选项(一个专家花了数天时间才找到所有内存泄漏的原因,当他发现他们故意忽略(并隐藏)他在几周前发送的有关重新选中该选项的技术说明时,他几乎要疯掉了。

  • 在我们的COM模块的COM接口中捕获所有异常,并静默处理它们(这样,模块不会崩溃,只会变得更快……闪亮!...由于我们使用了上述超级错误处理方法,甚至需要一些时间才能真正理解正在发生什么……你不能既追求速度又保证正确结果,不是吗?)。

  • 从今天开始,我们的代码库将分为四个分支。我们将手动管理它们的同步,并整合所有的错误修正/改进。

  • 除了C/C++数组VB DOM实用函数XSL-T作为面向对象语言之外,其他功能都是在我们的反对声中实现的。当然,随着时间的推移,一些功能被发现咳咳已经损坏,并被完全放弃。

    当然,VB之王的信誉从未因此受到损害:在高层管理中,他仍然是一个“顶尖枪手”技术专家……

    这产生了一些有趣的副作用,你可以通过跟随链接看到(What is the best comment in source code you have ever encountered?)。


    28
    回复:关于从1开始计数的问题。有时你必须要挺身而出,说出强有力的话语,比如“这种做法很愚蠢、是错误的”。在沙滩上画一条线,不要再去讨好自尊心了,直接说出来。我几乎可以保证,每个有价值的程序员都会立即点头附和。 - Kirk Strauser
    31
    如果您不评论我的文字拼写,请忽略以下内容……如果您要评论我的文本,请考虑(1)提出更正意见,(2)自行更正拼写,或者(3)考虑世界上并非每个开发人员都是英语母语者,因此我认为容忍错误的拼写是您能做到的最少,或者通过将正确的翻译发送给我来证明您可以做得更好……^_^… - paercebal
    4
    如果这个人是我的老板,我会列出一份写得好且有据可查的投诉清单,直接向上级管理层的每个成员反映并让他下岗。如果你没有勇气为自己辩护,那就扣一分。 - muusbolla
    34
    谁告诉你我们没有抱怨?情况升级,直到两名代表(包括我)直接去见CEO解释问题。但很遗憾,我必须告诉你,在理想主义的世界,正义统治,而在现实世界中,一些老板相信“即使管理有错也永远不会错”,并且会打压任何敢于反驳这种信条的人。我从那段时间唯一快乐的回忆是我辞职的那天,已经三年了,自那天以来我成为了一个更加快乐的人。无论如何,如果是真的,你负评的理由很不充分。抱歉。 - paercebal
    7
    @paercebal: 一般来说,写得很好,但有一些小错误:「squatch」应该是「squash」;在这种情况下,「this one day」应该改为「that day」;「stocked procedures」应该为「stock procedures」;「chocked」应该拼写为「choked」。此外,在注释中,您使用了「°mentionned」,应该改为「mentioned」。但是,真的,所有这些都不能成为投诉的理由。相反,您表现出了对英语的出色掌握;恭喜! - intuited
    显示剩余5条评论

    131

    回到80年代/90年代,我曾在一家使用FORTRAN的飞行模拟器公司工作。我们的FORTRAN编译器变量名称的长度限制为8个字符。公司的编码标准为匈牙利式符号信息保留了前三个字符。因此,我们必须尝试使用仅有的5个字符创建有意义的变量名称!


    17
    奢华:我们只有6个字符;包装的名称以g开头;内部功能都以gk开头;工作站驱动程序带有0p等代码(因此gk0p是起点),留下两个字符用于Fortran名称的其余部分。 gk0paa,gk0pab,... - Jonathan Leffler
    104
    我年轻时,我们只有两个字符!而且不区分大小写! - pookleblinky
    54
    以前我们得在凌晨两点起床,比睡觉还早三个小时,然后自己编写编译器,为了能去上班要向公司支付特权费。我们只被允许使用字母A作为变量名。然后我们的老板会删除我们的代码并跳舞唱哈利路亚。 - David Arno
    12
    “50个可能的识别符应该足够了解一个人。” - Chris Vest
    5
    当年我们使用的BASIC解释器只有两个字符的变量名称,现在为什么要抱怨五个字符呢?请帮我翻译这句话。 - David Thornley
    显示剩余9条评论

    107

    我曾在一家公司工作,该公司进行了两个公司的合并。其中一个公司拥有一个用K&R C(即ANSI之前的版本)编写的重要服务器。他们强制要求Java团队(来自两个办公室,大概总共有20个开发人员)使用这种格式,这种格式欣然忽略了“花括号争论”的两个支柱,直接走向了疯狂:

    if ( x == y ) 
        {
        System.out.println("this is painful");
        x = 0;
        y++;
        }
    

    18
    我认为保持C语言和Java语言之间更大的视觉区别会使转换更加容易。(+1赞同“并且直接疯狂”)。 - Jeffrey L Whitledge
    4
    看起来像是 Petzold 的原版《Programming Windows》中使用的 Whitesmiths 风格——你懂的! ;) - Bobby Jack
    7
    我认为这是最聪明的大括号样式。不幸的是,大多数人都不使用它。如果大括号具有语义含义,就应该像对待其它代码一样处理,而不是把它们塞在行末并忽略。 - Ryan Lundy
    7
    @Kyralessa.我不同意...我不知道括号是否具有语义意义,但它们肯定会影响模式匹配和空间感。在我看来,这个版本完全失去了这一点。例如,我希望我的书签伸出书外,而不是与页面齐平。 - Michael Easter
    6
    这实际上是我偏爱的样式,但世界上的所有东西(特别是Visual Studio)都默认为其他模式,所以我放弃了。为什么我喜欢它?花括号包含代码的一部分--它们强制使其对if来说“看起来像”单个语句,这正是if所期望的。 - Atario
    显示剩余12条评论

    104

    禁止访问:

    while (true) {
    

    允许:

    for (;;) {
    

    4
    有人认为 for (;;) { 是 C 语言中表示第一种情况的习惯用法。 - Robert P
    69
    如果我正确理解现代的新颖表情符号,那么这个标准会让贫穷、过度劳累的声明哭泣! - Ben Blank
    15
    这里实际上有一个规则。VC6会对 while(true) 发出编译器警告,但不会对 for(;;) 发出警告。除此之外,它们是等价的。因此,我们选择没有警告的那一个。 - user9876
    23
    Bjarne S.在他的书中说:"for(;;)" 应该被理解为 "永远"。如果这对于C++的创造者来说足够好,那么对于你来说也应该足够好。 :-) - Frank Krueger
    58
    在我最开始接触的一个 C 语言程序中,有人添加了 #define ever (;;) 这行代码,这样你就可以写成 "for ever {...}"。 - James Curran
    显示剩余8条评论

    网页内容由stack overflow 提供, 点击上面的
    可以查看英文原文,
    原文链接