Questions tagged «coding-standards»

编码标准或编码约定是旨在管理软件项目中代码生成过程的规则或准则集。它们通常基于行业最佳实践或公认的惯例。它们包括命名约定,样式,禁止的功能等。

17
编码指南:方法不应包含超过7个语句?
我一直在浏览《AvSol编码指南》(C#),我几乎同意所有内容,但我真的很想知道其他人对一个特定规则的看法。 AV1500 方法不应超过7条语句需要7条以上语句的方法执行的操作过多或职责过多。它还需要人的头脑来分析确切的语句,以了解代码在做什么。用不明原因的名称将其分解为多种小型且重点突出的方法。 你们大多数人都遵循这个规则吗?即使可以大大提高可读性,即使创建新方法(您的代码仍然是DRY)几乎没有什么余地?而且您的电话号码仍然低至7吗?我倾向于10。 我并不是说我到处都违反了这条规则,相反,我的方法体积小且专注于95%,但我说你永远不应该违反这条规则,这真的让我感到震惊。 我真的只是想知道每个人对永不违反此规则的看法(在编码标准上为“ 1”-永不这样做)。但是我认为您很难找到没有的代码库。

30
您曾经必须遵循的最糟糕的编码标准?[关闭]
您是否曾经努力过编码以下标准: 大大降低了您的生产率? 最初是出于充分的理由被包括在内,但在最初的关注变得无关紧要之后被保留了很长时间? 列表中的时间很长,以至于不可能全部记住它们? 您是否认为作者只是想留下自己的印记而不是鼓励良好的编码习惯? 您不知道为什么将它们包括在内? 如果是这样,您最不喜欢的规则是什么?为什么? 这里的一些例子

12
使用版本控制时,是否有必要在每个代码文件中包含“更改日志”?
我的印象是,版本控制系统消除了将“更改日志”粘贴到代码各处的需要。我经常看到更改日志的继续使用,包括存储过程开始时的长块大块,其中很大一部分被挡住以更改文件,并用诸如此类的代码乱码: // 2011-06-14 (John Smith) Change XYZ to ABC to fix Bug #999 和: // 2009-95-12 (Bob Jones) Extracted this code to Class Foo // <commented-out code here> 正如我向我解释的,这样做的原因是,花很长时间浏览我们的VCS日志,试图找出谁更改了内容和原因,同时将其保存在代码文件本身的顶部或附近。更改,可以轻松查看谁更改了内容和时间。尽管我明白了这一点,但似乎有些多余,只是有些“语:“嗯,我们不太了解如何正确使用VCS,因此我们根本不会理会这些东西。” 你怎么看?您是否同时使用注释和日志?只是日志?您是否发现,在代码块上方看到约翰·史密斯一周前更改了检查XYZ的方法,而不必在Diff工具中搜索日志并比较代码文件时,是否更容易编写代码? 编辑:使用SVN,但基本上只是作为存储库。没有分支,没有合并,除了日志和存储之外什么也没有。

7
接口名称是否应该以“ I”前缀开头?
我一直在阅读Robert Martin的“ Clean Code ”,希望成为一个更好的程序员。尽管到目前为止还没有一个真正的突破性进展,但是它使我对我设计应用程序和编写代码的方式有了不同的看法。 我不仅同意书中的一部分,而且对我没有任何意义,特别是关于接口命名约定。这是直接从书中摘录的文字。我将这方面加粗了,我感到困惑,并希望澄清。 我更喜欢不修饰界面。前面的I在当今的一堆旧书中很常见,充其量可以使人分心,而在最坏的情况下则可以提供过多的信息。我不想让用户知道我正在给他们一个接口。 也许是因为我只是一个学生,或者可能是因为我从未做过任何基于专业或团队的编程,但是我希望用户知道它是一个界面。 实现接口和扩展类之间有很大的区别。 因此,我的问题归结为:“为什么我们应该隐藏一部分代码期望接口的事实?” 编辑 回答: 如果您的类型是接口或类是您的业务,而不是使用您的代码的人的业务。因此,您不应在此第三方代码中泄漏代码的详细信息。 我为什么不“泄漏”给定类型是第三方代码的接口还是类的详细信息?对于使用我的代码的第三方开发人员来说,知道他们将要实现接口还是扩展类不是很重要吗?差异是否不如我要记住的那么重要?

5
为什么不在C#中使用'using'指令?
大型C#项目上的现有编码标准包括以下规则:所有类型名称均应完全限定,从而禁止使用“ using”指令。因此,而不是熟悉的: using System.Collections.Generic; .... other stuff .... List<string> myList = new List<string>(); (这var也就不足为奇了。) 我最终得到: System.Collections.Generic.List<string> myList = new System.Collections.Generic.List<string>(); 打字量增加了134%,但没有提供任何有用的信息。在我看来,增加的100%是实际上阻碍理解的噪音(杂波)。 在30多年的编程中,我看到过一次或两次提出这样的标准,但从未实施过。它背后的原理使我无所适从。实施标准的人并不愚蠢,我认为他不是恶意的。除非我遗漏了一些东西,否则这会导致误导是唯一的其他选择。 您听说过这样的标准吗?如果是这样,其背后的原因是什么?除了“这很愚蠢”或“其他人都雇用using”之外,您还能想到其他可能说服此人取消该禁令的论点吗? 推理 禁止的原因有: 将鼠标悬停在名称上以获得完全限定的类型很麻烦。最好始终始终显示完全合格的类型。 电子邮件代码段没有完全限定的名称,因此可能很难理解。 在Visual Studio(例如Notepad ++)之外查看或编辑代码时,不可能获得完全限定的类型名称。 我的论点是,这三种情况都是很少见的,而让每个人都为解决一些罕见情况而付出混乱且难以理解的代码的代价是错误的。 我什至没有提到潜在的名称空间冲突问题,而我希望这是最主要的问题。这特别令人惊讶,因为我们有一个名称空间MyCompany.MyProject.Core,这是一个特别糟糕的主意。我很早就学会这东西命名System或Core在C#是一个快速路径的疯狂。 正如其他人指出的那样,通过重构,名称空间别名或部分限定条件可以轻松解决名称空间冲突。

9
XXX在评论中是什么意思?[关闭]
人们XXX在评论中看到的一般含义是什么。有时,我会看到这样的评论: # XXX - This widget really should frobulate the whatsit 当然,我可以说出评论的含义,但是XXX通常是什么意思?是说“这是黑客”还是“也许我们以后应该重温”?还是完全说了其他话?

13
空保护每个取消引用的指针是否合理?
在一项新工作中,我在代码审查中被标记为这样的代码: PowerManager::PowerManager(IMsgSender* msgSender) : msgSender_(msgSender) { } void PowerManager::SignalShutdown() { msgSender_->sendMsg("shutdown()"); } 有人告诉我最后一个方法应为: void PowerManager::SignalShutdown() { if (msgSender_) { msgSender_->sendMsg("shutdown()"); } } 即,即使它是私有数据成员,我也必须对它进行NULL保护msgSender_。我很难克制自己,不能用粗话来形容我对这块“智慧”的感觉。当我要求解释时,我听到一系列恐怖故事,这些故事是关于某位初级程序员如何在某年内对类应该如何工作感到困惑的,并意外删除了一个他本不应该拥有的成员(然后将其设置为NULL之后) (显然)),并且在产品发布后,事情就在现场爆发。我们已经“学到了硬道理,相信我们”,最好NULL检查一下所有内容。 在我看来,这就像简单而简单的货物崇拜编程。一些好心的同事正在认真地尝试帮助我“了解它”,并了解这将如何帮助我编写更强大的代码,但是...我忍不住觉得自己是不了解它的人。 编码标准要求首先检查函数中解引用的每个指针NULL(甚至是私有数据成员)是否合理?(注意:为提供背景信息,我们生产的是消费类电子设备,而不是空中交通管制系统或其他“故障等同人员死亡”的产品。) 编辑:在上面的示例中,msgSender_协作者不是可选的。如果是NULL,则表明存在错误。传递给构造函数的唯一原因是PowerManager可以使用模拟IMsgSender子类进行测试。 简介:对此大家有一些非常好的答案,谢谢大家。我接受@aaronps的邮件是因为它简短。似乎有相当广泛的普遍同意: 强制规定NULL看守每一个复引用指针是矫枉过正,但 您可以通过使用参考(如果可能)或const指针来避开整个辩论,并且 assert语句是NULL警卫人员的更开明的选择,用于验证是否满足函数的前提条件。


