您曾经必须遵循的最糟糕的编码标准?[关闭]


77

您是否曾经努力过编码以下标准:

  • 大大降低了您的生产率?
  • 最初是出于充分的理由被包括在内,但在最初的关注变得无关紧要之后被保留了很长时间?
  • 列表中的时间很长,以至于不可能全部记住它们?
  • 您是否认为作者只是想留下自己的印记而不是鼓励良好的编码习惯?
  • 您不知道为什么将它们包括在内?

如果是这样,您最不喜欢的规则是什么?为什么?


这里的一些例子


4
我问过类似的问题(但不完全一样)在此之前的方式:stackoverflow.com/questions/218123/...
布莱恩R.邦迪

@Brian,谢谢,我已经看过您的问题,但忘记了。
finnw 2010年

4
编码标准的真正问题是浪费时间和精力来争论它们是否正确。没有什么能为制造
内在

Answers:


97

这可能会有些麻烦,但是在每种方法的顶部强制使用模板化块注释的标准总是使我不满意。

1)它们总是过时,因为它们与实际工作的代码相距太远,无法在您进行更新时注意到。不好的评论总比没有好。

2)他们通常只是重复已经包含在源代码控制工具中的信息,准确性较低。例如:上次修改者,修改日期/原因列表。


12
我发现(至少现在,在学校更早的时候,这似乎很奇怪),评论完全是一种不好的做法
Shady M. Najib 2010年

14
不仅如此,而且我发现,当您不得不在顶部放置大量样板时,与创建新类文件相关的开销实际上阻止了开发人员创建新类,并鼓励了笨拙的类,从而导致不良的设计。
Gaz 2010年

13
不同意!我们不会添加无用的矿石补偿信息,但是会对该功能的作用进行实际的文字解释(在.h文件中),它是如此有用!当然,我们致力于与代码保持同步。
巫师

5
@Shady M Najib总是坏的还是被允许不受控制/不受维护的时候坏?通常,好的代码将使其目的显而易见,从而避免了注释的需要-但这并非总是如此,我认为在这些情况下,注释至关重要。我想不到一个不好的理由来包含XMLDoc注释。
内森·泰勒

7
解释其作用的代码块很好。简单地重述参数的类型和名称并返回值是不好的。当我不得不使用标准命令来强制后者时,我编写了一个emacs脚本来自动生成其中的大部分。
AShelly

130

曾经有一位教授要求我们对每一行代码至少有一条评论。

//Set x to 3
var x = 3;

//if x is greater than 2
if(x>2){

    //Print x
    Print(x);
}

这太荒谬了。


10
这难道不是教授就知道您确切地知道发生了什么吗?
约翰·麦金太尔

80
我认为很清楚发生了什么,而且不是教育。
丹·雷

18
上面的示例很清楚,但是,如果学生从另一个应用程序或书中复制了某个函数调用,或者无论从哪个版本又什么都没真正理解,该怎么办?教授怎么知道?这个愚蠢的规则不允许任何灰色区域(在他的辩护中,以前可能已被滥用)。这就是我的解释方式。...请注意,如果我在非学术环境中看到此消息,可能会令我有些恐惧。;-)
John MacIntyre 2010年

4
是的,除了您始终可以编写仅重复代码而不显示任何理解的注释。他在结尾括号之前是否使您正确的“ //结尾括号”?
替代

6
如果您不小心在代码中得到了有用的注释该怎么办?您是否需要// comment在那之前上线?
configurator

103

