当我问this question时,我几乎总是肯定是的,你应该有编码标准。
您曾被迫遵循的最奇怪的编码标准规则是什么?
最奇怪的是,我的意思是最有趣,或者最糟糕,或者只是奇怪的。
在每个答案中,请提及哪种语言,您的团队规模是什么,以及它对您和您的团队造成的影响。
答案 0 :(得分:435)
当禁止使用多个退货时,我讨厌。
答案 1 :(得分:333)
反向缩进。例如:
for(int i = 0; i < 10; i++)
{
myFunc();
}
和
if(something)
{
// do A
}
else
{
// do B
}
答案 2 :(得分:326)
也许不是你会得到的最古怪的一个,但我真的很讨厌我必须在'tbl'前面加上数据库表名
答案 3 :(得分:248)
几乎任何一种匈牙利符号。
匈牙利表示法的问题在于它经常被误解。最初的想法是为变量添加前缀,使其含义清晰。例如:
int appCount = 0; // Number of apples.
int pearCount = 0; // Number of pears.
但是大多数人用它来确定类型。
int iAppleCount = 0; // Number of apples.
int iPearCount = 0; // Number of pears.
这很令人困惑,因为虽然两个数字都是整数,但是大家都知道,你不能把苹果与梨进行比较。
答案 4 :(得分:240)
目前我工作的地方没有三元运营商:
int value = (a < b) ? a : b;
...因为不是每个人都“得到它”。如果你告诉我,“不要使用它,因为当结构太复杂时我们不得不重写它们”(嵌套的三元运算符,任何人?),然后我就明白了。但是当你告诉我一些开发人员不理解他们......嗯......当然。
答案 5 :(得分:239)
在进行更改时永远不要删除任何代码。我们被告知要评论所有变化。请记住,我们使用源代码控制。这项政策并没有持续很长时间,因为开发人员对此哗然,以及如何使代码难以理解。
答案 6 :(得分:204)
我曾经在 Mighty VB King 的暴政下工作过。
VB King 是MS Excel和VBA的纯粹主人,以及数据库(因此他的姓:他与Excel一起玩,而开发人员使用编译器,并挑战他数据库可能对你的职业生涯产生不利影响...... )。
当然,他的巨大的技能给了他一个独特的开发问题和项目管理解决方案的愿景:虽然不是最严格意义上的编码标准,但 VB King 经常对他尝试(并且经常成功)强加给我们的“编码标准”和“最佳实践”提出新的想法。例如:
所有C / C ++数组都应从索引1开始,而不是0.实际上,使用0作为数组的第一个索引已经过时,并且已经被Visual Basic 6的深刻数组索引管理所取代。 / p>
所有函数都应返回错误代码: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接口中的所有异常,并以静默方式处理它们(这样,而不是崩溃,模块看起来会更快......闪亮!...... As我们使用了上面描述的über错误处理,它甚至花了我们一些时间来了解真正发生的事情......你不能同时拥有速度和正确的结果,是吗?)。
从今天开始,我们的代码库将分为四个分支。我们将管理他们的同步并手动整合所有错误更正/演变。
除了 C / C ++数组, VB DOM实用程序函数和 XSL-T作为OOP语言之外。当然,随着时间的推移,一些人被发现, ahem ,破碎,完全被遗弃。
当然, VB King 的可信度从未因此而受到影响:在高层管理人员中,他仍然是“顶级枪支”技术专家......
这产生了一些有趣的副作用,您可以通过链接 What is the best comment in source code you have ever encountered?
答案 7 :(得分:131)
回到80年代/ 90年代,我在一家使用FORTRAN的飞机模拟器公司工作。我们的FORTRAN编译器对变量名的限制为8个字符。该公司的编码标准保留了前三个用于匈牙利语符号样式信息。所以我们不得不尝试用5个字符创建有意义的变量名称!
答案 8 :(得分:107)
我在一家两家公司合并的地方工作过。 “显性”的主服务器有一个用K&amp; R C编写的主服务器(即预ANSI)。他们强迫Java团队(来自两个办事处 - 可能总共20个开发者)使用这种格式,这种格式令人兴奋地忽略了“支持辩论”的两大支柱并直接疯狂:
if ( x == y )
{
System.out.println("this is painful");
x = 0;
y++;
}
答案 9 :(得分:104)
禁止:
while (true) {
允许:
for (;;) {
答案 10 :(得分:101)
我的一个朋友 - 我们称他为CodeMonkey--在大学之前[很多多年前]做了他的第一份工作,在COBOL进行内部开发。他的第一个程序被拒绝为“不符合我们的标准”,因为它使用了...... [不寒而栗!]嵌套的IF语句
编码标准禁止使用嵌套的IF语句
现在,CodeMonkey并不害羞并且确定了自己的能力,所以他坚持要求所有人都进入链条并沿着过道走下去。大多数人声称他们不知道,有些人编写了关于“可读性”的内容,最后有一个人记得原来的原因:他们使用的第一个版本的COBOL编译器有一个bug而且没有正确处理嵌套的IF语句。这个编译器错误当然已经修复了至少十年,但没有人挑战标准。 [BAAA!]
CodeMonkey成功地改变了标准 - 最终!
答案 11 :(得分:97)
曾在一个禁止下划线的项目上工作过。我的意思是完全被禁止。所以在ac#winforms应用程序中,每当我们添加一个新的事件处理程序(例如对于一个按钮)时,我们必须将默认方法名称从buttonName_Click()重命名为其他东西,只是为了满足编写代码的人的自我。标准。直到今天,我不知道他对这个卑微的下划线有什么看法
答案 12 :(得分:92)
完全没用的数据库命名约定。 每个表名都必须以数字开头。数字显示表中的数据类型。
如果您只知道其名称的第一个字母,则很难找到表格。 另外 - 因为这是一个mssql数据库 - 我们必须在任何地方用方括号括起表名。
-- doesn't work
select * from 0examples;
-- does work
select * from [0examples];
答案 13 :(得分:90)
我们正在做一个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
虽然奇怪但我渐渐喜欢上了这个。
答案 14 :(得分:88)
以前的工作:
是的,没错。每个表中的所有字段。这样我们就可以说它是一个领域。
答案 15 :(得分:84)
我的一个伙伴在政府工作期间遇到这个规则。 ++(前或后)的使用被完全禁止。原因:不同的编译器可能会以不同的方式解释它。
答案 16 :(得分:81)
团队的一半赞成四空缩进;另一半赞成两空缩进。
正如你猜测的那样,编码标准规定了三个,以便“同样得罪”(直接引用)。
答案 17 :(得分:74)
无法使用Reflection,因为经理声称它涉及太多“魔法”。
答案 18 :(得分:71)
我所拥有的最奇怪的一个,以及花了我一段时间推翻的一个,是我们公司的老板要求我们的新产品只是IE浏览器。如果它可以在FireFox上运行,那没关系,但它必须只是IE。
除了一个小瑕疵之外,这听起来可能不太奇怪。所有的软件都是用于在Linux上运行的定制服务器软件包,而我们客户购买的所有客户端盒都是Linux。没有试图弄清楚如何让Wine(在那些日子里,非常不可靠)在所有这些盒子上运行并看看我们是否可以让IE运行并培训他们的管理员如何调试Wine问题,这根本不可能满足业主的要求。问题在于他正在进行网页设计,并且根本不知道如何使网站符合FireFox。
要知道我们公司破产,你可能不会感到震惊。
答案 19 :(得分:54)
在我目前的工作中,我们有两个真正意义上的规则:
规则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
编辑:似乎这种代码模式越来越受欢迎。请参阅此The Daily WTF帖子了解详情: Astigmatism :)
答案 20 :(得分:53)
回到我的C ++时代,我们不允许使用==,&gt; =,&lt; =,&amp;&amp;等等。这里有宏......
if (bob EQ 7 AND alice LEQ 10)
{
// blah
}
这显然是为了处理“条件错误中的旧意外分配”,但是我们也有规则“把常量放在变量之前”,所以
if (NULL EQ ptr); //ok
if (ptr EQ NULL); //not ok
记住,我听过的最简单的编码标准是“编写代码,好像下一个维护者是一个知道你住在哪里的恶性精神病患者。”
答案 21 :(得分:45)
一般的匈牙利符号。
答案 22 :(得分: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;
幸运的是,他们至少开悟了足以让我们超过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;
答案 23 :(得分:41)
当我开始在一个地方工作,并开始将我的代码输入源代码管理器时,我的老板突然来找我,并要求我停止这么做。他告诉我,不鼓励每天为开发人员做超过1次提交,因为它会占用源控件。我只是盯着他......
后来我明白了他甚至向我提出这个问题的原因是因为SVN服务器会向他(以及另外10名高管)发送一封邮件给每个人提交的邮件。通过乱丢源代码控制,我猜测他是他的邮箱。
答案 24 :(得分:34)
通过Sql Server 2000中的存储过程执行所有数据库查询。从复杂的多表查询到简单的查询:
select id, name from people
支持程序的论据是:
我知道程序主题很有争议,所以请随意给我的答案评分;)
答案 25 :(得分:33)
每1000行代码必须有165个单元测试(不一定是自动化的)。对于大约每8行进行一次测试。
毋庸置疑,一些代码行很长,函数返回这个指针以允许链接。
答案 26 :(得分:30)
我们必须按字母顺序对类中的所有函数进行排序,以使它们“更容易找到”。 没关系,ide有一个下降。点击次数太多了。
(同样的技术主管编写了一个应用程序来删除源代码中的所有注释)。
答案 27 :(得分:29)
1987年左右,我在一家聘请我的公司工作,因为我是少数知道如何使用启示录的人之一。启示录,如果你从未听说过,它本质上是基于PC的Pick操作系统的实现 - 如果你从未听说过它,它的名字来自它的发明者,名字很棒的Dick Pick。关于Pick OS可以说很多,其中大部分都很好。许多超级卖家(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代码库上工作,正如我们都知道的那样,只要地狱一直没有解冻,它就不会发生。最后他放弃了。
但编码标准是最后的选择。特别是花箱的评论是一种愚蠢的浪费时间,他在我们身上煞费苦心地说,如果我只是使用合适的编辑器来维护它们就会非常容易。 (整个事情变得非常被动 - 好斗。)最后我悄悄地放弃了,从那时起,我带给代码评论的所有代码都有他珍贵的花箱评论。
有一天,几个月的工作,当我几乎证明自己胜过自己(特别是与我在那里工作时经过那个办公室的其他程序员的非凡游行相比)时,他正在看着我我工作时肩膀,他注意到我没有使用花箱评论。哦,我说,我写了一个源代码格式化程序,当我打印出来时,它会将我的评论转换成你的风格。它比在编辑器中维护它们更容易。他张开嘴,想了一会儿,关上了,走开了,我们再也没有谈过编码标准。之后我们的工作变得更容易了。
答案 28 :(得分:26)
在我的第一份工作中,所有C程序,无论多么简单或复杂,只有四个功能。你有main,它依次调用其他三个函数。我不记得他们的名字,但他们是begin(),middle()和end()的东西。 begin()打开文件和数据库连接,end()关闭它们,而middle()做其他所有。不用说,middle()是非常长函数。
只是为了让事情变得更好,所有变量都必须是全局的。
我对这项工作最骄傲的记忆之一就是导致这些标准遭到破坏的一般反抗的一部分。
答案 29 :(得分:26)
外部编写的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);
答案 30 :(得分: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
那就是说,最初感觉很奇怪......它在我身上发展。它背后的原因是有意义的(在你围绕它的大脑后),因为前缀是建立连接时提醒“推荐”(和强制!)表别名。前缀使得大多数连接查询更容易编写,因为您必须在字段之前显式引用表是非常罕见的。
哎呀,过了一会儿,团队中的所有人(我们项目中的6个人)都能够通过前缀开始引用谈话中的表格。一种后天的味道,可以肯定......但是我的成长。当我拥有那种自由时,我仍然使用它。
答案 31 :(得分:25)
使用dbo _
的前缀表是的,如dbo.dbo_tablename。
答案 32 :(得分:22)
2002年至2004年,在一家VB6商店中有几家WTF(我并不自豪,我很饿,需要吃饭)。
最讨厌的恕我直言,在子/函数的末尾设置所有对象引用。这是为了“帮助”编译器引用计数。无论我为TA做了多少次测试来证明它没有必要,哦,不,它仍然必须完成,即使他绝对没有证据支持他什么呢?。最终我放弃了大约一年后发现了一篇解释为什么它是裤子的文章。我把它带到了TA的想法“得到了笨蛋!”。他说:“是的,我已经知道了多年,但如果你开始改变羊的标准”意味着其他开发者,他每天工作的人“将搞砸”。 Gob sh1te。
同一商店的其他人。
大多数情况下,我在那里编写c ++(只有c ++开发人员,因此制定了自己的标准,并严格执行!)偶尔使用vb,否则我就不会持续。
答案 33 :(得分: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插件来实现自动化的原因。
答案 34 :(得分:14)
那里有一个项目经理不理解基于对象的编程(并且不想理解它)。 她确信基于对象的编程是一种时尚,并且拒绝让任何人使用任何类型的基于对象的编程的签入代码。
(说真的 - 她实际上花了很多时间审查我们已经签入Visual SourceSafe的代码,以确保我们没有违反规则)。
考虑到Visual Basic 4刚刚发布(这是大约12年前),并且考虑到Windows表单应用程序,我们正在构建VB4 使用的对象来描述表单,这使得开发成为可能。 。 复杂。
我的一个伙伴实际上试图通过将他的“目标代码”封装在虚拟“形式”中来解决这个问题,她最终发现他只是(* gasp *)隐藏他的对象!
毋庸置疑,我只在那里待了大约3个月。
天哪,我不喜欢那个女人的想法。
答案 35 :(得分:13)
令我胆怯的是人们使用表名称后缀表格的ID字段。只是身份证到底有什么问题?无论如何,你将不得不给它起别名......因为所有神圣的爱都是神圣的!
想象一下当你有一个名为IDSEWEBLASTCUSTOMERACTION和IDSEEVENTLOGGER的id字段时你的SQL语句是什么样的。
答案 36 :(得分:12)
您必须只使用五个字母的表名,最后两个字符保留给IO
。
答案 37 :(得分:11)
我看到的最奇怪的是数据库表命名,其中表格以功能区域的TLA开头,例如记帐ACC然后是3位数字(覆盖默认排序),然后是表格名称。
另外,这也扩展到了列名。
ACC100_AccountCode
阅读查询是一场噩梦,它们是如此难以理解。
答案 38 :(得分:11)
将s_应用于对于作为控制系统一部分的软件而言被视为“安全关键”的变量和方法。再加上关于将m_放在成员变量前面的另一个规则,你会得到像“s_m_blah()”这样荒谬的东西,这在我看来写起来很烦人,而且不太可读。最后,一些“安全专家”应该通过查看代码并通过使用那些“s_”来确定其中的某些内容来获得洞察力 - 在实践中,他们不太了解c ++,所以他们除了报告我们标记为“安全关键”的标识符数量。完全没废话......
答案 39 :(得分: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>
我必须在那里停止......
缺点很多。
我使用代码片段(Emacs YAS)将此代码添加到我的方法中。
答案 40 :(得分:11)
(可能只在英国有趣)
我工作过的保险公司想要一个组合“P”或“L”来表示范围,与所有属性的匈牙利人联系起来。
加分点是我们有一个名为pintMaster的属性!让我们都喜欢喝一杯。
答案 41 :(得分:10)
这是一个我没有遵循自己的编码标准(为其他事情遇到麻烦,但从来没有这样做)。 我们有三台19英寸显示器,因此我们可以让两个编辑器全屏显示,并且仍然可以访问桌面。 其他人都没有使用评论,但使用了有意义的名字。极长的有意义的名字。我记得最长的是80个字符范围。平均值在40~50左右。
猜猜是什么,他们并没有准确地描述整个事情。
答案 42 :(得分:10)
如果我没记错的话,delphi IDE会默认缩进两个空格。该公司的大部分遗留代码都有三个空间,由VP IT和CEO编写。有一天,所有的程序员都在谈论我们应该做些什么来让我们的生活变得更轻松,并且知道Delphi的承包商说得很好,“嘿,ide默认为两个空格,是否有任何人在我们为新代码执行此操作时遇到问题?”我们所有人都看着对方,几乎以为这是一个没脑子的人说我们同意了。
两天后,副总裁和首席执行官发现我们将做出一个可能“引发问题”的危险变化,并告诉我们,我们将使用三个缩进来处理所有事情,直到他们两个人能够准确评估其影响。这样的改变。现在我完全遵循标准,但是这些人认为oo编程正在创建一个具有一个函数的对象,该函数具有执行动作所需逻辑的全部,并且源控件正在移动代码文件到不同的目录。
答案 43 :(得分:10)
不是一个编码标准,但在1998年,我在一家禁止使用C ++的公司工作,支持C.这是因为OO被认为过于复杂而无法让软件工程师掌握。
在我们的C代码中,我们需要在所有分号前加一个空格
int someInt = 5 ;
我永远无法找到理由,但过了一段时间它确实在我身上发展。
答案 44 :(得分:9)
没有人提到的是被迫为无脑吸气剂和制定者的类编写单元测试。
答案 45 :(得分:9)
在Java中,当签约保持无名时, Interfaces 被禁止。逻辑?负责人无法找到Eclipse的实现类...
同样禁止 - 匿名内部班级,理由是负责人不知道他们是什么。这使得实现Swing GUI的各种乐趣。
答案 46 :(得分:8)
得到我的那个与另一个海报的SQL表名的“tbl”前缀类似。
在这种情况下,所有存储过程的前缀都是“sp_”,尽管“sp_”是Microsoft用于SQL Server中系统级存储过程的前缀。好吧,他们的标准来自旧的非MS数据库并且不会因为他们的标准可能导致存储过程与系统存储过程冲突而产生不可预测的结果而改变。不,那就是不合适。
答案 47 :(得分:8)
我被告知旧代码应该被注释掉而不是被删除;如果我们需要引用旧代码(是的,代码在源代码控制中......)。在做出重大改变之前,这似乎并不那么糟糕。然后它变成了一场噩梦,整个部分都删除了整个部分。
答案 48 :(得分:8)
我曾经不得不拼出所有的首字母缩略词,甚至是行业标准的缩写词,例如OpenGL。变量名如glu不好,但我们必须使用graphicsLibraryUtility。
答案 49 :(得分:8)
我曾经参与过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
的人注定要重新发明它。
答案 50 :(得分:8)
一旦我不得不从我的团队中做一个小DLL,当它完成后,我不得不重做这份工作,因为我不应该在代码中使用“else”。 当我问到为什么我被指示不要问为什么,但是另一个团队的领导者“没有得到别的东西”。
答案 51 :(得分:8)
在Java中,我目前不鼓励在测试中使用布尔函数作为谓词:
if( list.isEmpty() )...必须重写
if( list.isEmpty() == true )...
和
if( !list.isEmpty() )...必须重写
if( list.isEmpty() == false )...
因为“它更清晰”。
对我而言,“list.isEmpty()== true”有两个动词,“是”和“等于”,在一个没有连词的短语中。我感觉不对劲。
答案 52 :(得分:7)
我在一个编码标准是一个巨大的WTF的地方工作:奇怪的匈牙利符号,用'g'加上全局的前缀和'm'的成员(所以有像gsSomeVariable这样的宝石),为每个人添加'ref string sError'单一功能,而不是抛出异常(这是一个非诺!)。
然而,杀手的前缀是函数参数,输入参数为I_,输出参数为O_。
我现在在一个更好的地方工作:)
答案 53 :(得分:7)
没有单个字符变量名 - 即使对于像i这样的简单迭代器也是如此。不得不使用ii或其他东西。我觉得这很愚蠢。
另一个 - 也许是最疯狂的,但也许不是编码标准......
不允许STL。这是在2007/2008。在我发现那些废话之后我很快就离开了那里。显然有些白痴认为没有“标准”(就像15年前那样......)我猜他们错过了关于stl在C ++标准中的备忘录......
使用愚蠢的COM HRESULT作为几乎所有方法的返回类型 - 即使它们不是COM。真是荒唐可笑。所以现在我们不得不返回一些枚举类型或指示结果的有用值,等等,我们必须查找S_OK或E_FAIL或者每个方法的上下文中的含义。我再次离开那里不久。
答案 54 :(得分:7)
插入换行符
(// ----------------------------------------------- ---------------------------------)
在c#项目中的方法之间。
答案 55 :(得分:7)
强制在方法结束时只有1个return语句,并使代码落到那个。
也无法在交换机中重复使用case语句并让它掉线;我不得不写一个复杂的脚本,它做了一个循环的开关,以正确的顺序处理这两种情况。
最后,当我开始使用C时,我发现在方法的顶部声明我的变量并且非常讨厌它非常奇怪。我在C ++中度过了好几年,只是在我想要的地方宣布它们;除非出于优化原因,我现在在方法顶部声明所有方法变量,并详细说明它们的所有功能 - 使维护变得更容易。
答案 56 :(得分:7)
在每个方法的末尾添加80个字符的注释,以便很容易找到方法的结尾。像这样:
void doSomething()
{
}
//----------------------------------------------------------------------------
理由是:
答案 57 :(得分:7)
当使用对表名长度有如此大限制的SQL Server时,我从未亲自碰到它们,我们被迫使用旧版主机系统的命名约定,即使新系统从未与大型机数据库。
由于表名的限制很小,惯例是给所有表提供代号,而不是有意义的描述。
因此,在一个非常愉快地拥有名为“ThisIsTheCustomerTable”的“客户”表的系统上,相反它被称为“TBRC03AA”。下一个表称为“TBRC03AB”,下一个称为“TBRC03AC”,依此类推。
这使得SQL 真正易于理解,特别是在你写完之后的一个月。
答案 58 :(得分:6)
在 Delphi 中,我们必须从
更改if something then
begin
...
end
else
begin
...
end;
到
if something then begin
...
end else begin
...
end;
在一个拥有150万行代码的项目中。想象一下,这在源代码控制,差异和合并方面有多么简单!当编译器宣布一个超级终结时,它也导致忘记开始并且没有立即注意到它。
答案 59 :(得分:6)
我们必须在每个sql语句上面添加注释。所以,你可能有这样的SQL语句
选择USER_ID 来自用户 在哪里NAME =:NAME;
你还需要在其上面发表评论,说:
从USERS表中选择USER_ID,其中name等于输入的名称。
现在,当实际评论比代码长,并且代码很简单,二年级学生可以阅读时,我真的没有看到评论的意思......但是,唉,我不得不去返回并在语句中添加注释,就像这样。
这是在大型机上,用cobol编码。团队规模通常约为4或5,但这条规则不时会在这里咬人。
答案 60 :(得分:6)
我遇到的最糟糕的事情是与代码检查有关。出于某种原因,即使我们已经使用了我们的vcs的diff工具来查看更改的内容,但是当您希望检查代码时,您必须在文件/函数中包含一些注释块,如下所示:
/*********...80charswide...***
* START INSPECT
*/
some changed code...
/*
* END INSPECT
*********...80charswide...****/
在检查之后,您必须返回并在提交之前删除所有这些注释块。啊。
答案 61 :(得分: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程序员的十条诫命”的追随者,我发现非常规的支撑风格绝对令人抓狂。
答案 62 :(得分:6)
我工作的最后一个地方主要是一家C ++商店,在我被聘用之前,我的老板(他是研究和开发总监)发布了一项法令,“不允许动态内存分配”。没有“新”,甚至不是“malloc” - 因为“如果开发人员忘记了相应的删除/免费操作,那些会导致内存泄漏”。作为这个特定规则的必然结果,“指针也是不被允许的”(尽管引用是完全可以接受的,既可以是安全的又是安全的。)
我废除了这些规则(而不是用其他语言重写我们所有的软件),但我确实必须添加一些我自己的精彩规则,例如“未经某人的书面批准,您可能无法启动新的主题”有资格做这类事情“基于不幸的一系列代码评论(叹息)。
答案 63 :(得分:5)
由于我一直在为自雇人士/自由职业者/项目负责人工作,我从未达到某人的标准,所有标准都是我的决定。但是,我最近在15岁时发现了一段有趣的“编码标准文件”:
所有函数必须命名为“ProjectName_FunctionName”。
嗯,程序化PHP,有人吗?那些还不是PHP OOP的时候,但仍然存在。如果我想使用从一个项目到另一个项目的代码,我将不得不重写所有引用等。
我本可以使用像“package_FunctionName”这样的东西。
答案 64 :(得分:5)
我遇到的更令人沮丧的情况之一可能是人们坚持使用前缀“sp_”为存储过程添加前缀。
如果您不知道为什么这是一件坏事,请查看此博客文章here!
简而言之,如果SQL Server正在查找带有sp_前缀的存储过程,它将首先检查master数据库(除非SP实际位于master数据库中,否则它将无法找到)。假设它不在主数据库中,SQL Server假定SP不在缓存中,因此重新编译它。
这可能听起来像一件小事,但它会在大量或繁忙的数据库服务器环境中累积起来!
答案 65 :(得分:5)
在我公司的一个大型团队中,我们几乎只使用C ++。禁止通过非const引用。
如果要将参数修改为函数,则必须通过指针传递它。
我们对专业人员进行内部火焰战争(更容易识别可以修改变量的函数调用)和缺点(荒谬;必须在需要参数时处理可能的NULL指针)大约每年一次。< / p>
答案 66 :(得分:5)
当有人不使用命名约定时,我绝对讨厌它。在我工作的地方,首席开发人员(我替换了他)无法弄清楚他是否想要使用camelCase或way_over_used_underscores。就个人而言,我讨厌下划线,骆驼的情况更容易阅读,但只要你遵守一个标准就没关系。
PHP在这方面特别糟糕,看看mysql_numrows合并两个没有上限的。
答案 67 :(得分:5)
SCORM肯定。 (http://en.wikipedia.org/wiki/SCORM)
答案 68 :(得分:5)
这不是编码标准问题,但肯定是限制性思维的故事。我们在不少于7周的时间内完成了为期4周的短期项目。时间表基于对特征列表的估计。开发过程包括疯狂编码。在死后我建议使用里程碑并将功能请求分解为任务。令人难以置信的是,我的导演驳回了我的想法,说因为这是一个如此短的项目,我们不需要使用里程碑或任务,并要求其他建议。房间里沉默了。
语言:Java,C ++,HTML 团队规模:两个团队,共计10名工程师 它给你和你的团队带来了哪些不良影响:我觉得我被Dilbert卡通片抓住了。
答案 69 :(得分:5)
使用_标记私有变量只是为了确保我们知道我们正在处理类中的私有变量。然后使用php的魔术方法__get和__set来提供对每个变量的访问,就好像它们是公共的一样......
答案 70 :(得分:5)
我们的Oracle DBA坚持要将模式名称添加到表名称之前,即如果您的模式是hr_admin
,那么您的员工表将是hr_admin_staff
,这意味着表格的全名在十字架中架构查询将是hr_admin.hr_admin_staff
。
答案 71 :(得分:5)
我的第一个编程工作是使用Microsoft QuickBASIC 4.5商店。首席开发人员几乎一直在BASIC工作,所以QuickBASIC的大多数高级(!)功能都是禁止的,因为它们是新的,他不理解它们。所以:
这是一项非常有趣的工作。不,真的。
答案 72 :(得分:4)
我完全不同意这一点,但我被迫遵循它:
“所有HTML链接都应该加下划线。”
前段时间我解释了为什么我不同意我的blog。
注意:甚至Stackoverflow只会在您将鼠标移到它们上时强调链接。
答案 73 :(得分:4)
在C ++中,我们必须为每个类显式编写编译器应该为我们编写的所有内容(默认构造函数,析构函数,复制构造函数,复制赋值运算符)。看起来那些编写标准的人对这种语言并不十分自信。
答案 74 :(得分:4)
三年前,我在一家VB .NET商店工作,“技术主管”规定所有接受参考类型参数的方法(即对象)都必须使用 ByRef 而不是 BYVAL 即可。我发现这个特别奇怪,因为他们在我的采访中问我ByVal / ByRef差异问题,并解释了它对价值类型和参考类型的作用。
他对这种做法的解释:“一些较新的,经验较少的开发者会因此而感到困惑。”
当时,我是最近被雇用的,这是我的第一个永久性.NET工作。并且我并没有被它混淆。
答案 75 :(得分:4)
在mysql关键字之后,我一直在研究命名表列。它需要在您编写的每个查询中转义愚蠢的列名。
SELECT this, that, `key` FROM sometable WHERE such AND suchmore;
太可怕了。
答案 76 :(得分:4)
我必须拼写和语法检查我的评论。他们必须是完整的句子,适当的资本化和完成一段时间。
答案 77 :(得分:4)
为我们的表格提供数字,例如tbl47_ [some name]
答案 78 :(得分:4)
在编写VB项目时,我被要求为每个方法添加以下注释部分
'Module Name
'Module Description
'Parameters and description of each parameter
'Called by
'Calls
虽然我发现其余的都很顺利,但我反对最后两个,我之所以认为是因为项目变得很大,它将变得难以维持。如果我们正在创建库函数,那么我们永远无法维护被调用者。我们是6人的小团队,所以经理提出的论点是,因为你打算调用这些函数,所以应该维护它。无论如何,我不得不放弃这个论点,因为经理是坚定的。结果如预期的那样,随着项目变得越来越大,没有人愿意维持Called by和Calls。
答案 79 :(得分:4)
在我的第一份工作中,老板说我们应该总是在C#中使用完全限定的类型名称并禁止使用,因为我们应该总是知道在声明变量,参数等时我们使用的是哪种类型。
答案 80 :(得分:4)
我为硬编码工作的项目是一个严格的NO ..所以我们被迫哈希定义如下
#define 1 ONE
答案 81 :(得分:4)
我们按照MISRA标准进行编码。规则集有“必须”和“CAN”部分,我们花了几个小时讨论我们不想申请哪些规则以及为什么,当某天高层管理人员说“我们想告诉我们的客户我们100%合规。明天,我们全部申请。“
其中一条规则是:对签名数据没有位操作。 试图找出规则的用途,给出了解释:无法保证签名数据的位表示。世界上只有2个补充,但标准不保证!
无论如何,听起来不是一件大事 - 谁想把bitcoded变量声明为签名?
然而,神圣规则检查员将“整数推广”解释为“促销签署”,C标准大师说必须这样做。并且每个位操作都进行整数提升。 所以而不是:
a &= ~(1 << i)
你必须写:
a = (unsigned int)(a & (unsigned int)~(unsigned int)(1 << i))
显然更具可读性和便携性。 幸运的是,我发现移位的1u保持未签名。所以你可以把它减少到:
a = (unsigned int)(a & (unsigned int)~(1u << i))
有趣的是,有一条规则没有被激活:禁止在#include中使用像'\'这样的有趣字符。 DOS腐败的人们不会相信写#include“bla / foo.h”即使对每个Windows编译器都有效,并且更加便携。
答案 82 :(得分:3)
与格式化有关的任何事情(特别是'{'和其他块字符的位置)总是很难实施。
即使在每个源文件检查中使用自动格式,您也无法确定每个开发人员始终使用相同的格式化程序,并使用相同的格式规则集...
然后你必须将这些文件合并回主干。你自杀了;)
答案 83 :(得分:3)
最奇怪的是,必须在Java中使用类型限定的变量命名,以及数据库中列的那些类型。因此必须将java.sql.ResultSet称为tblClient等。
答案 84 :(得分:3)
我们在第80个字符列中没有代码,这在我们的C ++开发团队中存在争议。一些人强制执行并进行代码审查;被别人鄙视。
另外,我们有一个非常有争议的C ++ throw(),throw(...)规范标准。被一些人宗教使用并被其他人妖魔化。两个阵营都引用了讨论和专家来强制执行各自的立场。
答案 85 :(得分:3)
文件的创建者(不必输入任何代码)必须将他们的名字放在文件中。因此,如果您创建存根或占位符,您将永久“拥有”它们。
实际编写代码的人不会添加他的名字;我们有源控制,所以我们知道,总是应该责怪谁。
答案 86 :(得分:3)
我实现并修改了一个开源的asp经典购物车(主要是一长串的dailyWTF候选者),它以小写p开始每个变量。 如,pTax_Amount或pFirst_Name。
对此没有任何解释,我在他们的论坛上的某个地方读到了避免使用像State这样的保留字 - 你有pState代替。 他们还会随意添加临时性的东西。像rsTemp和connTemp。与永久记录集和数据库连接相反,我想。
答案 87 :(得分:3)
使用几乎所有方法的无意义信息编写方法注释。
不允许方法中有多个退出点。
所有变量,枚举,结构甚至类的匈牙利表示法,例如: iMyInt,tagMySturcture,eMyEnum和CMyClass。
答案 88 :(得分:3)
几年前我遇到了两个我非常讨厌C级工作的规则:
“每个文件一个模块”,其中“模块”被定义为C函数。
函数局部变量只允许在函数的顶部,所以这种事情是非法的:
if (test) { int i; ... }
答案 89 :(得分:3)
在我正在工作的地方,官方编码标准规定最大行长度为80个字符。理性的是使代码的硬拷贝能够被格式化。不用说,这导致了非常奇怪的代码布局。我已经努力消除这个标准,主要是通过“你最后一次复制代码的时间是什么时候?”的论点。现在的可读性与在八十列DMP上制作硬拷贝的机会相比?
Skizz
答案 90 :(得分:3)
虽然这不是一份工作,但我们在大学里有一个庞大的课程。其中一个要求是在我们的应用程序中评论每个代码行 - 无论它做了什么......并且每行必须是特定的,例如。
int x=0; //declare variable x and assign it to 0
我们不允许这样做:
int x, y, z = 0; //declare and assign to 0
因为它不够详细。而这甚至没有遵循强加给我们的命名惯例。
毋庸置疑,我们花了几个小时回顾代码......
答案 91 :(得分:3)
在一家大型英国银行,我被聘请担任新.NET系统的设计权威。
他们的规则规定数据库表必须最多8个字符长,项目代码(5位数代码)作为前缀。
他们将旧的DB2规则强制执行到Windows项目叹息
答案 92 :(得分:3)
没有任何匈牙利人。
好的,你觉得这不好为什么?好吧,因为他们认为这是匈牙利语:int foo; int *pFoo; int **hFoo;
现在,任何老派的Mac程序员都会记得处理Handles和Ptrs。以上是分享它们的最简单方法 - Apple示例代码充满了它,而Apple几乎不是匈牙利主义的温床。因此,当我不得不写一些老式的Mac代码时,我自然就这样做了,并因为匈牙利语而被击落。
但没有人可以提出另一种命名方案,以不同方式保留三个变量的清晰度,因此我按原样检查了它。
答案 93 :(得分:3)
不允许使用指针或GOTO! (在C中,尽管如此!)幸运的是,这只是一个“软件工程”课程,我能够毕业然后进入“现实世界”。
答案 94 :(得分:3)
在我以前的工作,我很高兴3个月前退出:
数据库:
asp.net / c#/ javascript
答案 95 :(得分:2)
所有文件名必须为小写......
答案 96 :(得分:2)
我不允许使用this->
来引用我们的c ++代码中的局部变量......
答案 97 :(得分:2)
我公司的所有文件都是版本控制的。到目前为止,非常好。
但对于每个单独的文件,在第一次提交到CVS时,您必须立即添加两个标签: CRE (用于CREATION)和 DEV001 (用于第一个DEVelopment周期) )。好像它是文件的第一个版本本身还不够。
在那之后,幸运的是,这个过程变得更加合理。
答案 98 :(得分:2)
每个逻辑行只能声明一个变量。 [基本原理:每行多个声明会导致代码行计数不准确。]
答案 99 :(得分:2)
最糟糕的是一个无名的地方,我仍然可以赚钱,没有标准。每个节目都是新的冒险。
幸运的是,另一位承包商和我正在慢慢培训真正的员工并在混乱中强制建立一些结构。
答案 100 :(得分:2)
必须在java实例变量上放置m_前缀,在java静态变量上放置g_前缀,大多数非Java 我曾经不得不处理的白痴,由C和C ++开发人员持续存在知道如何使用记事本以外的任何东西来开发Java!
除了没有人真正遵循这个,除了把m_放在所有东西甚至静态甚至方法名称......
答案 101 :(得分:2)
我们旧的c#编码标准要求我们使用巨大,丑陋的注释块。你知道在Code Complete中Steve McConnell给出了一个丑陋的注释宏的一个主要例子吗?那。几乎完全匹配。
最糟糕的是,c#是一种已经拥有良好(且相对不引人注意)的评论支持的语言。
你会得到这样的东西:
/// <summary>
/// Add an item to the collection
/// </summary>
/// <parameter name="item">The item to add</parameter>
/// <returns>Whether the addition succeeded</returns>
public bool Add(int item) { ... }
它变成了这个:
// ########################################################## //
/// <summary>
/// Add an item to the collection
/// </summary>
/// IN: <parameter name="item">The item to add</parameter>
/// OUT: <returns>Whether the addition succeeded</returns>
// ########################################################## //
请注意,StackOverflow的语法突出显示并不公平,正如默认的VS文本方案一样,#符号为亮绿色,导致对您的视网膜的强烈违规。
我只能假设作者真的非常喜欢以前使用C / C ++的努力。问题是,即使您只有几个自动属性,它也占用了大约50%的屏幕空间并增加了很大的噪音。额外的//行也搞砸了R#的重构支持。
在我们放弃评论宏之后,我们最终用一个脚本打了整个代码库,让我们回到了visual studio的默认c#评论风格。
答案 102 :(得分:1)
当您只需使用关键字this时,在全局变量前使用_或m_。当你需要访问全局变量...
答案 103 :(得分:1)
回到我的COBOL时代,我们不得不使用三个星号作为评论(COBOL在第7列中只需要一个星号)。我们甚至有一个预编译器来检查这个,如果你使用了除三个星号以外的任何东西,我们就不会编译你的程序。
答案 104 :(得分:1)
我专业使用的第一种语言是4D。它支持以&lt;&gt;为前缀的进程间变量,没有前缀的过程变量和以$开头的局部变量。编译器/解释器使用所有这些前缀(或缺少这些前缀)来确定变量的范围。
实际的奇怪编码标准是某种匈牙利符号。问题在于,不是根据类型命名变量,而是必须根据其范围加上前缀。
变量,其范围由其前缀决定,必须以冗余信息为前缀!
我不敢问那些负责标准的人为什么必须这样......
答案 105 :(得分:1)
在我的上一份工作中,我的主管总是执行墨菲定律:
“任何可能出错的事都会出错。”
我想是的,所以我们没有松懈地在代码中做一些快速修复或类似的东西。现在我脑子里一直有这句话。
答案 106 :(得分:1)
我的老板坚持认为我们使用常量而不是枚举,但从来没有给出理由,在所有场景中,这些使用的枚举更有意义。
更好的是坚持所有表名都是单数,然后使代码中的类也是单数。但它们不仅代表了对象,例如用户或组,它们还代表了表并包含该表的所有CRUD以及许多其他操作。但等等,还有更多!它们还必须包含一个公开可见的名称/值集合,以便您可以按列名称获取具有索引器的属性,以防您添加新列但不想添加新属性。还有一堆其他的“必须做的”不仅没有意义,而且还对代码产生了很大的影响。我可以尝试将它们全部指出,但代码说明了一切,遗憾的是这几乎是我从旧存档文件夹中取出的User类的精确副本:
public class Record
{
private string tablename;
private Database database;
public NameValueCollection Fields;
public Record(string TableName) : this(TableName, null) { }
public Record(string TableName, Database db)
{
tablename = TableName;
database = db;
}
public string TableName
{
get { return tablename; }
}
public ulong ID
{
get { return GetULong("ID"); }
set { Fields["ID"] = value.ToString(); }
}
public virtual ulong GetULong(string field)
{
try { return ulong.Parse(this[field]); }
catch(Exception) { return 0; }
}
public virtual bool Change()
{
InitializeDB(); // opens the connection
// loop over the Fields object and build an update query
DisposeDB(); // closes the connection
// return the status
}
public virtual bool Create()
{
// works almost just like the Change method
}
public virtual bool Read()
{
InitializeDB(); // opens the connection
// use the value of the ID property to build a select query
// populate the Fields collection with the columns/values if the read was successful
DisposeDB(); // closes the connection
// return the status
}
}
public class User
{
public User() : base("User") { }
public User(Database db) : base("User", db) { }
public string Username
{
get { return Fields["Username"]; }
set
{
Fields["Username"] = value.ToString(); // yes, there really is a redundant ToString call
}
}
}
抱歉,如果这个双重帖子,第一次我可能不是人类或者网站只是对可以发布的代码有多么限制
答案 107 :(得分:1)
DO 将两个字符缩写词的两个字符大写,除了驼峰标识符的第一个单词。
System.IO
public void StartIO(Stream ioStream)
DO 仅使用三个或更多字符的首字母缩写词的首字母大写,除了驼峰标识符的第一个单词。
System.Xml
public void ProcessHtmlTag(string htmlTag)
不要大写任何首字母缩略词中的任何字符,无论其长度如何,都是在驼峰标识符的开头。
答案 108 :(得分:1)
最奇怪的是“这必须用C ++编码”。据推测,我被聘用了我的专业知识。如果我的专家意见认为另一种语言可以更好地完成工作,那么另一种语言应该是使用的语言。告诉我应该使用哪种工具,就像告诉汽车修理工他只允许使用公制扳手一样。只有扳手。
答案 109 :(得分:1)
我曾经不得不忍受的最糟糕的编码标准是疯狂的缩进。
代码最初使用60x80字符的绿屏终端写在大型机上(这是很久以前的事了)。这些东西的默认标签大小是8个字符,但当时程序员认为它太大了 - 屏幕本身只显示80个字符,因此8个字符的标签浪费了很多空间。
因此他们决定将代码的意图大小设置为4个字符。
一切都很公平,你说。除非他们没有通过更改标签大小来做到这一点。他们通过将第一个缩进为4个空格,第二个缩进为单个制表符,以及在添加4个空格和制表符之间交替进行。
虽然他们坚持使用绿屏终端,但这很好。很奇怪,但很好。
当开发团队获得他们闪亮的新Windows PC时,真正的混乱开始了。
他们选择的PC编辑器的标签大小设置为4个字符,因此当加载代码时,缩进就到处都是。
我们无法修复缩进,因为有些开发人员仍在使用绿色屏幕,因此在整个团队过渡到PC的一年左右的时间里,我们有一个绝对的噩梦,试图使用代码在一个环境或另一个环境中(或更常见的是,两者)几乎无法读取。
答案 110 :(得分:0)
将_后缀_成员变量。 e.g。
int numberofCycles_;
这是一个开源项目的C ++,有几个开发人员。主要的副作用是在知道变量具有类范围之前,直到到达名称的末尾。这不是我以前想过的东西,但显然是倒退了。
答案 111 :(得分:0)
“编写编译器的人可能比你聪明得多,所以不要尝试一些聪明的东西”是指导文件所说的(不完全是字面意思)。