11
为什么隐秘的短标识符在低级编程中仍然如此普遍?
曾经有很保持指令很好的理由/注册短名称。这些原因不再适用,但是简短的加密名称在低级编程中仍然很常见。 为什么是这样?仅仅是因为旧习惯难以改变,还是有更好的理由? 例如: Atmel ATMEGA32U2(2010?):(TIFR1代替TimerCounter1InterruptFlag),ICR1H(代替InputCapture1High),DDRB(代替DataDirectionPortB)等。 .NET CLR指令集(2002):(bge.s而不是branch-if-greater-or-equal.short)等。 较长的非加密名称不是更容易使用吗? 在回答和投票时,请考虑以下内容。这里建议的许多可能的解释同样适用于高级编程,但是,普遍的共识是使用由一个或两个词组成的非加密名称(不包括通常理解的首字母缩写词)。 另外,如果您的主要论点是关于纸质图表的物理空间,请考虑这绝对不适用于汇编语言或CIL,此外,如果您向我展示一个简短名称适合但易读的名称的图表,我将不胜感激。 。从无晶圆厂半导体公司的个人经验来看,可读名称恰好适合,并可以使图更易读。 低级编程与高级语言相比有什么不同的核心之处,高级语言使简洁的加密名称成为低级编程而不是高级编程的理想选择?