我们公司(C#)的编码标准要求广泛使用#REGION(对于不知道的人,它标记了将在Visual Studio中折叠为一行的源代码块)。结果,您总是打开一个看似结构良好的类,却发现在#REGION结构的深层嵌套地毯下扫起一堆堆垃圾。您甚至会有围绕单行的区域,例如,必须将LOG区域折叠起来才能找到Logger的一个声明。当然,在做出某些区域之后添加的许多方法也被置于“错误”区域范围内。惊恐的事件。惊恐的事件。

区域是Visual Studio有史以来最糟糕的功能之一;它鼓励构造表面而不是实际的OO结构。

如今,我杀死了#REGION个。


11
我试图对此进行
十二次

22
如果您认为需要#REGION,我认为您需要重构。
杰伊·巴祖兹

23
我通常按​​区域将代码组织到构造函数,属性,事件,方法和成员中。它使源代码的管理和导航变得异常困难(尤其是在某些静态实用程序类中,该类可能会变得非常大)。我不会再使用它们了。
Evan Plaice 2010年

26
我们有一个简单的编码标准:永不嵌套区域。只需使用它们对相关方法(初始化,序列化,属性等)进行分组即可
Jason Williams 2010年

6
#regions的唯一好用途是隐藏不需要编辑的代码。那可能是生成的代码,或者是您不希望人们接触的具有难于解决的算法的代码,或者可能是丑陋的调试代码块。但不是人们会继续努力的代码。对于那些卡在#region商店中的人,我有一个宏,它可以折叠成定义​​,但可以扩展区域。看到这里:stackoverflow.com/questions/523220/awesome-visual-studio-macros/…–
Kyralessa

80

在一项工作中,我们被迫在数据库中使用某种奇怪的匈牙利符号形式。

我不记得详细信息,但是从内存来看,每个字段名称都必须包含:

  • 没有元音
  • 所有大写字母
  • 表格参考
  • 数据类型指示符
  • 数据长度
  • 可为空的指标

例如,具有一个人的名字的列可能被称为:(“ PRSNFRSTNMVC30X人”表,“名字”列,Varchar 30个字符,“非空”)


14
抱歉,但是当您重构数据库或确定VARCHAR的长度需要不同时会发生什么。突然,您必须遍历所有代码并进行更改...天哪。太恐怖了
汤姆·莫里斯

71
没有元音??!你在开玩笑吧?
丹尼尔·卡西迪

39
实施此标准的人的额头上是否有脊突,经常讨论荣誉和战斗?
瑞安·罗伯茨

10
哈哈,好吧,他们是DBA,所以...;)
Damovisa 2010年

14
您应该已经通过网址缩写发送了列名。PersonFirstNameVarchar30NotNull = bit.ly/cULlQc
Billy Coover 2010年

48

坚持在所有花括号后面加上括号的注释:

例如:

for (int i = 0; i < 10; i++)
{
    if (foo > bar)
    {
        printf("Foo greater than bar");
    } // End If (foo > bar)

    while (baz)
    {
       farb();
    } // End while (baz)
} // End For

21
更贴切:如果您需要注释以说明该块的开始位置,则该块太长,或者其内容太复杂=>重构。
理查德(Richard)2010年

5
我想投下反对票,因为长而深的嵌套块可能难以整理,这些注释可能会有所帮助。我想投赞成票,因为这些评论很快就会变得错误(并且非常令人困惑),并且因为深度嵌套的长块是您需要重构的标志,而不是添加更多评论。
杰伊·巴祖兹

7
对于没有强大IDE的世界来说,这是一个好主意。
IAdapter 2010年

9
在任何不错的IDE中,@ Jay都可以突出显示一个大括号,然后突出显示另一个对应的大括号。当人们这样做时,我个人讨厌。
Evan Plaice

3
尽管您的示例有点疯狂(因为它们不够长,没有关系,并且在更改逻辑时会使您慢下来),但这并不总是一件坏事。这样的注释对于关闭跨越整个文件的名称空间/ endif声明非常有用。
jsternberg,2010年

38
#define AND  &&
#define OR   ||
#define EQ   ==

纳夫说。


9
#include <iso646.h>会是更好的选择吗?
AndrejaKo

3
@AndrejaKo:这早于<iso646.h>;这是为了使C看起来像FORTRAN。
Niall C. 2010年

