当我问这个问题时,我几乎总是肯定是的,你应该有编码标准.
您曾被迫遵循的最奇怪的编码标准规则是什么?
而最奇怪的是,我的意思是最有趣,或者最糟糕,或者只是简单的奇怪.
在每个答案中,请提及哪种语言,您的团队规模,以及它对您和您的团队造成的影响.
1> Simon Johnso..: 当禁止使用多个退货时,我讨厌 它.
您的选择:多个返回或更多嵌套if语句.我会多次退货.
解决方法:if(!Initialize()){RetVal = ERR_BADINIT; 转到ReturnPoint; }(更多代码)ReturnPoint:return RetVal; } 问题解决了!;)
这个规则的假设点是什么?就个人而言,我对代码的审查失败,因为代码可以通过另外的回报更容易阅读.
另一方面,在开头删除一个选项,如"if(param == null)return null"可以清理你的代码,禁止这个而不是鼓励它有点犯罪.
直到最近,禁止多次返回.然后,事实证明这是C的剩余部分,由C++ RAII和大小小于15行的函数淘汰.从那时起,像Braveheart:"FREEDOM !!!!" ...... :-p ......
简单地说,多次返回会增加测试的复 此外,它增加了你做错事的可能性
根据我的经验,具有单个返回点的方法往往不易出错,因为该规则使人们更容易分析程序执行.
拥有一个返回点的主要原因是简化了执行路径的测试.返回快捷方式执行可能会被滥用.即使在回路内单次返回也会显着增加测试表面.在不知道原因的情况下简单地说"一个回归点"更容易.
应该鼓励使用一个退出点,但肯定不会强制执行.特别是如果你考虑早期的条件.
真正的规则是你应该总是回到你来自的地方(而不是GOTOing).只要他们返回,你有多少回报并不重要.这项禁令规则是显然认为他们在BASIC编程的人们的根本误解.
多次返回(初始错误检查除外)是编程不良的标志,并且使代码非常复杂.
我认为真正的问题是将婴儿扔出洗澡水的情况.救助的早期回报是一件好事,结束路径只是返回的条件有时是非常合理的.大多数情况都应该避免.
我以前见过这个.通常,参数是块应该只有"一个出口点".但是,除非使用gotos或exception,否则blocks*do*只有一个退出点.他们可能有多条路径可以达到这一点,但如果你不喜欢,你也需要禁止"if"和"for"语句.
这是否意味着它也被禁止抛出异常?抛出异常也可以看作是一个回归点......
我也不喜欢多次退货.我认为它通常表明你的方法可能做得太多了.但是,我不会梦想完全禁止它.WTF?如果你不那么信任"你的"开发者,就雇用新的开发者.
这样严格而快速的规则让我心碎.有时它是有道理的,有时却没有.如果它不使用它.虽然我有偏好但我不会做任何事情.如果我需要使用"goto",我会使用它...到目前为止,我还没需要它(谢谢杰布斯).
对于大多数功能,我认为一旦你决定进一步执行一个函数是不可能的,你就会得到适当的回报/信号错误.使函数的其余部分更少嵌套,更容易理解.这就像先决条件.
呸! 这是胡说八道我不会放!多个return语句可以很优雅.你怎么会做一个漂亮的开关...没有它们的块?多次休息呢?它们与返回语句并没有什么不同.
**对于那些试图弄清楚**的人来说:这是一个微观优化,旨在通过NRVO略微提高速度; 像所有的微优化一样,除非存在极端的瓶颈,否则不应该使用它.请参阅http://stackoverflow.com/questions/36707/should-a-function-have-only-one-return-statement/85911#85911的下半部分
2> 小智..: 反向缩进.例如:
for(int i = 0; i < 10; i++)
{
myFunc();
}
和:
if(something)
{
// do A
}
else
{
// do B
}
每当你扭转缩进时,上帝杀死了一个维护开发人员.
噢,我的上帝......我可以遇到那个提出那个人的反社会人士吗?他可以教我一些关于厌世的事情.
这不可能是真的.
节省宝贵的字节...无价,使用它很多
天哪,你在开玩笑吧?
这是Stack Overflow,而不是Onion!
不,第二个例子不是GNU.将它与GNU风格联系起来的是一种奇怪的信念,即在新线上打开括号之前的空格是一件好事.
第二个是C的Gnu风格.所以不,这不是一个笑话:http://www.gnu.org/prep/standards/standards.html#Formatting
我已经看到了与此类似的缩进代码.值得庆幸的是,这不是一个编码标准或类似的东西,只是开发人员认为是缩进的好方法.
我无法相信这是真的.
这太糟糕了.如果是真的,发明这种反转压痕的人应该由普林斯伯勒的House博士检查
当我看到这个时,我的第一直觉是编辑它以纠正缩进...直到我意识到缩进实际上是有意的......
@David Cournapeau:我没有找到你所提到的反向缩进的GNU编码标准中的任何地方 - 我看到的例子使用了正常的缩进.你意识到在这个例子中代替`// do A`的任何代码都会出现在第零个压痕级别(即它左边没有空格或制表符)?
我对C#预处理器指令的#if使用反向标识.
那么说如果你在最深层的某个地方添加一个新的if语句,你需要缩进它周围的整个代码吗?这是一个阿拉伯的事情,因为他们从左到右书写?大声笑
3> Galwegian..: 也许不是你会得到的最古怪的一个,但我真的很讨厌我必须在'tbl'前面添加数据库表名
在类似的说明中,当表名必须是单数时,我讨厌它.我的直觉是命名一个表,其中包含客户,"客户",而不是"客户".听起来很小,直到你意识到如果只有你可以将你的表命名为"交易"而不是"[交易]",你将会省去所有麻烦.
我实际上更喜欢ID列以表名为前缀.使编写查询更容易一些.对于外键,您可以将外键字段与键字段相同.
同样,我讨厌数据库中的ID列以表名为前缀,就像产品表中有一个productid列一样.冗余有时会使没有ORM的脚本更令人头疼,而不是需要它
是不是像变量前缀变量?
这不仅仅是DB的匈牙利符号吗?
我每天都在做数据库,我绝对希望每个表的id列包含表名作为列名的一部分(例如"productid"而不是"id".我发现它甚至可以让中等复杂的查询更容易阅读并在结果集中提供一组更有用的默认列名.
你可能会把桌子搞糊涂了!带着girraffe.
我喜欢当所有表的ID列都被称为RecordID时,这使得一切都非常一致.它是我的偏好,但是当您使用连接编写查询时,无需查找列以查看名称.
4> Toon Krijthe..: 几乎任何一种匈牙利符号.
匈牙利符号的问题在于它经常被误解.最初的想法是为变量添加前缀,使其含义清晰.例如:
int appCount = 0; // Number of apples.
int pearCount = 0; // Number of pears.
但大多数人用它来确定类型.
int iAppleCount = 0; // Number of apples.
int iPearCount = 0; // Number of pears.
这很令人困惑,因为尽管这两个数字都是整数,但每个人都知道,你无法将苹果与梨进行比较.
请参阅此Joel on Software帖子,了解*正确使用匈牙利符号如何帮助减少错误:http://www.joelonsoftware.com/articles/Wrong.html
至少第一个是正确的......其中"Apple"的所有内容都需要以"i"作为前缀.;)
当然,通过使用C++而不是C,您可以编写代码,以便编译器在将苹果与梨进行比较时给出错误.
不应该是"int cntApples = 0; int cntPeas = 0;"?IE浏览器.前缀是变量"kind".
是的,乔尔做对了.我希望编译器可以强制执行Joel的版本.
不应该是"豌豆数量"吗?
5> Jarrett Meye..: 我目前工作的地方没有三元运营商:
int value = (a < b) ? a : b;
...因为不是每个人都"得到它".如果你告诉我,"不要使用它,因为当结构太复杂时我们不得不重写它们"(嵌套的三元运算符,任何人?),然后我就明白了.但是,当你告诉我一些开发人员不理解他们......嗯......当然.
每个人,你的老板意味着自己.
如果有的话,规则应该是"总是使用三元运算符",一个纯美的运算符:)
我喜欢它,但我最经常不使用的原因与你的"人们不会理解它"的体验相同.我的论点是,如果他们无法理解这个概念,他们就不应该工作......
我曾经陷入这个阵营......但是从中成长,并学会了喜欢条件运算符(当它适当时).
如果不编写一个全新的函数(这对可读性没有太大帮助),你怎么能有条件地初始化一个常量变量呢?将const用于本地"变量"对于理解和遵循代码比对三元运算符的禁止更有利.
我实际上有一个真正反对三元运算符的同事,因为"它隐藏了昂贵的比较".当比较成为瓶颈时,开始考虑改变解决问题的方法......
我个人也讨厌它,因为它的可读性低于普通的if语句.安德烈亚斯,如果你说得对,写一个全新的功能就好了.
就个人而言,我无法忍受阅读使用三元运算符的代码.它只是为了我的可读性.
6> George..: 在进行更改时永远不要删除任何代码.我们被告知要评论所有变化.请记住,我们使用源代码控制.这项政策并没有持续很长时间,因为开发人员对此哗然,以及如何使代码难以理解.
这样的规则就是为什么我觉得需要打印我从其他颜色继承的源代码.在一个页面上,这对我的公司来说不是很好 - 但如果我必须打印它,这是我能阅读它的唯一方法.(我们继承了很多遵循这条规则......)
我喜欢阅读这些答案,因为它使我的工作看起来好100倍.
我真的很讨厌......这里有一些人这样做(虽然这不是标准或其他任何东西)
听起来像规则开发前源控制.或者由于程序员每周只能登记一次.
感觉你...我们在SVN上工作了4年多,但是高级开发人员讨厌它并且每两个月大约检查一次,接下来的三天会花费一些代码来破坏代码:/
7> paercebal..: 我曾经在Mighty VB King 的暴政下工作过.
在VB王 为MS Excel和VBA,以及数据库的纯主(因此他的姓:他使用了与Excel的,而开发人员编译工作,并挑战他的数据库可能对你的职业生涯......不利影响 ).
当然,他的巨大 技能给了他一个独特 的发展问题和项目管理解决方案的愿景:虽然不是最严格意义上的编码标准,但VB King 经常对他所尝试的"编码标准"和"最佳实践"有新的想法(和经常成功地)强加给我们.例如:
所有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实用程序函数 和作为OOP语言的XSL-T之外,其他所有 实现都已实现.当然,随着时间的推移,一些人被发现,咳嗽 ,破碎,完全被遗弃.
当然,VB King的 信誉从来没有受到过这样的影响:在高层管理人员中,他仍然是"顶级枪支"技术专家......
这会产生一些有趣的副作用,你可以通过以下链接看到你遇到的源代码中最好的评论是什么?
的暴政下工作过.
为MS Excel和VBA,以及数据库的纯主(
).
技能给了他一个
的发展问题和项目管理解决方案的愿景:虽然不是最严格意义上的编码标准,但
经常对他所尝试的"编码标准"和"最佳实践"有新的想法(和经常成功地)强加给我们.例如:
)
).
).
).
).
,
和
实现都已实现.当然,随着时间的推移,一些人被发现,
,破碎,完全被遗弃.
信誉从来没有受到过这样的影响:在高层管理人员中,他仍然是"顶级枪支"技术专家......
@muusbolla:谁告诉你我们没有抱怨?它升级,直到两人(包括我)的代表团直接向首席执行官解释问题.但我很遗憾不得不告诉你,正义统治的理想主义世界与现实世界之间存在差异,一些老板认为"管理永远不会错,即使它是",并且会粉碎任何人敢于反驳那种教条.我那个时代唯一幸福的纪念品是我差不多三年前辞职的那一天,从那天起我就是一个快乐的人.无论如何,如果是真的,你的下行原因是蹩脚的.抱歉.
@jrista:如果你没有评论我的文字的拼写,请忽略以下...... ...... ...... ......如果你在评论我的文字,请考虑(1)提出更正,(2)自己纠正拼写,或(3)考虑到并非世界上每个开发人员(远离它)都是母语为英语的人,所以我认为容忍不正确的拼写是你可以做的最小值,或者证明你可以通过在法语中向我发送正确的翻译来做得更好...... ^ _ ^ ......
回复:1索引.有时你只需站起来说一些像"那个愚蠢和错误"那样强烈的东西.在沙子中划一条线.忘记安抚自负,然后说出来.我几乎可以保证每个其他有价值的程序员都会立即开始点头加入.
@paercebal:engénérale,c'estcorrectementécrit,sauf que quelques petits erreurs:«squatch»:çadoitêtre«squash»; «这一天»:en ce context-là,on dirait«那天»; «库存程序»:«库存程序»; «chocked»s'écrit«choked».Aussi,dans les commentaires,vous utilisez°提到»,ce quidoitêtre«提到»Mais vraiment,toutçanejustifie pas une telle plainte.Au逆转,vous y montrez une excellentemaîtrisedel'anglais; 祝贺!
如果这个人是我的老板,我会直接向高级管理层的每一位成员提供一份精心编写并记录在案的投诉清单,并让他解雇.-1因为没有球为自己站起来.
8> David Arno..: 早在80年代/ 90年代,我就在一家使用FORTRAN的飞机模拟器公司工作.我们的FORTRAN编译器对变量名的限制为8个字符.该公司的编码标准保留了前三个用于匈牙利语符号样式信息.所以我们不得不尝试用5个字符创建有意义的变量名!
"当我年纪的时候,我们只有2个角色!而且它不区分大小写!"
我们过去必须在凌晨2点,睡前3小时起床,然后编写我们自己的编译器并向公司支付上班的特权.对于我们的变量名,我们只允许使用字母A. 然后我们的老板会删除我们的代码并在我们的列表上跳舞唱哈利路亚.
奢侈品:我们只有6个字符; 包装的名称以g开头; 内部功能全部启动了gk; 有工作站驱动程序的代码,如0p(所以gk0p是开始),剩下的Fortran名称留下两个字符.gk0paa,gk0pab,...
"对任何人来说,50个可能的标识符应该足够了":p
哎呀,我们很久以前使用的BASIC解释器有两个字符的变量名.为什么抱怨5?
@Donal,让我想起TI-83计算器上的'编程'(简体中文版).我15岁,一个完整的菜鸟,甚至当时我有点感觉有一些不完全正确的1-char变量.
9> Michael East..: 我在一家有两家公司合并的地方工作过."主导"的服务器有一个用K&R C编写的主服务器(即ANSI之前).他们强迫Java团队(来自两个办公室 - 可能总共20个开发者)使用这种格式,这种格式令人兴奋地忽略了"大括号辩论"的两大支柱并直接疯狂:
if ( x == y )
{
System.out.println("this is painful");
x = 0;
y++;
}
我认为在C和Java之间保持更大的视觉区别会使转换更容易.(+1代表"并且直接疯狂.")
我发现这是最智能的支撑式.不幸的是,大多数人都不使用它.如果大括号具有语义含义,则应将它们视为它,而不是停留在一行的末尾并被忽略.
@Kyralessa.我不同意......我不知道大括号是否具有语义含义,但它们肯定会影响模式匹配和空间感.国际海事组织,这个版本完全失去了.例如,我希望我的书签在书外捅,而不是与页面齐平.
这实际上是我的首选风格,但世界上的一切(特别是Visual Studio)默认为其他模式,所以我放弃了.*为什么*我喜欢它吗?大括号*是包含代码的"部分" - 它们强制它"看起来像"if的单个语句,这是它所期望的.
看起来像Petzold在原版'Programming Windows'中使用的Whitesmiths风格 - 去图!;)
yuckers.这显然是有史以来最糟糕的包围式.
我的工作场所这样做(以及Java).它让我抽搐了几个星期,但我很快就习惯了,现在我喜欢它.它比"OTBS"更好,至少(我以前是ANSI/Allman的人).
10> bh213..: 禁止:
while (true) {
允许:
for (;;) {
如果我理解正确的现代,新奇的笑脸,这个标准正在使穷人,过度工作的声明哭!
在我工作的第一个C程序中,有人添加了#define(;;)所以你可以说"永远{...}"
Bjarne S.在他的书中说,"for(;;)应该永远被读".如果它对C++的创建者来说足够好,它对你来说应该足够好了.:-)
这是事实上的规则.VC6发出关于while(true)的编译器警告,但不关于for(;;).否则他们是等同的.所以我们选择无警告.
其他人则认为`for(;;){`是第一个C语言.
每个人都知道(;;)更快,更不容易出错;)
11> Steven A. Lo..: 我的一个朋友-我们叫他CodeMonkey -得到了他的第一份工作的大学[ 很多 年前在COBOL做内部开发.他的第一个程序被拒绝为"不遵守我们的标准",因为它使用了...... [shudder!]嵌套的IF语句
编码标准禁止使用嵌套的IF语句
现在,CodeMonkey并不害羞,并且确定了自己的能力,所以他坚持要求所有人都在链条上,并在过道上为什么存在这条规则.大多数人声称他们不知道,有些人编写了关于"可读性"的内容,最后有一个人记住了原因:他们使用的第一个版本的COBOL编译器有一个错误,并没有正确处理嵌套的IF语句.
当然,这个编译器错误已经修复了至少十年,但没有人质疑标准 .[咩咩咩!]
CodeMonkey成功地改变了标准 - 最终!
史蒂文,这让我想起猴子实验故事:o)http://freekvermeulen.blogspot.com/2008/08/monkey-story-experiment-involved-5.html
@ [Nick D]:是的,我也是 - 因此代号"CodeMonkey";-)
或者[奶奶的烹饪秘密](http://www.snopes.com/weddings/newlywed/secret.asp)......
12> ZombieSheep..: 曾经在一个禁止下划线的项目上工作过.我的意思是完全被禁止.所以在ac#winforms应用程序中,每当我们添加一个新的事件处理程序时(例如对于一个按钮),我们必须将默认方法名称从buttonName_Click()重命名为其他东西,只是为了满足写入编码的人的自我标准.直到今天,我不知道他对这个卑微的下划线有什么看法
buttonNameUnderscoreClick()
也许_在他的键盘上被打破了;)
有不幸的副作用阻止使用__FILE__和__LINE__进行调试.和头文件中的#if __cplusplus extern"C".和stdint.h中的整数类型.和size_t.
好的,这就是C#
我严重劝阻下划线(虽然不是上面列出的OP案例.这是额外的两次击键(shift + _),当帕斯卡或骆驼案件做得很好时,我宁愿不给我.
下划线是一种非常有用的方法,可以使用C语言.当我们有一个用functions_like_this编写的现有C库文件时,我讨厌当有人将justOneFunctionLikeThis添加到library_with_all_underscores时.有些人.怎么样,试着去适应,不仅仅是把自己强加给别人?
13> Kristof Neir..: 完全没用的数据库命名约定.每个表名都必须以数字开头.数字显示表中的数据类型.
0:到处使用的数据
1:仅由某个模块使用的数据
2:查找表
3:日历,聊天和邮件
4:记录
如果您只知道其名称的第一个字母,则很难找到表格.另外 - 因为这是一个mssql数据库 - 我们必须在任何地方用方括号括起表名.
-- doesn't work
select * from 0examples;
-- does work
select * from [0examples];
对不起,非常抱歉......
ewwwwwwwwwwwwww
14> billmcc..: 我们正在做一个C++项目,团队领导是Pascal人.
所以我们有一个编码标准包含文件来重新定义所有那些讨厌的C和C++语法:
#define BEGIN {
#define END }
但等等还有更多!
#define ENDIF }
#define CASE switch
等一切都很难记住.
这需要完全可读的C++代码,并使除了团队领导之外的任何人都难以理解.
我们还必须使用反匈牙利表示法,即
MyClass *class_pt // pt = pointer to type
UINT32 maxHops_u // u = uint32
虽然奇怪的是我渐渐喜欢上了这个.
构建不可维护的未来代码
当我在MS VC++支持下工作时,我们有几个客户提交了这样编写的repro代码.我们花了一段时间才意识到它实际上是在C++中(它们没有包含#defines).
你知道,我想我和你在一起.匈牙利的疣在这样的结束时并没有那么令人反感.
匈牙利表示法做得很好是可以的.做错了...... ick.适当的类型系统胜过两者.
15> Jeromy Irvin..: 在以前的工作:
"正常"表格以T_开头
"系统"表(通常是查找)以TS_开头(除非他们不这样做,因为当天有人不喜欢它)
交叉引用表以TSX_开头
所有字段名称都以F_开头
恩,那就对了.每个表中的所有字段.这样我们就可以说它是一个领域.
神圣的......发明这场噩梦的T_guy应该用F_gun杀死并发送到TSX_hell.
@configurator:你有所有字段的"tbl"和所有表的"fld"?:-)))
所有字段和表格都有tbl和fld.完全没用......
@Czimi:我忘记提到了.每个表都有一个名为FI_ID的字段用作主键.
16> JaredPar..: 我的一个伙伴在政府工作期间遇到这个规则.++(前或后)的使用被完全禁止.原因:不同的编译器可能会以不同的方式解释它.
有人因为不理解后缀和前缀之间的区别,声称编译器错误,然后对其他人造成了影响,我认为.
他是对的 - 当你在语句的其他地方使用相同的变量时,不能保证操作的顺序.但是,只是禁止可能含糊不清的代码,而不是所有用途!
那么,那时你也可以放弃吧?
实际上,在某些情况下,他们是对的.禁令似乎有点过头了.例如,行:a [i] = i ++; 在用于索引a或之后,我可能会增加.该语言没有定义这一点.
也可以禁止`=`,因为它可以用来导致未定义的行为.
17> Tim Lesher..: 半数球队赞成四空缩进; 另一半赞成两空缩进.
正如你可以猜到的那样,编码标准规定了三个,以便"同样得罪"(直接引用).
这就是为什么标签识别如此之大.每个人都可以在他的编辑器中改变大小;)
是的,标签缩进很棒......直到你实际打开其他人的文件,并发现事情未对齐,因为空间混合在他们不应该拥有的地方,或者没有混合在他们应该拥有的地方.然后你自动重新格式化,版本控制差异变得丑陋.啊.
这就是为什么你应该只使用制表符来缩进,并且只有空格来对齐,而且twain永远不会相遇.如果您要对文件中的空白进行更改,则需要对该特定签入进行唯一更改.
......那永远不会奏效.:P
为了"冒犯所有人"...我喜欢它.下次我在压痕标准化战争中不知何故,我将不得不记住这一点.
我同意艾伦.混合标签和空格使得代码只能在一个人的机器上看起来正确.使用三个空格(我的首选方法)总是很漂亮.虽然我的代码没有.
@rjh同意,但这是一个错误的二分法.当半数球队更喜欢A,而半数球员更喜欢B时,我宁愿拥有一个或另一个,即使它不是我喜欢的那个!如果我想要一辆蓝色的车(但是红色是可以接受的)而我的妻子想要一辆红色轿车(但是蓝色是可以接受的),买一辆紫色轿车并不是一个好办法.
18> leppie..: 由于经理声称它涉及太多"魔法",因此无法使用反射.
为'魔术'读取性能杀死不可维护的晦涩噩梦代码.他是对的.
由于错误的原因,这可能是正确的规则:)
是的,魔术难以维持,但很有意思;)LOL.
打倒那些**巫师**!! 总是在他们的*魔法*周围,偷走我们的工作,诱惑我们的女人和腐败我们的孩子!
我想你根本不允许在.Net中编码.毕竟,框架执行的很多方式都是通过反思来实现的.
我避免在设计的主要部分使用反射,但彻底禁止是愚蠢的.
19> Ovid..: 我所拥有的最奇怪的一个,以及花了我一段时间推翻的一个,就是我们公司的老板要求我们的新产品只是IE浏览器.如果它可以在FireFox上运行,那很好,但它必须只是IE浏览器.
这可能听起来不太奇怪,除了一个小瑕疵.所有的软件都是用于在Linux上运行的定制服务器软件包,而我们客户购买的所有客户端盒都是Linux.没有试图弄清楚如何让Wine(在那些日子里,非常不可靠)在所有这些盒子上运行并看看我们是否可以让IE运行并培训他们的管理员如何调试Wine问题,这根本不可能满足业主的要求.问题是他正在进行网页设计而根本不知道如何使网站符合FireFox.
要知道我们公司破产了,你可能不会感到震惊.
为适者生存而言......这个人不应该经营自己的软件业务.
为资本主义欢呼三声!
最后一句很棒.当他们做出这样的决定时,怎么会有人认真对待?
20> Daniel Rikow..: 使用通用编号标识符名称
在我目前的工作中,我们有两个真正意义上的规则:
规则1: 每次我们在数据库表中创建一个新字段时,我们都必须添加其他保留字段以供将来使用.这些保留字段已编号(因为没有人知道它们将在某一天保存哪些数据)下次我们需要新字段时,我们首先查找未使用的保留字段.
因此,我们最终会customer.reserve_field_14
包含客户的电子邮件地址.
有一天,我们的老板考虑引入储备桌 ,但幸运的是我们可以说服他不要这样做.
规则2: 我们的一个产品是用VB6编写的,VB6有不同标识符名称的总数限制,因为代码非常大,我们经常遇到这个限制.作为"解决方案",所有本地变量名都被编号:
Lvarlong1
Lvarlong2
Lvarstr1
...
虽然这有效地规避了标识符限制,但这两个规则的结合导致了如下的漂亮代码:
...
If Lvarbool1 Then
Lvarbool2 = True
End If
If Lvarbool2 Or Lvarstr1 <> Lvarstr5 Then
db.Execute("DELETE FROM customer WHERE " _
& "reserve_field_12 = '" & Lvarstr1 & "'")
End If
...
你可以想象修复旧的或其他人的代码是多么困难......
最新更新: 现在我们也为私人会员使用"预约程序":
Private Sub LSub1(Lvarlong1 As Long, Lvarstr1 As String)
If Lvarlong1 >= 0 Then
Lvarbool1 = LFunc1(Lvarstr1)
Else
Lvarbool1 = LFunc6()
End If
If Lvarbool1 Then
LSub4 Lvarstr1
End If
End Sub
编辑: 似乎这种代码模式正变得越来越流行.查看每日WTF帖子了解更多:散光 :)
不开玩笑.我敢打赌,它需要永远完成并删除所有这些SQL注入.;-)
omg,谁会想出这样的规则?最重要的是:你的团队如何管理代码?
我认为他的意思是你默认选择所有字段,这样你就可以获得所有"保留"字段,而无需全部指定.
maibe你可以使用代码预处理,你可以使用有意义的变量名称编写你的代码,然后在编译像'%s/email/reserve_field_12/g'之类的somegtinh之前用"正确的"代替它;)
21> Adam Straugh..: 回到我的C++时代,我们不允许使用==,> =,<=,&&等等.这里有宏...
if (bob EQ 7 AND alice LEQ 10)
{
// blah
}
这显然是为了处理"条件错误中的旧意外分配",但我们也 有规则"将常量放在变量之前",所以
if (NULL EQ ptr); //ok
if (ptr EQ NULL); //not ok
记住,我听过的最简单的编码标准是"编写代码就好像下一个维护者是一个知道你住在哪里的恶毒的精神病患者".
为邪恶的精神病患者+1.
22> vfilby..: 一般的匈牙利表示法.
HUngarian符号并不邪恶,只需要正确使用http://www.joelonsoftware.com/articles/Wrong.html
好吧,我喜欢H/N来控制页面.当我需要查找的是txtFooBar时,在IntelliSense下拉列表中找到所有文本框控件要容易得多.
可怕的是误用了,是的.错了,没有.
很多人用I,IEnumerable,IList ...在.Net框架中启动接口名称,接口以I开头.
23> T.E.D...: 我有很多愚蠢的 规则,但不是很多,我认为是彻头彻尾的怪.
最愚蠢的是我在90年代早期工作的NASA工作.这是一项巨大的工作,有超过100名开发人员.编写编码标准的经验丰富的开发人员决定每个源文件都应以四个字母的首字母缩写开头,第一个字母必须代表负责该文件的组.这可能是他们习惯的旧FORTRAN 77项目的一个好主意.
然而,这是一个Ada 项目,具有一个很好的分层库结构,所以根本没有任何意义.每个目录都装满了以相同字母开头的文件,然后是3个无意义的字母,一个下划线,然后是重要的文件名的一部分.所有的Ada包都必须从同样的五个字符的疣开始.Ada"use"子句也不被允许(在正常情况下可以说是好事),因此这意味着对任何非源文件本地标识符的引用也 必须包含这个无用的疣.可能应该有一个起义,但是整个项目都是由初级程序员组成的,并且是大学新员工的新成员(我自己就是后者).
一个典型的赋值语句(在Ada中已经很详细)最终会看起来像这样:
NABC_The_Package_Name.X := NABC_The_Package_Name.X +
CXYZ_Some_Other_Package_Name.Delta_X;
幸运的是,他们至少开悟了足以让我们超过80列!尽管如此,设施疣还是足够讨厌它成为每个人源文件顶部的样板代码,使用Ada"重命名"来摆脱疣.每个导入("withed")包都有一个重命名.像这样:
package Package_Name renames NABC_Package_Name;
package Some_Other_Package_Name renames CXYZ_Some_Other_Package_Name;
--// Repeated in this vein for an average of 10 lines or so
我们中间更有创造力的是尝试使用 疣来制作一个合理的(或愚蠢的)包名.(我知道你在想什么,但不允许对你进行探索和羞辱!这真令人恶心).例如,我在C ommon代码组中,我需要创建一个与W orkstation组接口的包.在与Workstation人进行头脑风暴会议之后,我们决定为我们的软件包命名,以便需要两者的人必须写:
with CANT_Interface_Package;
with WONT_Interface_Package;
该死的,我真的以为你会全力以赴并使用CUN*_和W*NK_包命名约定.对不起,我有缓慢燃烧,爆炸性,文字的tourettes.但你的更多,更有趣!
24> Avihu Turzio..: 当我开始在一个地方工作,并开始将我的代码输入源代码管理器时,我的老板突然向我走来,并要求我停止这么做.他告诉我,不鼓励每天为开发人员做超过1次提交,因为它会占用源控件.我只是盯着他......
后来我明白了他甚至向我提出这个问题的原因是因为SVN服务器会向他(以及另外10位高管)发送一封邮件给每个人做出的提交.通过乱扔垃圾源控制器,我猜他是他的邮箱.
充分利用这两个世界 - 当您不想丢失某些东西时,请致力于您当地的分支机构.当你准备把它们变成掌握时,重新启动并压缩这些提交.(原谅git术语 - 我确信它可能在mercurial和其他一些系统中也可能)
25> azkotoki..: 通过Sql Server 2000中的存储过程执行所有数据库查询.从复杂的多表查询到简单的查询:
select id, name from people
赞成程序的论据是:
性能
安全
可维护性
我知道程序主题很有争议,所以请随意给我的答案评分;)
Nah:sprocs非常有用.虽然有时会很痛苦,但最终还是会编写一个更好,更可重用的数据库界面.您的dba还可以更轻松地分析性能问题,并且可以在不更改应用程序代码的情况下更新生产系统.我不提倡sprocs中的商业逻辑.
在编译的代码中隐藏查询是一件很痛苦的事情,我100%仅仅为抽象提供了100%的sprocs策略
如果表名和列名不唯一,但SP名称是唯一的,则可以提高可维护性.这可以使代码引用更容易找到.如果还有其他更好的可维护性优势,我也不了解它们.安全性是使用SP的主要原因.
我同意,出于一般目的,它不是100%wtf,但请看这个链接:http://www.codinghorror.com/blog/archives/000292.html
"安全性是使用SP的主要原因"没有.关于SQL Server中SP的任何内容都更安全.它们仅在被称为paremeterized查询时才是安全的,这可以通过动态SQL完成.
26> harriyott..: 每1000行代码必须有165个单元测试(不一定是自动化的).对于大约每8行进行一次测试.
不用说,一些代码行很长,函数返回这个 指针以允许链接.
更像是6行.
27> Nat..: 我们必须按字母顺序对类中的所有函数进行排序,以使它们"更容易找到".没关系,ide有一个下降.这点击太多了.
(同样的技术主管编写了一个应用程序来删除源代码中的所有注释).
当然!开发人员应该编写代码,而不是浪费时间写评论:)
确定,"因为评论只是杂乱无章......毕竟......并且想想预处理器在编译时节省了多少个周期!(该应用程序甚至比规则更有趣.很好.)
我在各自的组中按字母顺序对方法,成员等进行排序,包括标题和来源......但这只是因为我很痴迷.
是啊!并且评论使构建变慢!
不过,我认为按类型(字段,属性,方法)和名称对成员进行排序是一个很好的规则
28> Robert Rossn..: 在1987年左右,我在一家聘请我的公司工作,因为我是少数知道如何使用启示录的人之一.启示录,如果你从来没有听说过它,基本上是一个基于PC的Pick操作系统的实现 - 如果你从未听说过它,它的名字来自它的发明者,名字很棒的Dick Pick.关于Pick OS可以说很多,其中大部分都很好.许多supermini供应商(Prime和MIPS,至少)使用Pick或他们自己的定制实现.
这家公司是Prime商店,他们的内部系统使用信息.(不,这就是它的名字:这是Prime对Pick的实施.)他们与州政府签订合同,建立一个基于PC的系统,并且在做完所有工作之前已经花了一年的时间进入他们的启示项目,谁也是他们的MIS主管,他决定不再做这两份工作并聘请我.
无论如何,他为他们的基于Prime的软件建立了许多编码标准,其中许多源于两个基本条件:1)使用80列哑终端,2)因为Prime没有'有一个视觉编辑,他写了自己的.由于Pick代码的神奇可移植性,他将他的编辑带入Revelation,并使用它在PC上构建了整个项目.
当然,启示录是基于个人电脑的,有一个非常好的全屏幕编辑器,当你走过第80列时没有反对.然而,在前几个月我在那里,他坚持说我使用他的编辑器和他的标准.
因此,第一个标准是必须对每行代码进行评论.每一行.没有例外.他的理由是,即使你的评论确切地说明了你刚刚在代码中写的内容,不得不发表评论意味着你至少要考虑两次这一行.此外,正如他愉快地指出的那样,他已经向编辑器添加了一个命令,该命令格式化了每行代码,以便您可以发出行尾注释.
哦,是的.当您评论每行代码时,它都是行尾 注释.简而言之,每行的前64个字符用于代码,然后有一个分号,然后你有15个字符来描述你的64个字符的作用.简而言之,我们使用汇编语言约定来格式化我们的Pick/Basic代码.这导致了这样的事情:
EVENT.LIST[DATE.INDEX][-1] = _ ;ADD THE MOST RECENT EVENT
EVENTS[LEN(EVENTS)] ;TO THE END OF EVENT LIST
(实际上,20年后我终于忘记了R/Basic的行继续语法,所以它看起来可能有所不同.但是你明白了.)
此外,每当您必须插入多行注释时,规则是您使用花箱:
************************************************************************
** IN CASE YOU NEVER HEARD OF ONE, OR COULDN'T GUESS FROM ITS NAME, **
** THIS IS A FLOWER BOX. **
************************************************************************
是的,需要在每一行上关闭星号.毕竟,如果您使用他的编辑器,那么插入一个花箱只是一个简单的编辑器命令.
让他放松并让我使用Revelation的内置编辑器是一场相当大的战斗.起初他坚持,只因为那些是规则.当我反对a)我已经知道启示录编辑b)它比他的编辑更有功能,c)其他启示录开发者会有相同的观点,他反驳说,如果我没有在他的编辑上训练,我就不会能够在Prime代码库上工作,正如我们都知道的那样,只要地狱一直没有解冻,它就不会发生.最后他放弃了.
但编码标准是最后的.特别是花箱的评论是一种愚蠢的浪费时间,他在我们身上煞费苦心地说,如果我只是使用合适的编辑器来维护它们就会非常容易.(整个事情变得非常被动 - 具有侵略性.)最后我悄悄地放弃了,从那时起,我带到代码评论的所有代码都有他珍贵的花箱评论.
有一天,几个月的工作,当我几乎证明自己胜过自己(特别是与我在那里工作时经过那个办公室的其他编码员的非凡游行相比),他看着我的肩膀,因为我工作,他注意到我没有使用花箱评论.哦,我说,我写了一个源代码格式化程序,当我打印出来时,它会将我的评论转换成你的风格.它比在编辑器中维护它们更容易.他张开嘴,想了一会儿,关上了,走开了,我们再也没有谈过编码标准.之后我们的工作变得更容易了.
打印时注释格式化程序为+1
29> abeger..: 在我的第一份工作中,所有C程序,无论多么简单或复杂,只有四个功能.你有main,它依次调用其他三个函数.我不记得他们的名字,但他们是begin(),middle()和end()的东西.begin()打开文件和数据库连接,end()关闭它们,而middle()完成其他所有操作 .不用说,middle()是一个很 长的功能.
只是为了让事情变得更好,所有变量都必须是全局变量.
我对这项工作最骄傲的回忆之一就是导致这些标准遭到破坏的一般反抗的一部分.
我想在会议室的纸上听起来不错,但我很遗憾必须遵循它的程序员
30> soru..: 外部编写的C编码标准,其规则"不依赖于内置运算符优先级,始终使用括号"
很公平,明显的意图是禁止:
a = 3 + 6 * 2;
支持:
a = 3 + (6 * 2);
事实上,这是由遵循C语法规则的工具强制执行的'=','==','.' 和数组访问是运算符.所以代码如下:
a[i].x += b[i].y + d - 7;
不得不写成:
((a[i]).x) += (((b[i]).y + d) - 7);
也许(((a)[(i)]).x)+ =((((((b)[(i)]).y)+(d)) - (7)); ?
31> John Rudy..: 几年前,我最奇怪的是合同.@ ZombieSheep奇怪的是它的一部分,但不是该公司中最奇怪的一个.
不,该公司中最奇怪的是数据库命名方案.每个表都以全部大写字母命名,单词之间有下划线.每个表都有一个前缀(通常为1到6个字符),通常是主表名的缩写或缩写.表格的每个字段都以相同的前缀为前缀.所以,假设你有一个简单的架构,人们可以拥有猫或狗.它看起来像这样:
PER_PERSON
PER_ID
PER_NameFirst
PER_NameLast
...
CAT_CAT
CAT_ID
CAT_Name
CAT_Breed
...
DOG_DOG
DOG_ID
DOG_Name
DOG_Breed
...
PERCD_PERSON_CAT_DOG (for the join data)
PERCD_ID
PERCD_PER_ID
PERCD_CAT_ID
PERCD_DOG_ID
也就是说,最初感觉很奇怪......它在我身上发展.它背后的原因是有意义的(在你围绕它的大脑后),因为前缀是建立连接时提醒"推荐"(和强制!)表别名.前缀使得大多数连接查询更容易编写,因为您必须在字段之前显式引用表是非常罕见的.
哎呀,过了一会儿,团队中的所有人(我们项目中的6个人)都能够通过前缀开始引用对话中的表格.一种后天的味道,可以肯定......但是我的成长.当我拥有那种自由时,我仍然使用它.
我只是在嘴里扒了一下.
而且我认为`
.`是一个足够好的前缀来放置列名.那是告诉我的. 我认为没有更好的方法可以让人们发现他们分别为他们工作或为他们工作而害怕的人.你们在我的名单上,随意把我放在你的名单上.:) 32> Stefan..: 使用dbo_的前缀表
是的,就像在dbo.dbo_tablename中一样.
不在`dbo`中的表会发生什么?:) 33> Binary Worri..: 2002年至2004年,几家WTF在一家VB6商店(我并不自豪,我很饿,需要吃饭).
最烦人的恕我直言,在子/函数的末尾设置所有对象引用.这是为了"帮助"编译器引用计数.无论我为TA做了多少次测试来证明它没有必要,哦,不,它仍然必须完成,尽管他绝对没有任何证据可以支持他 .最终我放弃了大约一年后发现了一篇解释为什么它是裤子的文章.我把它带到了TA的想法"得到了笨蛋!".他说:"是的,我已经知道了多年,但如果你开始改变标准羊"意味着其他开发人员,他每天工作的人"将搞砸".Gob sh1te.
其他人在同一家商店.
永远不要删除代码,总是将其注释掉(即使我们使用的是源代码控制).
表名的前缀在我到达时没有意义,但必须在新表上强制执行.
使用o_前缀所有对象(lo_用于过程级别引用,mo_用于模块,go_用于全局).在项目中绝对没有意义,其中每个其他变量都是对象引用.
大多数情况下,我在那里编写c ++(只有c ++开发人员,因此制定了自己的标准,并严格执行!)偶尔使用vb,否则我就不会持续.
可悲的是,在我上一份工作中,我们正在使用Java,并且讨厌OutOfMemory问题并且似乎有内存泄漏.我们正在与之合作的咨询公司实际上已经提出并实施了,在方法结束时将每个变量都设置为null.不用说,问题没有消失:) 34> Cory Foy..: 每个开始和结束括号都需要 有一个评论:
public void HelloWorld(string name)
{
if(name == "Joe")
{
Console.WriteLine("Hey, Joe!");
} //if(name == "Joe")
else
{
Console.WriteLine("Hello, " + name);
} //if(name == "Joe")
} //public void HelloWorld(string name)
这就是我编写第一个Visual Studio插件以实现自动化的原因.
上帝我讨厌那些类型的评论 - 他们只是在屏幕上添加视觉垃圾 如果你有很长的嵌套if,那么这种评论只是一个小的胶带而不是一个真正的修复(即提取方法等) 一般来说,我同意,@ matt ......但是当你交出一个444行的VBScript经典ASP页面,其中散布着非常长(90+ LOC)的嵌套ifs时,它会非常有用.当然,假设原始开发者正确匹配它们.在这样的代码中,这可能不是一个安全的假设! 35> Dan Esparza..: 哇 - 这带回了我工作的一个特定地方的许多回忆:亚利桑那州交通部.
那里有一个项目经理不理解基于对象的编程(并且不想理解它). 她确信基于对象的编程是一种时尚,并且拒绝让任何人使用任何类型的基于对象的编程的签入代码.
(说真的 - 她实际上花了很多时间审查我们已经签入Visual SourceSafe的代码,以确保我们没有违反规则).
考虑到Visual Basic 4刚刚发布(这是大约12年前),并且考虑到Windows表单应用程序,我们在VB4中使用对象来描述表单 ,这使得开发......变得复杂.
我的一个伙伴实际上试图通过将他的"目标代码"封装在虚拟"形式"中来解决这个问题,她最终发现他只是(*喘气 *)隐藏他的对象!
毋庸置疑,我只在那里待了大约3个月.
天哪,我不喜欢那个女人的想法.
招聘决策通常由没有技术技能的人做出,而某些非常无能的人非常善于用大量流行的流行语欺骗这些采访. @Roberto:几乎肯定是资历.大概很久以前她就是从国家开始的,并且通过资历晋升.这保证了管理层确实拥有丰富的经验,但并不是说它能够接近正确的经验. 令我感到困惑的是这些人甚至被雇用了吗???? 36> Rob Stevenso..: 让我疯狂的是人们用表格的名称后缀表格的ID字段.只是身份证到底有什么问题?无论如何,你将不得不别名它...为了所有神圣的爱!
想象一下,当您拥有名为IDSEWEBLASTCUSTOMERACTION和IDSEEVENTLOGGER的id字段时,您的SQL语句会是什么样子.
我的偏好:...来自客户左连接地址(address.id = customer.address_id) 实际上我认为它使查询更容易编写和阅读.我这样做 SELECT*FROM Person P LEFT JOIN PhoneNumber PN ON P.PersonID = PN.PersonID 37> Zsolt Botyka..: 您必须只使用五个字母的表名,并保留最后两个字符IO
.
38> Mesh..: 我看到的最奇怪的是数据库表命名,其中表格以功能区域的TLA开头,例如,计算ACC然后是3位数字(覆盖默认排序),然后是表格名称.
此外,这也被扩展到列名称中.
ACC100_AccountCode
读取查询是一场噩梦,它们是如此难以理解.
39> itsmatt..: 将s_应用于对于作为控制系统一部分的软件而言被视为"安全关键"的变量和方法.再加上关于将m_放在成员变量前面的另一个规则,你会得到像"s_m_blah()"这样荒谬的东西,这在我看来写起来很烦人,而且不太可读.最后,一些"安全专家"应该通过查看代码并通过使用那些"s_"来确定其中的某些东西来获得洞察力 - 在实践中,他们不太了解c ++,所以他们除了报告我们标记为"安全关键"的标识符数量.完全没废话......
我刚刚花了五分钟时间试着想一个关于S&M的笑话.我敢肯定必须有一个.可能不适合发布在这里. 40> Tim Stewart..: 团队规模大约是十几人.对于C#方法,我们必须在每个函数之前放置一个巨大的XML格式函数.我不完全记得格式,但它涉及嵌套大约三到五级深度的XML标签.这是评论记忆中的草图.
///
///
///
///
///
/// Date
/// Modified By
/// Comment
///
///
///
///
/// 10/10/2006
/// Fred
/// Created function
///
///
///
我必须停在那里......
缺点很多.
文件主要由评论组成.
我们没有使用我们的版本控制系统来跟踪文件的更改.
编写许多小函数会影响可读性.
滚动很多.
有些人没有更新评论.
我使用代码片段(Emacs YAS)将此代码添加到我的方法中.
41> NeedHack..: (可能只在英国有趣)
我工作过的一家保险公司想要一个组合"P"或"L"来表示范围,与所有属性的匈牙利人联系起来.
加分点是我们有一个名为pintMaster的属性!让我们都喜欢喝一杯.
42> BubbaT..: 这是一个我没有遵循的编码标准(为其他事情遇到麻烦,但从来没有这样做).我们有三个19"显示器,所以我们可以让两个编辑器打开全屏,仍然可以访问桌面.其他人都没有使用评论,但使用了有意义的名字.非常长的有意义的名字.我记得最长的是在80性格范围.平均值在40~50左右.
猜猜是什么,他们没有准确地描述整个事情.
ITYM:for(int ThisIsAnIterativeVariableWhichWeWillIncreaseBy1EachTime = 0; ThisIsAnIterativeVariableWhichWeWillIncreaseBy1EachTime <10; ThisIsAnIterativeVariableWhichWeWillIncreaseBy1EachTime + = 2); for(int ThisIsAnIterativeVariableWhichWeWillIncreaseBy1EachTime = 0; ThisIsAnIterativeVariableWhichWeWillIncreaseBy1EachTime <10; ThisIsAnIterativeVariableWhichWeWillIncreaseBy1EachTime ++); 43> kemiller2002..: 如果我没记错的话,delphi IDE会默认缩进两个空格.该公司的大部分遗留代码都有三个空间,由VP IT和CEO编写.有一天,所有的程序员都在谈论我们应该做些什么来让我们的生活变得更轻松,一个知道Delphi的承包商说得很好,"嘿,ide默认为两个空格,任何人都有问题我们这样做新的代码?" 我们所有人都看着对方,几乎以为这是一个没脑子的人说我们同意了.
两天后,副总裁和首席执行官发现我们将做出如此危险的变化,这可能会"引发问题"并告诉我们,我们将对所有事情使用三个缩进,直到他们两个能够准确评估这种变化的影响.现在我完全遵循标准,但是这些人认为oo编程创建了一个具有一个函数的对象,该函数具有执行操作所需的所有 逻辑,并且源代码控制将代码文件移动到另一个目录.
44> Richard Ever..: 不是一个编码标准,但在1998年,我在一家禁止使用C++的公司工作,转而支持C.这是因为OO被认为过于复杂而无法让软件工程师掌握.
在我们的C代码中,我们需要在所有分号前加一个空格
int someInt = 5 ;
我永远无法找到理由,但过了一段时间它确实在我身上发展.
+1与害怕OO的程序员合作 我对林纳斯的咆哮印象不深.他听起来很有思想性和偏见.我会坚持STL - 它永远不会打破我. 我在2005年为一家公司工作,其中C++被避免使用C.(因为默认的发行版有一个破解版的GCC,显然最好花费额外的人数来使用C比升级它更好编译器.) 事实上,我非常希望为一家避开OO的公司工作,只是为了与OO狂热者(那个想起这个线程中提到的其他一些愚蠢标准的人)一起休息. 45> moffdub..: 没有人提到的是被迫为无脑吸气剂和制定者的类编写单元测试.
在这种情况下,给自己写一个脚本"生成Getter-和SetterTests". 他们需要进行测试.我被前面的一个错误所驱动 - 答案结果是在运行时库中,这是一个代表一个安装程序的代码.要复合它,调试器中有一个错误(续) 46> 小智..: 在Java中,当签约处于无名状态时,接口 被禁止.逻辑?负责人无法找到Eclipse的实现类......
也被禁止 - 匿名内部阶级,理由是负责人不知道他们是什么.这使得实现Swing GUI各种乐趣.
我觉得你很糟糕. 47> David..: 得到我的那个与SQL表名的另一个海报的"tbl"前缀类似.
在这种情况下,所有存储过程的前缀都是"sp_",尽管"sp_"是Microsoft用于SQL Server中系统级存储过程的前缀.好吧,他们的标准来自旧的非MS数据库并且不会因为他们的标准可能导致存储过程与系统存储过程冲突而产生不可预测的结果而改变.不,那就是不合适.
48> Giovanni Gal..: 有人告诉我,旧代码应该被注释掉而不是被删除; 如果我们需要引用旧代码(是的,代码在源代码控制中......).在做出重大改变之前,这似乎并不那么糟糕.然后它变成了一场噩梦,整个部分都删除了整个代码.
49> user17601..: 我曾经不得不拼出所有的首字母缩写词,甚至是行业标准的缩写词,比如OpenGL.诸如glu之类的变量名称并不好,但我们必须使用graphicsLibraryUtility.
我希望你没有使用GNU ="GNU is Not Unix"中的任何软件. 50> jammycakes..: 我曾经在VB.NET项目上工作,其中每个方法体都包含在以下Try...Catch
块中:
Public Sub MyMethod()
Try
' Whatever
Catch Ex As Exception
Throw New Exception("MyClass::MyMethod::" + Ex.ToString())
End Try
End Sub
那些不理解的Exception.StackTrace
人注定要彻底改造它.
51> Eder Gusatto..: 一旦我不得不从我的团队中做一个小DLL,当它完成后,我不得不重做这份工作,因为我不应该在代码中使用"else".当我问为什么我被指示不要问为什么,但是另一支队伍的领导者"没有得到别的东西".
没有得到别的东西......?这家伙怎么雇了? 52> 小智..: 在Java中,我目前不鼓励在测试中使用布尔函数作为谓词:
if( list.isEmpty() )...
必须改写
if( list.isEmpty() == true )...
和
if( !list.isEmpty() )...
必须改写
if( list.isEmpty() == false )...
因为"它更清晰".
对我来说,"list.isEmpty()== true"有两个动词,"是"和"等于",在一个没有连词的短语中.我感觉不对劲.
甚至"更清晰"也是`if((list.isEmpty()== false)== true)...` 嗯,对,"更清楚".+一个`如果列表是空的'*是*清除比'如果'列表是空的"是真的`. 53> Igal Tabachn..: 我在一个编码标准是一个巨大的WTF的地方工作:奇怪的匈牙利符号,用'g'加上全局的前缀和'm'的成员(所以有像gsSomeVariable这样的宝石),为每个函数添加'ref string sError',而不是抛出异常(这是一个非诺!).
但是,杀手的前缀是函数参数,输入参数为I_,输出参数为O_.
我现在在一个更好的地方工作:)
使用'g'前缀全局变量比在每个函数中添加"here be dragons"注释更简单. g_表示全局变量,p_表示参数,l_表示局部变量,cp_表示游标参数...我在PL/SQL编程中使用过它.我不认为这很糟糕. 不知道你的平台,但这种东西是典型的VB6.也许,如果你不是在VB6中,制定规则的人来自那个背景,并希望它符合他以前的习惯.vb6也错了,但你知道...... 我真的很喜欢g和m前缀...我和O看起来有点奇怪...... 我认为g和m是很好的前缀,因为:Globals :: variableName令人讨厌(并且永远不会使用C++全局范围)而且this-> variableName也更难输入(比较this-> okButton和成员中的mOkButton功能.哪种更容易输入?) 54> Tim..: 没有单个字符变量名 - 即使对于像i这样的简单迭代器也是如此.不得不使用ii或其他东西.我觉得这很愚蠢.
另一个 - 也许是最疯狂的,但可能不是编码标准......
没有STL允许.这是在2007/2008.在我发现那些废话后我很快离开了那里.显然有些白痴认为没有"标准"(如15年前......)我猜他们错过了关于stl在C++标准中的备忘录......
使用愚蠢的COM HRESULT作为几乎所有方法的返回类型 - 即使它们不是COM.真是荒唐可笑.所以现在我们不得不返回一些枚举类型或指示结果的有用值,等等,我们必须查找S_OK或E_FAIL或者每个方法的上下文中的含义.我再次离开那里不久.
55> 小智..: 插入换行符
(// -------------------------------------------- ------------------------------------)
ac #project中的方法之间.
56> Christopher ..: 被迫在方法结束时只有1个return语句,并使代码落到那个位置.
也无法在交换机中重复使用case语句并让它掉线; 我不得不写一个复杂的脚本,它做了一个开关循环,以正确的顺序处理这两种情况.
最后,当我开始使用C时,我发现在方法的顶部声明我的变量非常奇怪并且绝对讨厌它.我在C++中度过了好几年,只是在我想要的地方宣布它们; 除非出于优化原因,我现在在方法的顶部声明所有方法变量,并详细说明它们的所有功能 - 使维护变得更容易.
57> Mark Thistle..: 在每个方法的末尾添加80个字符的注释,以便很容易找到方法的结尾.像这样:
void doSomething()
{
}
//----------------------------------------------------------------------------
理由是:
有些用户不使用具有代码折叠的IDE(好的我会给他们的).
方法之间的空间不明确,因为人们可能不遵循关于缩进和支撑放置的其他编码标准,因此很难找到函数的结束.(不是后续的;如果你需要添加这个,因为人们不遵循你的编码标准那么为什么他们应该遵循这个?)
+1的理由的第二部分. 58> Matt Gibson..: 当我使用对表名长度有如此大限制的SQL Server时,我从未亲自碰到它们,我们被迫使用旧版主机系统的命名约定,即使新系统从未与大型机数据库交互.
由于表名的限制很小,惯例是给所有表提供代号,而不是有意义的描述.
因此,在一个非常愉快地拥有名为"ThisIsTheCustomerTable"的"客户"表的系统上,相反它被称为"TBRC03AA".下一个表称为"TBRC03AB",下一个称为"TBRC03AC",依此类推.
这使得SQL 非常 容易理解,尤其是在你编写它之后的一个月.
59> Ralph M. Ric..: 在德尔福, 我们不得不改变
if something then
begin
...
end
else
begin
...
end;
至
if something then begin
...
end else begin
...
end;
在一个拥有150万行代码的项目中.想象一下,这在源代码控制,差异和合并方面有多么简单!当编译器宣布一个超级终结时,它也导致忘记开始并且没有立即注意到它.
60> 小智..: 我们必须在每个sql语句上面添加注释.所以,你可能有一个sql语句
选择USER_ID FROM USERS WHERE NAME =:NAME;
你还需要在它上面发表一条评论说:
从USERS表中选择USER_ID,其中name等于输入的名称.
现在,当实际评论比代码长,并且代码很简单,二年级学生阅读时,我真的没有看到评论点...但是,唉,我不得不回去添加对这些陈述的评论.
这是在一个大型机上,用cobol编码.团队规模通常约为4或5,但这条规则不时会在这里咬人.
61> DarthNoodles..: 我遇到的最糟糕的事情是与代码检查有关.出于某种原因,即使我们使用了我们的vcs的diff工具来查看更改的内容,当您希望检查代码时,您必须在文件/函数中包含一些注释块,如下所示:
/*********...80charswide...***
* START INSPECT
*/
some changed code...
/*
* END INSPECT
*********...80charswide...****/
在检查之后,您必须返回并在提交之前删除所有这些注释块.啊.
62> 小智..: 与我在这里看到的一些令人发指的东西相比,我的编码标准让人感到非常温顺,但是这里有:
我参与了一个项目,其中一些开发人员坚持我见过的最特殊的缩进形式:
if (condition)
{
x++;
printf("Hello condition!\n");
}
else
{
y++;
}
我们正在开发一个具有非常糟糕的调试器的嵌入式环境.实际上,printf(),hexdump()和mapfile是首选的调试方法.这当然意味着static
禁止使用,所有全局变量和函数都必须具有这种形式modulename_variablename
.
禁止使用警告检入代码(不是那么糟糕),但编译器会警告任何不变的条件.因此,do { something(); } while(0)
禁止使用旧的宏/语句技巧.
最后,在枚举器列表或初始化程序上留下一个尾随逗号被认为是懒惰的,因此被禁止:
enum debuglevel
{
NONE,
FATAL,
WARNING,
VERBOSE, // Naughty, naughty!
};
正如我所说,相当温顺.但作为"C程序员的十条诫命"的追随者,我发现非常规的支撑风格绝对令人抓狂.
那种支撑风格是*疯狂*.如果你在`{\n`营地(我)或'\n {`营地,我不在乎,这是一个很好的妥协,每个人都肯定会讨厌. 63> 小智..: 我工作的最后一个地方主要是一个C++商店,在我被聘用之前,我的老板(他是研究和开发总监)发布了一项法令,"不允许动态内存分配".没有"新",甚至不是"malloc" - 因为"如果开发人员忘记了相应的删除/免费操作,那些会导致内存泄漏".作为这一特定规则的必然结果,"指针也是不被允许的"(尽管参考文献 完全可以接受,既令人敬畏又安全).
我废除了这些规则(相反,比如说,用其他语言重写我们所有的软件)但我确实必须添加一些我自己的一些很棒的规则,例如"未经有资格做的人的书面批准,你可能不会启动新的线程那种事情"基于一系列不幸的代码评论(叹息).
64> 小智..: 由于我一直在为自雇人士/自由职业者/项目负责人工作,我从未达到某人的标准,所有标准都是我的决定.但是,我最近在15岁时发现了一段有趣的"编码标准文件":
所有函数都必须命名为"ProjectName_FunctionName" .
那么,程序化PHP,任何人?那些还不是PHP OOP的时候,但仍然存在.如果我想使用从一个项目到另一个项目的代码,我将不得不重写所有引用,等等.
我可以使用类似"package_FunctionName"的东西.
65> RobS..: 也许我遇到的更令人沮丧的情况之一就是人们坚持使用前缀"sp_"为存储过程添加前缀.
如果您不知道为什么这是一件坏事,请查看此博客条目!
简而言之,如果SQL Server正在查找带有sp_前缀的存储过程,它将首先检查master数据库(除非SP实际位于master数据库中,否则它将无法找到).假设它不在主数据库中,SQL Server假定SP不在缓存中,因此重新编译它.
这可能听起来像一个小东西,但它在大容量或繁忙的数据库服务器环境中累积!
66> 小智..: 在我公司的一个大型团队中,我们几乎只使用C++.禁止通过非const引用.
如果要将参数修改为函数,则必须通过指针传递它.
我们对专业人员进行内部火焰战(更容易识别可以修改变量的函数调用)和缺点(荒谬;当你需要一个参数时必须处理可能的NULL指针)大约每年一次.
67> Malfist..: 当有人不使用命名约定时,我绝对讨厌它.在我工作的地方,首席开发人员(我替换了他)无法弄清楚他是否想要使用camelCase或way_over_used_underscores.就个人而言,我讨厌下划线,骆驼的情况更容易阅读,但只要你遵守一个标准就没关系.
PHP在这方面特别糟糕,看看mysql_numrows,它合并了两个没有大写字母的两个.
68> MetaGuru..: SCORM肯定.(http://en.wikipedia.org/wiki/SCORM)
69> 小智..: 这不是编码标准问题,但肯定是限制性思维的故事.我们在不少于7周的时间内完成了为期4周的短期项目.时间表基于对特征列表的估计.开发过程包括疯狂编码.在死后我建议使用里程碑并将功能请求分解为任务.令人难以置信的是,我的导演驳回了我的想法,说因为这是一个如此短的项目,我们不需要使用里程碑或任务,并要求其他建议.房间沉默了.
语言:Java,C++,HTML团队规模:两个团队,共计10名工程师,这给你和你的团队带来了不良影响:我觉得我被Dilbert卡通片所吸引.
70> SeanJA..: 使用_标记私有变量只是为了确保我们知道我们正在处理类中的私有变量.然后使用php的魔术方法__get和__set来提供对每个变量的访问,就好像它们是公共的一样......
71> corydoras..: 我们的Oracle DBA坚持我们将模式名称添加到表名称之前,即如果您的模式是hr_admin
,那么您的员工表将是hr_admin_staff
,这意味着跨模式查询中的表的全名将是hr_admin.hr_admin_staff
.
考虑到Oracle中表名的最大长度仅为32个字符,这是一个可怕的约定. 72> Jules..: 我的第一个编程工作是使用Microsoft QuickBASIC 4.5商店.首席开发人员几乎一直在BASIC工作,所以QuickBASIC的大多数高级(!)功能都是禁止的,因为它们是新的,他不理解它们.所以:
没有子/结束子程序.一切都是用GOSUB完成的
我们被允许不编号不是GOTO或GOSUB目标的行.但GOTO目标必须是数字标签,而不是名称.
允许命名GOSUB的目标,但名称必须以'S'和四位数字为前缀.所有子程序都必须在源文件中按顺序排序四位数.因此典型的例程可能是S1135InitializePrinter.你必须去寻找合适的例程才能得到这个数字,有足够的东西让你无法记住它们.
没有阻止IF/END IF.所有IF都必须有单个GOTO或GOSUB作为条件语句.
那是一项非常有趣的工作.不,真的.
在一个理想的世界里,他们可能不应该让那些极度恐惧变革的人进入软件领域,我的意思是他们自己的理智.
推荐阅读
如何解决《UILabel垂直对齐》经验,为你挑选了0个好方法。 ...
[详细]
如何解决《PythonAnywhere:尝试使用easygui模块时出现Tkinter.py错误》经验,为你挑选了1个好方法。 ...
[详细]
如何解决《vba,getElementsByClassName,HTMLSource的双引号都消失了》经验,为你挑选了1个好方法。 ...
[详细]
如何解决《从objectId数组中删除ObjectId》经验,为你挑选了0个好方法。 ...
[详细]
如何解决《Javascript循环索引问题》经验,为你挑选了0个好方法。 ...
[详细]
如何解决《如何计算单个字母的出现次数》经验,为你挑选了1个好方法。 ...
[详细]
如何解决《返回自己的自定义OrderedDict》经验,为你挑选了1个好方法。 ...
[详细]
如何解决《将ISO639-1转换为ISO639-2》经验,为你挑选了1个好方法。 ...
[详细]
如何解决《如何缓存读取?》经验,为你挑选了1个好方法。 ...
[详细]
如何解决《你能根据`Monads`来定义`Comonads`吗?》经验,为你挑选了0个好方法。 ...
[详细]
如何解决《Apple推送通知无法在生产中使用》经验,为你挑选了0个好方法。 ...
[详细]
如何解决《拖放(事件)不会触发ajaxPOST》经验,为你挑选了1个好方法。 ...
[详细]
如何解决《使用OpenCV在棋盘中检测中国象棋棋子》经验,为你挑选了1个好方法。 ...
[详细]
如何解决《如何访问ListBox中所选项的属性并将其粘贴到TextBox中》经验,为你挑选了1个好方法。 ...
[详细]
如何解决《Python正则表达式在内部找到并替换》经验,为你挑选了1个好方法。 ...
[详细]
如何解决《通过PInvoke"HelloWorld"》经验,为你挑选了1个好方法。 ...
[详细]
如何解决《美丽的汤元内容标记》经验,为你挑选了1个好方法。 ...
[详细]
如何解决《随机分类的数字到变量》经验,为你挑选了1个好方法。 ...
[详细]
如何解决《iOS9自定义转换-未调用animationControllerForDismissedController》经验,为你挑选了1个好方法。 ...
[详细]
如何解决《将JSON反序列化为对象C#》经验,为你挑选了1个好方法。 ...
[详细]
mobiledu2402851203
这个屌丝很懒,什么也没留下!