16
第一人称评论是否分心且不专业?
我只是发现自己在我正在编写的某些代码(旧式Visual Basic 6.0)中写了以下评论: If WindowState <> 1 Then 'The form's not minimized, so we can resize it safely '... End if 我不确定为什么在评论中下意识地使用“我们”。我怀疑这是因为我想象有人在逐步执行代码,就像他们实际上在“执行”每一行上的所有命令一样,而不是仅仅看着它们发生了。以这种心态,我本可以使用I can resize it,因为我是目前正在“做”的那个人,或者you can resize it好像我正在与将来正在“做”的那个人说话,但是由于这两种情况最有可能碰巧,我使用“我们”,就好像我在引导别人通过我的代码一样。 我可以简单地将其重写为it can be resized并避免出现此问题,但这激起了我的好奇心:在评论中使用这样的第一人称是常见的,还是被认为分散了注意力和/或不专业?

18
处理别人的代码[关闭]
我几乎没有一年的编码经验。开始工作后,大多数时候我都会处理别人的代码,或者在现有功能上添加新功能,或者修改现有功能。编写实际代码的人在我公司不再工作。我很难理解他的代码并完成任务。每当我尝试修改代码时,我都会以某种方式弄乱正常工作的功能。在处理别人的代码时,我应该牢记什么?

4
if('constant'== $ variable)与if($ variable =='constant')
最近,我已经在PHP中进行了大量工作,尤其是在WordPress框架中。我注意到许多形式的代码: if ( 1 == $options['postlink'] ) 我本来希望看到的地方: if ( $options['postlink'] == 1 ) 这是某些语言/框架中的约定吗?是否有任何理由使前一种方法比后者更好(从处理角度,解析角度甚至人的角度来看)? 还是仅仅是口味问题?我一直认为执行测试时会更好,因为针对某个常量测试的变量项位于左侧。似乎更好地映射了我们用自然语言提出问题的方式:“如果蛋糕是巧克力”而不是“如果巧克力是蛋糕”。

4
为什么#include <iostream.h>不好?
我正在阅读另一个线程,一个人向初学者询问有关C ++的书籍,一个回答的程序员写道: 警告:请避免所有带有“ hello world”字样的书都标明 #include &lt;iostream.h&gt; 我打开了我的C ++书,并确定它像上面的示例一样包含iostream标头。 为什么这么糟?学习C ++时,我还应牢记其他哪些指针? 背景:我精通C语言,下学期将开始学习C ++。

7
使用仅使用大小写与类型名称不同的参数名称是否被认为是C#中的不良做法?
对于与类的属性匹配的参数名称,我看到与此类似的问题,但是除了使用C#中的大小写外,对于使用与参数类型名称相同的参数名称,我找不到任何东西。我发现这似乎不是违规行为,但是否认为这是不正确的做法?例如,我有以下方法 public Range PadRange(Range range) {} 此方法采用一个范围,并返回已应用填充的新范围。因此,鉴于通用上下文,我无法想到该参数的更具描述性的名称。但是,我想起了我在阅读《代码完整》中有关“心理距离”的一些提示。它说 心理距离可以定义为区分两个项目的难易程度...调试时,请准备好应对类似变量名之间以及相似例程名之间的心理距离不足所引起的问题。在构造代码时,请选择差异较大的名称,以便可以避免此问题。 我的方法签名有很多“范围”,因此,就心理距离而言,这可能是一个问题。现在,我看到许多开发人员都在执行以下操作 public Range PadRange(Range myRange) {} 我个人对此公约非常反对。向变量名添加“ my”前缀不会提供任何其他上下文。 我也看到以下 public Range PadRange(Range rangeToPad) {} 我喜欢此前缀,而不是“ my”前缀,但总体上还是不在乎。它对我来说太冗长,将其作为变量名尴尬地读取。在我看来,由于方法名称,将填充范围。 因此,考虑到所有这些因素,我的直觉是带着第一个签名。对我来说,这很干净。不需要时不需要强制使用上下文。但是,我是否对自己或将来的开发人员不利于此约定?我违反最佳做法了吗?


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.