2
这真的是编码标准吗?即是否有公司政策禁止直接写给运营商?
finnw 2010年

21
它也有#define BEGIN {#DEFINE END }吗?
JBRWilkinson

3
这让我想起了我每天看到的一篇WTF文章,其中有一些C ++程序员有大量的定义,使其看起来像Visual Basic(或者可能只是Basic,某些方言)。#define void Sub,#define}结束,诸如此类。
韦恩·莫利纳

37
  • 局部变量名称均为小写字母,没有下划线

真实案例:paymentmethodtotalshtmlcontracttypechangecontextscustomsegmentspectextspotentialmsceventref

纽约时报的重量在

“单词空间不应被视为理所当然。如果您听起来很清楚,古希腊语(第一个带有元音的字母)可以在没有单词空格的情况下进行解密,并且在没有单词空格的情况下也可以解密。[…]拉丁语也到第二世纪就不再用单词分开了。这种损失令人费解,因为必须更加努力地阅读未分开的文本。但正如古生物学家保罗·萨恩格(Paul Saenger)所解释的那样,古代世界并不希望“使阅读更轻松,更快捷”。

3
+1。轻微的烦恼加起来。同样,他们也很难反对,因为编码标准编辑器或PM可以说:“这没有太大的负担,因此不值得进行更改。”
finnw

1
究竟。(尽管在这种情况下,读取了无数这样的变量名,但实际上可能会增加大量的负担。)
John Siracusa 2010年

57
通过发明名称来娱乐自己,而不是通过两种方法来解析。pagehits,penisup等
Jay Bazuzi 2010年

4
@Jay * sexchange
配置程序

2
@configurator:当Visual Studio调试器团队正在研究一项功能,以使您在监视窗口中看到当前正在运行的异常时,他们将添加一个名为“ $ ex”的伪变量。我们很久没有注意到了。然后,我们将其重命名为“ $ exception”,但我仍将其读为具有“ s”。
杰伊·巴祖兹

36

有人问我一个公司的软件做领袖的“ 简单,再ñ dundant代码 ”。例如,禁止在现有函数中添加新参数。取而代之的是,您必须复制该函数,而原始函数则保持不变,以避免出现回归。当然没有正式的测试(浪费时间)。

我们也被禁止使用合并软件。每个文件一次只能由一个程序员修改。修订控制软件当然是科幻小说。

我一生中最快乐的一天是他被解雇时(考虑到在意大利解雇某人非常非常困难)。


他可能从未听说过“重构”一词
nanda 2010年

3
他再也听不到其他话了……
Wizard79 2010年

好吧,您不需要正式测试,因为您从未更改过方法……
配置器2010年

36

与数据库的所有交互都必须通过存储过程来完成。如果我们现在生活在1997年而不是2010年,这可能是有道理的。

我刚刚意识到,这实际上涵盖了原始问题的所有条件:

  • 大大降低了您的生产率?校验。请-只需使用一个ORM
  • 最初是出于充分的理由被包括在内,但在最初的关注变得无关紧要之后被保留了很长时间?校验。经理是1000年前的数据库服务器开发人员,并采用了此编码标准。
  • 列表中的时间很长,以至于不可能全部记住它们?校验。其中包括“应将尽可能多的逻辑存储在数据库中”。
  • 您是否认为作者只是想留下自己的印记而不是鼓励良好的编码习惯?校验。一直回到经理那里,担任前数据库服务器开发人员。
  • 您不知道为什么将它们包括在内?校验。

2
我的工作单位在这个营地里有一些人。当他们尝试演奏性能卡并演示他们的知识是多么过时时,这很有趣
Jones Jones

3
等等,说真的,我认为SP的性能要比从C#进行的直接SQL调用更好,从性能角度来看?
Sk93年

3
听起来您完全知道为什么将它们包括在内。:P
梅森惠勒2010年

4
当我长大后,我终于明白为什么所有事情都要经过数据库了:)认真地说,这简化了很多事情,不要尝试重新发明轮子。
JE队列

