当我问这个问题时,我几乎总是肯定是的,你应该有编码标准.
您曾被迫遵循的最奇怪的编码标准规则是什么?
而最奇怪的是,我的意思是最有趣,或者最糟糕,或者只是简单的奇怪.
在每个答案中,请提及哪种语言,您的团队规模,以及它对您和您的团队造成的影响.
Sim*_*son 434
当禁止使用多个退货时,我讨厌它.
小智 333
反向缩进.例如:
for(int i = 0; i < 10; i++)
{
myFunc();
}
Run Code Online (Sandbox Code Playgroud)
和:
if(something)
{
// do A
}
else
{
// do B
}
Run Code Online (Sandbox Code Playgroud)
Gal*_*ian 326
也许不是你会得到的最古怪的一个,但我真的很讨厌我必须在'tbl'前面添加数据库表名
Too*_*the 248
几乎任何一种匈牙利符号.
匈牙利符号的问题在于它经常被误解.最初的想法是为变量添加前缀,使其含义清晰.例如:
int appCount = 0; // Number of apples.
int pearCount = 0; // Number of pears.
Run Code Online (Sandbox Code Playgroud)
但大多数人用它来确定类型.
int iAppleCount = 0; // Number of apples.
int iPearCount = 0; // Number of pears.
Run Code Online (Sandbox Code Playgroud)
这很令人困惑,因为尽管这两个数字都是整数,但每个人都知道,你无法将苹果与梨进行比较.
Jar*_*yer 240
我目前工作的地方没有三元运营商:
int value = (a < b) ? a : b;
Run Code Online (Sandbox Code Playgroud)
...因为不是每个人都"得到它".如果你告诉我,"不要使用它,因为当结构太复杂时我们不得不重写它们"(嵌套的三元运算符,任何人?),然后我就明白了.但是,当你告诉我一些开发人员不理解他们......嗯......当然.
Geo*_*rge 239
在进行更改时永远不要删除任何代码.我们被告知要评论所有变化.请记住,我们使用源代码控制.这项政策并没有持续很长时间,因为开发人员对此哗然,以及如何使代码难以理解.
pae*_*bal 204
我曾经在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的信誉从来没有受到过这样的影响:在高层管理人员中,他仍然是"顶级枪支"技术专家......
这会产生一些有趣的副作用,你可以通过以下链接看到你遇到的源代码中最好的评论是什么?
Dav*_*rno 131
早在80年代/ 90年代,我就在一家使用FORTRAN的飞机模拟器公司工作.我们的FORTRAN编译器对变量名的限制为8个字符.该公司的编码标准保留了前三个用于匈牙利语符号样式信息.所以我们不得不尝试用5个字符创建有意义的变量名!
Mic*_*ter 107
我在一家有两家公司合并的地方工作过."主导"的服务器有一个用K&R C编写的主服务器(即ANSI之前).他们强迫Java团队(来自两个办公室 - 可能总共20个开发者)使用这种格式,这种格式令人兴奋地忽略了"大括号辩论"的两大支柱并直接疯狂:
if ( x == y )
{
System.out.println("this is painful");
x = 0;
y++;
}
Run Code Online (Sandbox Code Playgroud)
bh2*_*213 104
禁止:
while (true) {
Run Code Online (Sandbox Code Playgroud)
允许:
for (;;) {
Run Code Online (Sandbox Code Playgroud)
Ste*_*owe 101
我的一个朋友-我们叫他CodeMonkey -得到了他的第一份工作的大学[ 很多年前在COBOL做内部开发.他的第一个程序被拒绝为"不遵守我们的标准",因为它使用了...... [shudder!]嵌套的IF语句
编码标准禁止使用嵌套的IF语句
现在,CodeMonkey并不害羞,并且确定了自己的能力,所以他坚持要求所有人都在链条上,并在过道上为什么存在这条规则.大多数人声称他们不知道,有些人编写了关于"可读性"的内容,最后有一个人记住了原因:他们使用的第一个版本的COBOL编译器有一个错误,并没有正确处理嵌套的IF语句.
当然,这个编译器错误已经修复了至少十年,但没有人质疑标准.[咩咩咩!]
CodeMonkey成功地改变了标准 - 最终!
Zom*_*eep 97
曾经在一个禁止下划线的项目上工作过.我的意思是完全被禁止.所以在ac#winforms应用程序中,每当我们添加一个新的事件处理程序时(例如对于一个按钮),我们必须将默认方法名称从buttonName_Click()重命名为其他东西,只是为了满足写入编码的人的自我标准.直到今天,我不知道他对这个卑微的下划线有什么看法
Kri*_*nck 92
完全没用的数据库命名约定.每个表名都必须以数字开头.数字显示表中的数据类型.
如果您只知道其名称的第一个字母,则很难找到表格.另外 - 因为这是一个mssql数据库 - 我们必须在任何地方用方括号括起表名.
-- doesn't work
select * from 0examples;
-- does work
select * from [0examples];
Run Code Online (Sandbox Code Playgroud)
bil*_*mcc 90
我们正在做一个C++项目,团队领导是Pascal人.
所以我们有一个编码标准包含文件来重新定义所有那些讨厌的C和C++语法:
#define BEGIN {
#define END }
Run Code Online (Sandbox Code Playgroud)
但等等还有更多!
#define ENDIF }
#define CASE switch
Run Code Online (Sandbox Code Playgroud)
等一切都很难记住.
这需要完全可读的C++代码,并使除了团队领导之外的任何人都难以理解.
我们还必须使用反匈牙利表示法,即
MyClass *class_pt // pt = pointer to type
UINT32 maxHops_u // u = uint32
Run Code Online (Sandbox Code Playgroud)
虽然奇怪的是我渐渐喜欢上了这个.
Jer*_*ine 88
在以前的工作:
恩,那就对了.每个表中的所有字段.这样我们就可以说它是一个领域.
Jar*_*Par 84
我的一个伙伴在政府工作期间遇到这个规则.++(前或后)的使用被完全禁止.原因:不同的编译器可能会以不同的方式解释它.
Tim*_*her 81
半数球队赞成四空缩进; 另一半赞成两空缩进.
正如你可以猜到的那样,编码标准规定了三个,以便"同样得罪"(直接引用).
lep*_*pie 74
由于经理声称它涉及太多"魔法",因此无法使用反射.
Ovi*_*vid 71
我所拥有的最奇怪的一个,以及花了我一段时间推翻的一个,就是我们公司的老板要求我们的新产品只是IE浏览器.如果它可以在FireFox上运行,那很好,但它必须只是IE浏览器.
这可能听起来不太奇怪,除了一个小瑕疵.所有的软件都是用于在Linux上运行的定制服务器软件包,而我们客户购买的所有客户端盒都是Linux.没有试图弄清楚如何让Wine(在那些日子里,非常不可靠)在所有这些盒子上运行并看看我们是否可以让IE运行并培训他们的管理员如何调试Wine问题,这根本不可能满足业主的要求.问题是他正在进行网页设计而根本不知道如何使网站符合FireFox.
要知道我们公司破产了,你可能不会感到震惊.
Dan*_*ski 54
在我目前的工作中,我们有两个真正意义上的规则:
规则1:每次我们在数据库表中创建一个新字段时,我们都必须添加其他保留字段以供将来使用.这些保留字段已编号(因为没有人知道它们将在某一天保存哪些数据)下次我们需要新字段时,我们首先查找未使用的保留字段.
因此,我们最终会customer.reserve_field_14包含客户的电子邮件地址.
有一天,我们的老板考虑引入储备桌,但幸运的是我们可以说服他不要这样做.
规则2:我们的一个产品是用VB6编写的,VB6有不同标识符名称的总数限制,因为代码非常大,我们经常遇到这个限制.作为"解决方案",所有本地变量名都被编号:
Lvarlong1Lvarlong2Lvarstr1 虽然这有效地规避了标识符限制,但这两个规则的结合导致了如下的漂亮代码:
Run Code Online (Sandbox Code Playgroud)... 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
Run Code Online (Sandbox Code Playgroud)
编辑:似乎这种代码模式正变得越来越流行.查看每日WTF帖子了解更多:散光 :)
Ada*_*han 53
回到我的C++时代,我们不允许使用==,> =,<=,&&等等.这里有宏...
if (bob EQ 7 AND alice LEQ 10)
{
// blah
}
Run Code Online (Sandbox Code Playgroud)
这显然是为了处理"条件错误中的旧意外分配",但我们也有规则"将常量放在变量之前",所以
if (NULL EQ ptr); //ok
if (ptr EQ NULL); //not ok
Run Code Online (Sandbox Code Playgroud)
记住,我听过的最简单的编码标准是"编写代码就好像下一个维护者是一个知道你住在哪里的恶毒的精神病患者".
vfi*_*lby 45
一般的匈牙利表示法.
T.E*_*.D. 43
我有很多愚蠢的规则,但不是很多,我认为是彻头彻尾的怪.
最愚蠢的是我在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;
Run Code Online (Sandbox Code Playgroud)
幸运的是,他们至少开悟了足以让我们超过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
Run Code Online (Sandbox Code Playgroud)
我们中间更有创造力的是尝试使用疣来制作一个合理的(或愚蠢的)包名.(我知道你在想什么,但不允许对你进行探索和羞辱!这真令人恶心).例如,我在C ommon代码组中,我需要创建一个与W orkstation组接口的包.在与Workstation人进行头脑风暴会议之后,我们决定为我们的软件包命名,以便需要两者的人必须写:
with CANT_Interface_Package;
with WONT_Interface_Package;
Run Code Online (Sandbox Code Playgroud)
Avi*_*ion 41
当我开始在一个地方工作,并开始将我的代码输入源代码管理器时,我的老板突然向我走来,并要求我停止这么做.他告诉我,不鼓励每天为开发人员做超过1次提交,因为它会占用源控件.我只是盯着他......
后来我明白了他甚至向我提出这个问题的原因是因为SVN服务器会向他(以及另外10位高管)发送一封邮件给每个人做出的提交.通过乱扔垃圾源控制器,我猜他是他的邮箱.
azk*_*oki 34
通过Sql Server 2000中的存储过程执行所有数据库查询.从复杂的多表查询到简单的查询:
select id, name from people
赞成程序的论据是:
我知道程序主题很有争议,所以请随意给我的答案评分;)
Nat*_*Nat 30
我们必须按字母顺序对类中的所有函数进行排序,以使它们"更容易找到".没关系,ide有一个下降.这点击太多了.
(同样的技术主管编写了一个应用程序来删除源代码中的所有注释).
Rob*_*ney 29
在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
Run Code Online (Sandbox Code Playgroud)
(实际上,20年后我终于忘记了R/Basic的行继续语法,所以它看起来可能有所不同.但是你明白了.)
此外,每当您必须插入多行注释时,规则是您使用花箱:
************************************************************************
** IN CASE YOU NEVER HEARD OF ONE, OR COULDN'T GUESS FROM ITS NAME, **
** THIS IS A FLOWER BOX. **
************************************************************************
Run Code Online (Sandbox Code Playgroud)
是的,需要在每一行上关闭星号.毕竟,如果您使用他的编辑器,那么插入一个花箱只是一个简单的编辑器命令.
让他放松并让我使用Revelation的内置编辑器是一场相当大的战斗.起初他坚持,只因为那些是规则.当我反对a)我已经知道启示录编辑b)它比他的编辑更有功能,c)其他启示录开发者会有相同的观点,他反驳说,如果我没有在他的编辑上训练,我就不会能够在Prime代码库上工作,正如我们都知道的那样,只要地狱一直没有解冻,它就不会发生.最后他放弃了.
但编码标准是最后的.特别是花箱的评论是一种愚蠢的浪费时间,他在我们身上煞费苦心地说,如果我只是使用合适的编辑器来维护它们就会非常容易.(整个事情变得非常被动 - 具有侵略性.)最后我悄悄地放弃了,从那时起,我带到代码评论的所有代码都有他珍贵的花箱评论.
有一天,几个月的工作,当我几乎证明自己胜过自己(特别是与我在那里工作时经过那个办公室的其他编码员的非凡游行相比),他看着我的肩膀,因为我工作,他注意到我没有使用花箱评论.哦,我说,我写了一个源代码格式化程序,当我打印出来时,它会将我的评论转换成你的风格.它比在编辑器中维护它们更容易.他张开嘴,想了一会儿,关上了,走开了,我们再也没有谈过编码标准.之后我们的工作变得更容易了.
abe*_*ger 26
在我的第一份工作中,所有C程序,无论多么简单或复杂,只有四个功能.你有main,它依次调用其他三个函数.我不记得他们的名字,但他们是begin(),middle()和end()的东西.begin()打开文件和数据库连接,end()关闭它们,而middle()完成其他所有操作.不用说,middle()是一个很长的功能.
只是为了让事情变得更好,所有变量都必须是全局变量.
我对这项工作最骄傲的回忆之一就是导致这些标准遭到破坏的一般反抗的一部分.
sor*_*oru 26
外部编写的C编码标准,其规则"不依赖于内置运算符优先级,始终使用括号"
很公平,明显的意图是禁止:
a = 3 + 6 * 2;
Run Code Online (Sandbox Code Playgroud)
支持:
a = 3 + (6 * 2);
Run Code Online (Sandbox Code Playgroud)
事实上,这是由遵循C语法规则的工具强制执行的'=','==','.' 和数组访问是运算符.所以代码如下:
a[i].x += b[i].y + d - 7;
Run Code Online (Sandbox Code Playgroud)
不得不写成:
((a[i]).x) += (((b[i]).y + d) - 7);
Run Code Online (Sandbox Code Playgroud)
Joh*_*udy 25
几年前,我最奇怪的是合同.@ 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
Run Code Online (Sandbox Code Playgroud)
也就是说,最初感觉很奇怪......它在我身上发展.它背后的原因是有意义的(在你围绕它的大脑后),因为前缀是建立连接时提醒"推荐"(和强制!)表别名.前缀使得大多数连接查询更容易编写,因为您必须在字段之前显式引用表是非常罕见的.
哎呀,过了一会儿,团队中的所有人(我们项目中的6个人)都能够通过前缀开始引用对话中的表格.一种后天的味道,可以肯定......但是我的成长.当我拥有那种自由时,我仍然使用它.
Bin*_*ier 22
2002年至2004年,几家WTF在一家VB6商店(我并不自豪,我很饿,需要吃饭).
最烦人的恕我直言,在子/函数的末尾设置所有对象引用.这是为了"帮助"编译器引用计数.无论我为TA做了多少次测试来证明它没有必要,哦,不,它仍然必须完成,尽管他绝对没有任何证据可以支持他.最终我放弃了大约一年后发现了一篇解释为什么它是裤子的文章.我把它带到了TA的想法"得到了笨蛋!".他说:"是的,我已经知道了多年,但如果你开始改变标准羊"意味着其他开发人员,他每天工作的人"将搞砸".Gob sh1te.
其他人在同一家商店.
大多数情况下,我在那里编写c ++(只有c ++开发人员,因此制定了自己的标准,并严格执行!)偶尔使用vb,否则我就不会持续.
Cor*_*Foy 20
每个开始和结束括号都需要有一个评论:
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插件以实现自动化的原因.
Dan*_*rza 14
哇 - 这带回了我工作的一个特定地方的许多回忆:亚利桑那州交通部.
那里有一个项目经理不理解基于对象的编程(并且不想理解它). 她确信基于对象的编程是一种时尚,并且拒绝让任何人使用任何类型的基于对象的编程的签入代码.
(说真的 - 她实际上花了很多时间审查我们已经签入Visual SourceSafe的代码,以确保我们没有违反规则).
考虑到Visual Basic 4刚刚发布(这是大约12年前),并且考虑到Windows表单应用程序,我们在VB4中使用对象来描述表单,这使得开发......变得复杂.
我的一个伙伴实际上试图通过将他的"目标代码"封装在虚拟"形式"中来解决这个问题,她最终发现他只是(*喘气*)隐藏他的对象!
毋庸置疑,我只在那里待了大约3个月.
天哪,我不喜欢那个女人的想法.
Rob*_*ett 13
让我疯狂的是人们用表格的名称后缀表格的ID字段.只是身份证到底有什么问题?无论如何,你将不得不别名它...为了所有神圣的爱!
想象一下,当您拥有名为IDSEWEBLASTCUSTOMERACTION和IDSEEVENTLOGGER的id字段时,您的SQL语句会是什么样子.
Mes*_*esh 11
我看到的最奇怪的是数据库表命名,其中表格以功能区域的TLA开头,例如,计算ACC然后是3位数字(覆盖默认排序),然后是表格名称.
此外,这也被扩展到列名称中.
ACC100_AccountCode
读取查询是一场噩梦,它们是如此难以理解.
its*_*att 11
将s_应用于对于作为控制系统一部分的软件而言被视为"安全关键"的变量和方法.再加上关于将m_放在成员变量前面的另一个规则,你会得到像"s_m_blah()"这样荒谬的东西,这在我看来写起来很烦人,而且不太可读.最后,一些"安全专家"应该通过查看代码并通过使用那些"s_"来确定其中的某些东西来获得洞察力 - 在实践中,他们不太了解c ++,所以他们除了报告我们标记为"安全关键"的标识符数量.完全没废话......
Tim*_*art 11
团队规模大约是十几人.对于C#方法,我们必须在每个函数之前放置一个巨大的XML格式函数.我不完全记得格式,但它涉及嵌套大约三到五级深度的XML标签.这是评论记忆中的草图.
/// <comment>
/// </comment>
/// <table>
/// <thead>
/// <tcolumns>
/// <column>Date</column>
/// <column>Modified By</column>
/// <column>Comment</column>
/// </tcolumns>
/// </thead>
/// <rows>
/// <row>
/// <column>10/10/2006</column>
/// <column>Fred</column>
/// <column>Created function</column>
/// </row>
/// </rows>
/// <parameters>
Run Code Online (Sandbox Code Playgroud)
我必须停在那里......
缺点很多.
我使用代码片段(Emacs YAS)将此代码添加到我的方法中.
Nee*_*ack 11
(可能只在英国有趣)
我工作过的一家保险公司想要一个组合"P"或"L"来表示范围,与所有属性的匈牙利人联系起来.
加分点是我们有一个名为pintMaster的属性!让我们都喜欢喝一杯.
Bub*_*baT 10
这是一个我没有遵循的编码标准(为其他事情遇到麻烦,但从来没有这样做).我们有三个19"显示器,所以我们可以让两个编辑器打开全屏,仍然可以访问桌面.其他人都没有使用评论,但使用了有意义的名字.非常长的有意义的名字.我记得最长的是在80性格范围.平均值在40~50左右.
猜猜是什么,他们没有准确地描述整个事情.
kem*_*002 10
如果我没记错的话,delphi IDE会默认缩进两个空格.该公司的大部分遗留代码都有三个空间,由VP IT和CEO编写.有一天,所有的程序员都在谈论我们应该做些什么来让我们的生活变得更轻松,一个知道Delphi的承包商说得很好,"嘿,ide默认为两个空格,任何人都有问题我们这样做新的代码?" 我们所有人都看着对方,几乎以为这是一个没脑子的人说我们同意了.
两天后,副总裁和首席执行官发现我们将做出如此危险的变化,这可能会"引发问题"并告诉我们,我们将对所有事情使用三个缩进,直到他们两个能够准确评估这种变化的影响.现在我完全遵循标准,但是这些人认为oo编程创建了一个具有一个函数的对象,该函数具有执行操作所需的所有逻辑,并且源代码控制将代码文件移动到另一个目录.
Ric*_*ett 10
不是一个编码标准,但在1998年,我在一家禁止使用C++的公司工作,转而支持C.这是因为OO被认为过于复杂而无法让软件工程师掌握.
在我们的C代码中,我们需要在所有分号前加一个空格
int someInt = 5 ;
Run Code Online (Sandbox Code Playgroud)
我永远无法找到理由,但过了一段时间它确实在我身上发展.
没有人提到的是被迫为无脑吸气剂和制定者的类编写单元测试.
小智 9
在Java中,当签约处于无名状态时,接口被禁止.逻辑?负责人无法找到Eclipse的实现类......
也被禁止 - 匿名内部阶级,理由是负责人不知道他们是什么.这使得实现Swing GUI各种乐趣.
得到我的那个与SQL表名的另一个海报的"tbl"前缀类似.
在这种情况下,所有存储过程的前缀都是"sp_",尽管"sp_"是Microsoft用于SQL Server中系统级存储过程的前缀.好吧,他们的标准来自旧的非MS数据库并且不会因为他们的标准可能导致存储过程与系统存储过程冲突而产生不可预测的结果而改变.不,那就是不合适.
有人告诉我,旧代码应该被注释掉而不是被删除; 如果我们需要引用旧代码(是的,代码在源代码控制中......).在做出重大改变之前,这似乎并不那么糟糕.然后它变成了一场噩梦,整个部分都删除了整个代码.
我曾经不得不拼出所有的首字母缩写词,甚至是行业标准的缩写词,比如OpenGL.诸如glu之类的变量名称并不好,但我们必须使用graphicsLibraryUtility.
我曾经在VB.NET项目上工作,其中每个方法体都包含在以下Try...Catch块中:
Public Sub MyMethod()
Try
' Whatever
Catch Ex As Exception
Throw New Exception("MyClass::MyMethod::" + Ex.ToString())
End Try
End Sub
Run Code Online (Sandbox Code Playgroud)
那些不理解的Exception.StackTrace人注定要彻底改造它.
一旦我不得不从我的团队中做一个小DLL,当它完成后,我不得不重做这份工作,因为我不应该在代码中使用"else".当我问为什么我被指示不要问为什么,但是另一支队伍的领导者"没有得到别的东西".
小智 8
在Java中,我目前不鼓励在测试中使用布尔函数作为谓词:
if( list.isEmpty() )...
必须改写
if( list.isEmpty() == true )...
和
if( !list.isEmpty() )...
必须改写
if( list.isEmpty() == false )...
因为"它更清晰".
对我来说,"list.isEmpty()== true"有两个动词,"是"和"等于",在一个没有连词的短语中.我感觉不对劲.
我在一个编码标准是一个巨大的WTF的地方工作:奇怪的匈牙利符号,用'g'加上全局的前缀和'm'的成员(所以有像gsSomeVariable这样的宝石),为每个函数添加'ref string sError',而不是抛出异常(这是一个非诺!).
但是,杀手的前缀是函数参数,输入参数为I_,输出参数为O_.
我现在在一个更好的地方工作:)
没有单个字符变量名 - 即使对于像i这样的简单迭代器也是如此.不得不使用ii或其他东西.我觉得这很愚蠢.
另一个 - 也许是最疯狂的,但可能不是编码标准......
没有STL允许.这是在2007/2008.在我发现那些废话后我很快离开了那里.显然有些白痴认为没有"标准"(如15年前......)我猜他们错过了关于stl在C++标准中的备忘录......
使用愚蠢的COM HRESULT作为几乎所有方法的返回类型 - 即使它们不是COM.真是荒唐可笑.所以现在我们不得不返回一些枚举类型或指示结果的有用值,等等,我们必须查找S_OK或E_FAIL或者每个方法的上下文中的含义.我再次离开那里不久.
小智 7
插入换行符
(// -------------------------------------------- ------------------------------------)
ac #project中的方法之间.
被迫在方法结束时只有1个return语句,并使代码落到那个位置.
也无法在交换机中重复使用case语句并让它掉线; 我不得不写一个复杂的脚本,它做了一个开关循环,以正确的顺序处理这两种情况.
最后,当我开始使用C时,我发现在方法的顶部声明我的变量非常奇怪并且绝对讨厌它.我在C++中度过了好几年,只是在我想要的地方宣布它们; 除非出于优化原因,我现在在方法的顶部声明所有方法变量,并详细说明它们的所有功能 - 使维护变得更容易.
在每个方法的末尾添加80个字符的注释,以便很容易找到方法的结尾.像这样:
void doSomething()
{
}
//----------------------------------------------------------------------------
Run Code Online (Sandbox Code Playgroud)
理由是:
当我使用对表名长度有如此大限制的SQL Server时,我从未亲自碰到它们,我们被迫使用旧版主机系统的命名约定,即使新系统从未与大型机数据库交互.
由于表名的限制很小,惯例是给所有表提供代号,而不是有意义的描述.
因此,在一个非常愉快地拥有名为"ThisIsTheCustomerTable"的"客户"表的系统上,相反它被称为"TBRC03AA".下一个表称为"TBRC03AB",下一个称为"TBRC03AC",依此类推.
这使得SQL 非常容易理解,尤其是在你编写它之后的一个月.
在德尔福,我们不得不改变
if something then
begin
...
end
else
begin
...
end;
Run Code Online (Sandbox Code Playgroud)
至
if something then begin
...
end else begin
...
end;
Run Code Online (Sandbox Code Playgroud)
在一个拥有150万行代码的项目中.想象一下,这在源代码控制,差异和合并方面有多么简单!当编译器宣布一个超级终结时,它也导致忘记开始并且没有立即注意到它.
小智 6
我们必须在每个sql语句上面添加注释.所以,你可能有一个sql语句
选择USER_ID FROM USERS WHERE NAME =:NAME;
你还需要在它上面发表一条评论说:
从USERS表中选择USER_ID,其中name等于输入的名称.
现在,当实际评论比代码长,并且代码很简单,二年级学生阅读时,我真的没有看到评论点...但是,唉,我不得不回去添加对这些陈述的评论.
这是在一个大型机上,用cobol编码.团队规模通常约为4或5,但这条规则不时会在这里咬人.
我遇到的最糟糕的事情是与代码检查有关.出于某种原因,即使我们使用了我们的vcs的diff工具来查看更改的内容,当您希望检查代码时,您必须在文件/函数中包含一些注释块,如下所示:
/*********...80charswide...***
* START INSPECT
*/
some changed code...
/*
* END INSPECT
*********...80charswide...****/
Run Code Online (Sandbox Code Playgroud)
在检查之后,您必须返回并在提交之前删除所有这些注释块.啊.
小智 6
与我在这里看到的一些令人发指的东西相比,我的编码标准让人感到非常温顺,但是这里有:
我参与了一个项目,其中一些开发人员坚持我见过的最特殊的缩进形式:
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程序员的十条诫命"的追随者,我发现非常规的支撑风格绝对令人抓狂.
小智 6
我工作的最后一个地方主要是一个C++商店,在我被聘用之前,我的老板(他是研究和开发总监)发布了一项法令,"不允许动态内存分配".没有"新",甚至不是"malloc" - 因为"如果开发人员忘记了相应的删除/免费操作,那些会导致内存泄漏".作为这一特定规则的必然结果,"指针也是不被允许的"(尽管参考文献完全可以接受,既令人敬畏又安全).
我废除了这些规则(相反,比如说,用其他语言重写我们所有的软件)但我确实必须添加一些我自己的一些很棒的规则,例如"未经有资格做的人的书面批准,你可能不会启动新的线程那种事情"基于一系列不幸的代码评论(叹息).
小智 5
由于我一直在为自雇人士/自由职业者/项目负责人工作,我从未达到某人的标准,所有标准都是我的决定.但是,我最近在15岁时发现了一段有趣的"编码标准文件":
所有函数都必须命名为"ProjectName_FunctionName".
那么,程序化PHP,任何人?那些还不是PHP OOP的时候,但仍然存在.如果我想使用从一个项目到另一个项目的代码,我将不得不重写所有引用,等等.
我可以使用类似"package_FunctionName"的东西.
小智 5
在我公司的一个大型团队中,我们几乎只使用C++.禁止通过非const引用.
如果要将参数修改为函数,则必须通过指针传递它.
我们对专业人员进行内部火焰战(更容易识别可以修改变量的函数调用)和缺点(荒谬;当你需要一个参数时必须处理可能的NULL指针)大约每年一次.
当有人不使用命名约定时,我绝对讨厌它.在我工作的地方,首席开发人员(我替换了他)无法弄清楚他是否想要使用camelCase或way_over_used_underscores.就个人而言,我讨厌下划线,骆驼的情况更容易阅读,但只要你遵守一个标准就没关系.
PHP在这方面特别糟糕,看看mysql_numrows,它合并了两个没有大写字母的两个.
小智 5
这不是编码标准问题,但肯定是限制性思维的故事.我们在不少于7周的时间内完成了为期4周的短期项目.时间表基于对特征列表的估计.开发过程包括疯狂编码.在死后我建议使用里程碑并将功能请求分解为任务.令人难以置信的是,我的导演驳回了我的想法,说因为这是一个如此短的项目,我们不需要使用里程碑或任务,并要求其他建议.房间沉默了.
语言:Java,C++,HTML团队规模:两个团队,共计10名工程师,这给你和你的团队带来了不良影响:我觉得我被Dilbert卡通片所吸引.
我们的Oracle DBA坚持我们将模式名称添加到表名称之前,即如果您的模式是hr_admin,那么您的员工表将是hr_admin_staff,这意味着跨模式查询中的表的全名将是hr_admin.hr_admin_staff.
我的第一个编程工作是使用Microsoft QuickBASIC 4.5商店.首席开发人员几乎一直在BASIC工作,所以QuickBASIC的大多数高级(!)功能都是禁止的,因为它们是新的,他不理解它们.所以:
那是一项非常有趣的工作.不,真的.