您是否曾经努力过编码以下标准:
- 大大降低了您的生产率?
- 最初是出于充分的理由被包括在内,但在最初的关注变得无关紧要之后被保留了很长时间?
- 列表中的时间很长,以至于不可能全部记住它们?
- 您是否认为作者只是想留下自己的印记而不是鼓励良好的编码习惯?
- 您不知道为什么将它们包括在内?
如果是这样,您最不喜欢的规则是什么?为什么?
这里的一些例子
您是否曾经努力过编码以下标准:
如果是这样,您最不喜欢的规则是什么?为什么?
这里的一些例子
Answers:
这可能会有些麻烦,但是在每种方法的顶部强制使用模板化块注释的标准总是使我不满意。
1)它们总是过时,因为它们与实际工作的代码相距太远,无法在您进行更新时注意到。不好的评论总比没有好。
2)他们通常只是重复已经包含在源代码控制工具中的信息,准确性较低。例如:上次修改者,修改日期/原因列表。
曾经有一位教授要求我们对每一行代码至少有一条评论。
//Set x to 3
var x = 3;
//if x is greater than 2
if(x>2){
//Print x
Print(x);
}
这太荒谬了。
// comment
在那之前上线?
我们公司(C#)的编码标准要求广泛使用#REGION(对于不知道的人,它标记了将在Visual Studio中折叠为一行的源代码块)。结果,您总是打开一个看似结构良好的类,却发现在#REGION结构的深层嵌套地毯下扫起一堆堆垃圾。您甚至会有围绕单行的区域,例如,必须将LOG区域折叠起来才能找到Logger的一个声明。当然,在做出某些区域之后添加的许多方法也被置于“错误”区域范围内。惊恐的事件。惊恐的事件。
区域是Visual Studio有史以来最糟糕的功能之一;它鼓励构造表面而不是实际的OO结构。
如今,我杀死了#REGION个。
在一项工作中,我们被迫在数据库中使用某种奇怪的匈牙利符号形式。
我不记得详细信息,但是从内存来看,每个字段名称都必须包含:
例如,具有一个人的名字的列可能被称为:(“ PRSNFRSTNMVC30X
人”表,“名字”列,Varchar 30个字符,“非空”)
坚持在所有花括号后面加上括号的注释:
例如:
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
#define AND &&
#define OR ||
#define EQ ==
纳夫说。
#define BEGIN {
和#DEFINE END }
吗?
真实案例:paymentmethodtotalshtml
,contracttypechangecontexts
,customsegmentspectexts
,potentialmsceventref
纽约时报的重量在:
“单词空间不应被视为理所当然。如果您听起来很清楚,古希腊语(第一个带有元音的字母)可以在没有单词空格的情况下进行解密,并且在没有单词空格的情况下也可以解密。[…]拉丁语也到第二世纪就不再用单词分开了。这种损失令人费解,因为必须更加努力地阅读未分开的文本。但正如古生物学家保罗·萨恩格(Paul Saenger)所解释的那样,古代世界并不希望“使阅读更轻松,更快捷”。
有人问我一个公司的软件做领袖的“ 简单,再ñ dundant代码 ”。例如,禁止在现有函数中添加新参数。取而代之的是,您必须复制该函数,而原始函数则保持不变,以避免出现回归。当然没有正式的测试(浪费时间)。
我们也被禁止使用合并软件。每个文件一次只能由一个程序员修改。修订控制软件当然是科幻小说。
我一生中最快乐的一天是他被解雇时(考虑到在意大利解雇某人非常非常困难)。
与数据库的所有交互都必须通过存储过程来完成。如果我们现在生活在1997年而不是2010年,这可能是有道理的。
我刚刚意识到,这实际上涵盖了原始问题的所有条件:
禁止使用STL或其他标准C ++库,因为CTO认为“我们”可以做得更好,更快。甚至列表和字符串类之类的基本构造。
匈牙利文符号
样本摘自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}
我曾经从事过一个项目,该项目的负责人要求每个变量(每个变量)都以“ v”作为前缀。因此,vCount,vFirstName,vIsWarranty等。
为什么?“因为我们正在VBScript中工作,所以无论如何一切都是Variant”。
WTF。
f
函数,然后您的代码才是真正的时,这才真正成为问题fUcked (vUp)
。
对所有非私有方法,常量,枚举和属性强制执行XML注释。
它导致了一些非常混乱的代码,特别是由于最终结果是人们要么点击///为所有内容创建一个空的注释存根,要么安装GhostDoc并让其添加自动生成的注释:
/// <summary>
/// Validations the handler.
/// </summary>
/// <param name="propertyName">The property name.</param>
public void ValidationHandler(string propertyName)
{
// whatever
}
[编辑]之所以将其作为一个荒谬的标准,并不是因为我认为方法注释很愚蠢,而是因为这些注释的质量没有得到任何增强,并导致在代码文件中造成了很多混乱。比盲目的“必须发表评论”构建要求,还有更好的创建有意义的代码文档的方法。
Validations the handler
'-嗯
并不是真正的编码标准,但是我们在源代码管理中有一个名为“ changelog.txt”的文件
每次签入时,都必须手动向该文件添加一个条目。此项是Subversion修订版号和您的签到注释。
当新的首席技术官开始工作时,有人告诉他,他立即做出了一项行政决定,并说:“我们不再这样做了”,并删除了文件。这已经持续了多年。
svn log
吗?
在我工作过的某些地方,坚持要注释掉未使用或已弃用的代码,而不是删除它。而不是信任VCS的历史记录等,而是通过注释掉的代码将其痛苦地保存在文件中。
我发现的最大问题是,您通常不知道为什么将代码注释掉。是因为某些开发人员正在积极进行更改并希望保留它以供参考还是不再需要它?
强制内联注释进行版本控制是我忽略的最毫无意义的编码标准。
//Changed on 2/2/2004 By Ryan Roberts for work item #2323332
Dim Some Horrendous VB
//End Changed
Oracle DBA坚持正确使用空白,同时“维护”一个具有高度竞争性的表的数据库,该表具有200多个字段和40个触发器。
我在一个由C ++初学者领导的项目上进行了代码审查,他决定所有类成员函数都应以类名和可见性作为前缀:
class MyClass
{
public:
void MyClass_Public_setValue(int value);
}
需要将所有代码缩进四个空格;)
几年前我有一份工作,我们所有的代码都必须左对齐-不能缩进。提出该政策的人不喜欢在查看长行代码时必须水平地来回滚动,这相当于用眼睛打乒乓球。
这更多地说明了缺乏编码标准会如何造成伤害。
在一家大型银行工作的承包商坚持认为,遵循这些标准是有史以来最好的。该应用程序是用dBase / Clipper编写的,他是dBase / Clipper的唯一开发者,他当然提出了该标准。
在那个阶段,我是一个非常新的自学成才的程序员,但在我要求接手该项目之前,我知道的足够多,以至于听不见这位疯狂的科学家并从那里滚蛋。
是的,我们告诉管理层这些做法有多糟糕,但总是得到“通常要付给承包商他要知道他在说什么的最高价”。
\07
到每个文件的开头。
i
用于索引在一个过程中的阵列可以用一个干扰i
调用过程英寸 您需要使用PRIVATE ALL LIKE m*
并PRIVATE i
防止这种“阴影”
我过去的一击。
公司老板的话:
不会有使用解释性语言编写的代码,因为我在用Java编写的{expletive}项目上损失了2500万。
Java项目是一个旨在处理几十个股票的股票交易系统,现在已经用于处理数千个股票。整个公司没有解决设计缺陷或不良硬件,而是被迫将所有非C / C ++应用程序转换为C / C ++,并且所有新开发都必须使用C / C ++。解释性语言意味着任何未编译的内容,所有者仅考虑汇编程序,C和C ++进行编译。
对于一家800人的公司来说,其中大多数代码是用Java和Perl编写的,这意味着整个公司将在接下来的几年中花费大部分时间来用C / C ++编写完美的代码。
够搞怪,这场惨败大约二十年前,我在另一家公司,其中技术主管决定,我们的排序逻辑(这是一个冒泡排序)需要汇编重新编码,而不是由快速排序被替换,因为- 算法做不能提高性能。提高性能的唯一方法是在汇编器中重写相同的逻辑。
在这两种情况下,我下达命令后不久就离开了。
像很多程序员一样(但还不够),我讨厌代码修饰。当我必须为变量名使用美元符号($)前缀或为私有变量使用下划线(即使没有getter / setter时)时,这让我感到非常恼火。如果您需要装饰代码以理解它,那么您就该死了!
我使用Web系统已经有一段时间了,其中传递的所有参数都必须命名为P1,P2,P3等。在没有大量文档的情况下,没有机会知道它们的用途。
同样-尽管不是严格的编码标准-在同一系统中,每个文件都被命名为xyz0001.ext,xyz0002.ext,xyz0003.ext等-其中xyz是应用程序本身的代码。
确切地说,这是很久以前的-1976年。我的老板从未听说过Edsger Dijkstra或阅读过CACM的问题,但是他从某个地方听到谣言说“ GOTO不好”,所以我们不允许在我们的COBOL程序中使用GOTO。这是在COBOL添加“ end if”之前的,因此当时它只有三个经典控制结构的二分之一(顺序,如果执行/ if / then / else,则执行(即执行while))。他勉强允许我们的基本程序使用GOTO,并允许我们的汇编语言程序使用分支指令。
抱歉,这是一个“您必须在那儿”的故事。据我所知,自1976年以来发明的每种语言都有足够的控制结构,因此您永远不需要使用GOTO。但是关键是,老板不知道为什么GOTO被认为是有害的,或者哪种语言是婴儿疾病,哪种语言是致命疾病。
我在一个项目中工作的时候,首席架构师要求编写(也是)显式代码。以下是我在代码中发现的最糟糕的示例之一(他很高兴地批准了该示例)。
private string DoSomething( bool verbose )
{
if ( verbose ) { return someString; }
else if ( !verbose ) { return otherString; }
else { return string.Empty; }
}
甚至ReSharper都告诉您这是错误的!
else
)分支。
return verbose ? someString : someOtherString;
?
在我的上一份工作中,“标准”对于雇用我的那个人给的我来说是一个非常强烈的名词。使用ColdFusion和SQL对网站进行编程,我得到了如下的编码要求:
他辞职后,我立即开始更改这些内容。
在我作为C ++程序员的生活中,实施了两个非常讨厌的“规则”:
O(n^2)
DOS攻击(馈入最坏情况的输入)。也是为什么无法切换的原因-它本身就是不使用STL的有效借口。