3
我听过一个很好的推理:“我们不能使用OR / M,因为所有交互都必须使用SP”。如此浪费人力。
configurator

33

禁止使用STL或其他标准C ++库,因为CTO认为“我们”可以做得更好,更快。甚至列表和字符串类之类的基本构造。


5
我唯一一次听说有人不使用STL是因为游戏速度不够快,而且是正确的。EA在自己的游戏中实施了STL。我高度怀疑它是否不再重要(现代游戏受GPU限制),并且我怀疑他们会使用它。但即使如此,它还是STL 的实现,而不是一个全新的库。使用EASTL时,您仍在使用STL。
马特·奥莱尼克

1
@Matt:此外,EA的投诉集中在内存使用和初始化上。他们自己的实现消耗更少的内存,更快地释放了内存,避免了初始化将在以后初始化的对象。
Matthieu M.

我会告诉他自己编写代码。
2011年

31

匈牙利文符号

样本摘自MSDN上的“ Charles Simonyi对匈牙利符号标识符命名约定的解释 ”。

1#包括“ sy.h”
2 extern int * rgwDic;
3 extern int bsyMac;
4个结构SY * PsySz(char sz [])
6 {
7个字符* pch;
8 int cch;
9结构SY * psy,* PsyCreate();
10 int * pbsy;
11 int cwSz;
12 unsigned wHash = 0;
13 pch = sz;
14时(* pch!= 0
15 wHash =(wHash11 + * pch ++;
16 cch = pch-sz;
17 pbsy =&rgbsyHash [(wHash&077777)%cwHash];
18 for(; * pbsy!= 0; pbsy =&psy-> bsyNext)
19 {
20个字符* szSy;
21 szSy =(psy =(struct SY *)&rgwDic [* pbsy])-> sz;
22 pch = sz;
23时(* pch == * szSy ++)
24 {
25如果(* pch ++ == 0)
26回报(psy);
27}
28}
29 cwSz = 0;
30如果(cch> = 2)
31 cwSz =(cch-2 / sizeof(int)+1;
第32章(32)
33零((int *)psy,cwSY);
34 bltbyte(sz,psy-> sz,cch + 1);
35 return(psy);
36}

5
喔喔喔喔喔喔喔喔!
琼斯医生

22
此示例的最大问题是无意义的变量名。删除匈牙利前缀,其中一些前缀长度为1或什至0个字符。
finnw 2010年

8
这是系统匈牙利语,在弱类型语言中很有用(因为它以名称的形式编码对于使用这些语言至关重要的类型信息)-在强类型语言中没有用。强类型语言的更好替代方法是Apps Hungarian,它会编码有关变量(成员,指针,volatile,索引器)用法的重要信息-语言本身不提供支持。
杰森·威廉姆斯

5
哦拜托。我从来没有将本地人与会员混淆,也没有将这种愚蠢的匈牙利语用于会员/当地人/领域/任何地方。我认为它们对于区分不同类型的字符串(如“安全”和“不安全”)可能很有用,例如Joel在“ 使代码看起来不正确”中
配置程序,2010年

3
@configurator:Joel的例子很可怕,最好使用其他类型,然后由编译器强制使用。
Matthieu M.

28

我曾经从事过一个项目,该项目的负责人要求每个变量(每个变量)都以“ v”作为前缀。因此,vCount,vFirstName,vIsWarranty等。

为什么?“因为我们正在VBScript中工作,所以无论如何一切都是Variant”。

WTF。


93
我曾经使用一种语言,要求每个变量(每个变量)都以“ $”作为前缀。
nohat 2010年

6
@nohat:您意识到这太神奇了,不是吗?
乔什(Josh K)2010年

我曾经使用一种语言,其中所有变量都以标点符号开头,例如“ $”或“%”或“ @”。我仍然不时这样做。
David Thornley 2010年

3
仅当您需要先放置f函数,然后您的代码才是真正的时,这才真正成为问题fUcked (vUp)
乔D

1
听起来像Perl的各种版本...

26

差点忘了这个:

经理的话:

不要修复或记录您在自己的代码中发现的任何问题的错误。客户将在未来几年内向我们付款以识别并修复它们。

这不是针对消费类软件的,而是针对单个大型组织的定制的。毋庸置疑,此后客户确实支付了数年的费用。看起来微不足道,但是尝试忽略错误比发现它们更难。


2
这是一个可怕的政策。我希望这个经理是罐头的。
伯纳德

@ Bernard-在大多数组织中,创造长期收入来源是快速晋升的基础。希望其他人看到了这个疯狂,并意外地将他/她撞到了停车场。
Jim Rush

24

对所有非私有方法,常量,枚举和属性强制执行XML注释。

它导致了一些非常混乱的代码,特别是由于最终结果是人们要么点击///为所有内容创建一个空的注释存根,要么安装GhostDoc并让其添加自动生成的注释:

/// <summary>
/// Validations the handler.
/// </summary>
/// <param name="propertyName">The property name.</param>
public void ValidationHandler(string propertyName) 
{
   // whatever
}

[编辑]之所以将其作为一个荒谬的标准,并不是因为我认为方法注释很愚蠢,而是因为这些注释的质量没有得到任何增强,并导致在代码文件中造成了很多混乱。比盲目的“必须发表评论”构建要求,还有更好的创建有意义的代码文档的方法。


13
' Validations the handler'-嗯
埃里克(Eric)

8
+1讨厌,我讨厌这个。我认为,如果您使用软件来生成评论,那么您就不需要它们了。
bleevo's

9
我认为这不是一个坏规则。当我第一次需要维护的方法时,如果我对所有参数都有详细说明,它将大有帮助。通常会有一些细微之处(例如,如果参数为null,则为空,如果为空集合,不存在的文件为名称等,会发生什么。)另一个好的(IMHO)规则是方法名称应为动词,但在您的示例中为名词。
finnw 2010年

3
@finnw我认为这是一个好习惯,但标准不高。如果开发人员参与其中,并在有保证的时候(有意义的细节等)写出有意义的方法注释,那就太好了。如果没有,您最终会陷入困境。在前一种情况下,您根本不需要编译级执行。
亚当李尔

7
经典的无证件案例。除了显而易见的明显内容外,什么都不能说的评论应该立即被杀死。
Cumbayah 2010年

23

并不是真正的编码标准,但是我们在源代码管理中有一个名为“ changelog.txt”的文件

每次签入时,都必须手动向该文件添加一个条目。此项是Subversion修订版号和您的签到注释。

当新的首席技术官开始工作时,有人告诉他,他立即做出了一项行政决定,并说:“我们不再这样做了”,并删除了文件。这已经持续了多年。


6
没有人知道svn log吗?
Htbaa 2011年

1
那些开始执行该政策的人早已不复存在,而后来的人们则继续执行它。我和新任CTO(我的朋友)在同一周内开始工作,我们俩都看着这个并说了WTF?
Jim A

20

在我工作过的某些地方,坚持要注释掉未使用或已弃用的代码,而不是删除它。而不是信任VCS的历史记录等,而是通过注释掉的代码将其痛苦地保存在文件中。

我发现的最大问题是,您通常不知道为什么将代码注释掉。是因为某些开发人员正在积极进行更改并希望保留它以供参考还是不再需要它?


3
我最近一直在删除许多旧的注释掉的代码。
CoderDennis 2010年

2
我通常会删除注释掉的代码,除非它伴随着一个很好的解释,说明为什么将其注释掉以及为什么应将其保留在适当的位置。
Jeremy Wiebe

我完全同意。只要可以使用它,就可以注释掉代码,但是发行版/主分支中的所有内容都应不含注释的代码。有人告诉我,他们“喜欢知道如何以不同的方式来完成”。我只是因为提到的原因而感到恼火:这已经过时了吗,一种解决方法,另一种实现方式?WTF
Anne Schuessler

借助VS2013“ Peeks”,这一切就成为了窗外。但是我们在注释中写了“ Changed Equation-Initials”之类的字眼,因此有人想知道如果需要,旧代码在TFS / VCS中会是什么样。因此它是一行,而不是10条注释掉的行。但是VS2013很棒,它在那里为您显示了TFS历史记录。
Suamere 2013年

17

我曾经参加过的最糟糕的编码标准是根本没有的代码库。我宁愿遵循我完全不同意的编码标准,也不愿在根本没有的代码库中工作。这使得学习代码库的新部分变得更加困难。


16

强制内联注释进行版本控制是我忽略的最毫无意义的编码标准。

//Changed on 2/2/2004 By Ryan Roberts for work item #2323332
Dim Some Horrendous VB
//End Changed

Oracle DBA坚持正确使用空白,同时“维护”一个具有高度竞争性的表的数据库,该表具有200多个字段和40个触发器。


这是相当令人发指
埃文鲽

5
嗯 点心...
配置器

当然,在我们进行源代码控制之前,我是这样做的。一旦有了源代码控制,便是这样的习惯,我们实际上需要团队进行干预才能停止这样做。最终,当找到它们时,我们停止并删除了所有现有的。
斯科特·惠特洛克

我们的高级开发人员仍试图迫使我们这样做。每当我认为自己可以摆脱该政策时(有时甚至当我知道自己做不到)时,我都会忽略该政策。
约书亚·史密斯

我们团队中有一个人仍然在各处执行此操作(他还在SQL脚本中包含大量的“更改日志”内容,这些内容也受版本控制)。正如我所解释的那样,在进行了一些更改/提交后,您不记得更改日期了,因此更改日志可以很好地立即注意到打开文件时谁更改了内容以及更改原因。
韦恩·莫利纳

14

我在一个由C ++初学者领导的项目上进行了代码审查,他决定所有类成员函数都应以类名和可见性作为前缀:

class MyClass
{
   public:
      void MyClass_Public_setValue(int value);
}

1
你问他们为什么吗?我只是想知道他们的动机。
JBRWilkinson

1
哇,那家伙为什么还要使用
Mateen Ulhaq,2010年

9

需要将所有代码缩进四个空格;)


2
这怎么不好?
杰伊·巴祖兹

1
因为这样每一行的开头都有4个不需要的空格?
nohat 2010年

哦,我明白了。
替代

21
是的,StackOverflow的编码标准确实很差。:-)
P

大缩进迫使您将代码嵌套级别保持在较低水平。我已经看到8的缩进,并且效果很好。
Toon Krijthe

9

几年前我有一份工作,我们所有的代码都必须左对齐-不能缩进。提出该政策的人不喜欢在查看长行代码时必须水平地来回滚动,这相当于用眼睛打乒乓球。


那是必须遵循的可怕的,可怕的编码标准。还有一个愚蠢的原因!
gablin 2010年

4
如果您需要水平滚动(例如,超过半页),则可能还存在问题。缩进也不是一件好事,因为缩进会使代码完全不可读。我尝试坚持78 col的上限,但是如果需要超过该上限,我不介意,但我确实尝试避免这种情况。
Htbaa 2011年

8

这更多地说明了缺乏编码标准会如何造成伤害。

在一家大型银行工作的承包商坚持认为,遵循这些标准是有史以来最好的。该应用程序是用dBase / Clipper编写的,他是dBase / Clipper的唯一开发者,他当然提出了该标准。

  • 一切都大写。我的意思是一切,包括他发表的罕见评论。
  • 没有缩进。
  • 变量命名类似于APRGNAME。A =变量的范围,例如P表示公共,PRG =创建该变量的源文件的前三个字符,NAME = dBase / Clipper允许的其余6个字符中的变量名。
  • 源代码的前4行和后4行长80 *。为什么?因此,他可以听到点阵打印机开始和完成文件的打印。记忆是整个程序每周通过大型机打印20,000页。
  • 我敢肯定,我已经设法从大脑中倾泻了更多东西。

在那个阶段,我是一个非常新的自学成才的程序员,但在我要求接手该项目之前,我知道的足够多,以至于听不见这位疯狂的科学家并从那里滚蛋。

是的,我们告诉管理层这些做法有多糟糕,但总是得到“通常要付给承包商他要知道他在说什么的最高价”。


7
请不要嘲笑较旧的恐龙。 他们使我们成为可能。
P

4
听起来像工作保障。
MIA 2010年

7
有一个音频标记,以便您知道每个文件何时打印都很巧妙。我现在要添加\07到每个文件的开头。
configurator

2
由于不存在dBase的变量“作用域”规则,因此使用这样的命名方案(不是大写形式)在某种意义上是合理的。一切都是有效的全球性。一个i用于索引在一个过程中的阵列可以用一个干扰i调用过程英寸 您需要使用PRIVATE ALL LIKE m*PRIVATE i防止这种“阴影”
Gerry

8

我过去的一击。

公司老板的话:

不会有使用解释性语言编写的代码,因为我在用Java编写的{expletive}项目上损失了2500万。

Java项目是一个旨在处理几十个股票的股票交易系统,现在已经用于处理数千个股票。整个公司没有解决设计缺陷或不良硬件,而是被迫将所有非C / C ++应用程序转换为C / C ++,并且所有新开发都必须使用C / C ++。解释性语言意味着任何未编译的内容,所有者仅考虑汇编程序,C和C ++进行编译。

对于一家800人的公司来说,其中大多数代码是用Java和Perl编写的,这意味着整个公司将在接下来的几年中花费大部分时间来用C / C ++编写完美的代码。

够搞怪,这场惨败大约二十年前,我在另一家公司,其中技术主管决定,我们的排序逻辑(这是一个冒泡排序)需要汇编重新编码,而不是由快速排序被替换,因为- 算法做不能提高性能。提高性能的唯一方法是在汇编器中重写相同的逻辑。

在这两种情况下,我下达命令后不久就离开了。


两家公司今天仍在运营吗?
finnw

一个“移出” Java的是,另一个早已消失。从TRS-80迁移到PC的过程中,他们永远都无法幸免。
David B 2010年

6

像很多程序员一样(但还不够),我讨厌代码修饰。当我必须为变量名使用美元符号($)前缀或为私有变量使用下划线(即使没有getter / setter时)时,这让我感到非常恼火。如果您需要装饰代码以理解它,那么您就该死了!


好吧,正如“威尔”所说:“我在下划线前面加了一行,以便将我的私有变量归为我的智能感知。但是,我只对作用域为类型的变量进行此操作。在方法或更狭窄范围内声明的变量我保留了下划线关闭。可以轻松地将它们分开,并将较少使用的变量放在一起。” 我必须同意他的看法。
2010年

1
我认为在您喜欢的专有IDE中将变量分组在一起并不是破坏所有代码的充分理由。
亚当·哈特

如果是您的代码,则使其在IDE中可用似乎是完全合理的。同样,在许多语言中,下划线是很常见的,因此只要人们看到下划线,他们就知道它的含义。
rjmunro 2010年

1
+1使用一个好的IDE(可以使用regex搜索的 IDE )对我来说更有意义。刮擦IDE,学习使用文本编辑器和终端,您将成为更好的程序员。附带一提,我并不特别喜欢perl信号,但至少它们有用,与PHP的不同。
替代

6
感叹……那些“ IDE代表猫”的人中的另一个。
Nailer 2010年

6

我使用Web系统已经有一段时间了,其中传递的所有参数都必须命名为P1,P2,P3等。在没有大量文档的情况下,没有机会知道它们的用途。

同样-尽管不是严格的编码标准-在同一系统中,每个文件都被命名为xyz0001.ext,xyz0002.ext,xyz0003.ext等-其中xyz是应用程序本身的代码。


6

确切地说,这是很久以前的-1976年。我的老板从未听说过Edsger Dijkstra或阅读过CACM的问题,但是他从某个地方听到谣言说“ GOTO不好”,所以我们不允许在我们的COBOL程序中使用GOTO。这是在COBOL添加“ end if”之前的,因此当时它只有三个经典控制结构的二分之一(顺序,如果执行/ if / then / else,则执行(即执行while))。他勉强允许我们的基本程序使用GOTO,并允许我们的汇编语言程序使用分支指令。

抱歉,这是一个“您必须在那儿”的故事。据我所知,自1976年以来发明的每种语言都有足够的控制结构,因此您永远不需要使用GOTO。但是关键是,老板不知道为什么GOTO被认为是有害的,或者哪种语言是婴儿疾病,哪种语言是致命疾病。


6

我在一个项目中工作的时候,首席架构师要求编写(也是)显式代码。以下是我在代码中发现的最糟糕的示例之一(他很高兴地批准了该示例)。

private string DoSomething( bool verbose )
{
    if ( verbose ) { return someString; }
    else if ( !verbose ) { return otherString; }
    else { return string.Empty; }
}

甚至ReSharper都告诉您这是错误的!


9
您将很难从声明为void的函数中返回某些内容。
Mircea Chirea

7
@MAttB考虑在什么条件下使用final(else)分支。
理查德(Richard)2010年

6
否则{返回string.Empty; }将在五年后由维护开发人员编辑以上两行后执行。但是,返回string.Empty将隐藏过去不可能的事实。相反,它应该引发InvalidOperationException(“该代码原本不打算支持三值逻辑”);
MatthewMartin 2010年

1
太恐怖了 这有什么错return verbose ? someString : someOtherString;
卡勒姆·罗杰斯

1
@callum三元运算符可能被禁止:)在此之前...
hplbsh 2011年

6

在我的上一份工作中,“标准”对于雇用我的那个人给的我来说是一个非常强烈的名词。使用ColdFusion和SQL对网站进行编程,我得到了如下的编码要求:

  • 不要使用包含。我喜欢一页大纸
  • 始终在变量名和列名中用下划线分隔单词(isactive,firstname等除外)
  • 切勿使用缩写-总是写出名字(他经常写fname等等)
  • 请勿使用令人困惑的名称(例如amount_charged和charge_amount,它们衡量的是不同但相关的事物)
  • 不要使用DIV,而要使用最少的CSS,而是使用嵌套表(我发现一次大约六层)。
  • 不要缓存任何查询。曾经
  • 要在多个页面上使用变量?适用范围。
  • 每个页面都是其自己的try / catch块。我们不需要/想要全局错误处理程序。

他辞职后,我立即开始更改这些内容。


“不要使用混淆的名称”对我来说似乎很公平……
8128

1
这绝对是一个公平的准则。我的意思是他根本不遵守。我猜他的“不混淆”和我的想法是不同的。
Ben Doom 2010年

4

在我作为C ++程序员的生活中,实施了两个非常讨厌的“规则”:

  1. “我们不能使用STL,因为VC ++ 4.1不支持它(并且目前我们不能切换到VC ++ 6.0)。”
  2. “你使用快速排序,因为它可以为O(n ^ 2)在恶劣的情况下,使用该执行堆排序算法I(项目负责人的姓名)写的学生。”

6
项目负责人的HeapSort有什么问题?
7wp 2010年

4
实际上,如果代码接受了外部用户输入,则QuickSort可能会出错,因为它会受到O(n^2)DOS攻击(馈入最坏情况的输入)。也是为什么无法切换的原因-它本身就是不使用STL的有效借口。
Maciej Piechotka 2010年

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.