返回首页

简约的编码准则:
本文提出了一套语言无关的编码指引。使用这些准则产生的代码将是以上不使用这些准则的情况下编写的代码的维护。本文介绍了一套语言无关的编码指引。我毫不怀疑,一些开发商将采取与一个或多个这些准则的问题。但是,每个人都有一个理由,可能有助于减轻焦虑。但是,如果通过在TOTO,我向你保证,产生的代码将是更比不使用这些准则编写的代码维护。介绍
我知道。我知道。大多数程序员查看编码标准和准则作为入侵后,他们的创意和艺术才华。但考虑了一会儿,最有可能这些程序员正在开发工作作为租用别人的软件(例如,一个公司,一个客户端等)。如果是这样的情况下,所开发的软件是不是程序员可以版权,在这个意义上的艺术作品。此外,程序员并不拥有软件。最后,程序员是在压力下(又名快节奏的环境放在)可维护性其中的想法,通常是永远不会来临的另一天一边。作者的背景和视角
我相信大多数程序员尝试生产维护的代码。但是,如果他们不使用的编码标准,他们通常在他们的企图失败。也许是因为今天的程序员进入不同的工作力量,比过去。最近,作为20世纪90年代后期,入门级程序员被分配到维护任务。很少被他们原来的软件开发或设计的责任。结果呢?程序员学会了从别人的错误 - 最重要的是如何不代码软件。在大多数情况下,这些维护程序员发誓他们绝不会做给别人,为别人做了他们。
未被开发的软件正在维护。软件维护,因为它包含一个错误。作为一个程序员的一部分未能正确地贯彻执行要求或失败,对建筑师或设计师正确地说出一个要求,我定义了一个错误。在程序员的说法,前者仅仅是一个quot; bugquot;后者则美其名曰quot; enhancement.quot;
所以什么编码标准做一个程序员呢?请注意,必须有一些回报,否则程序员实在没有理由花时间来遵守。回报是简单的可读性。和可读性,增加可维护性。无论你是否是原开发商或分配到修复或加强软件程序员,你必须明白的代码之前,你可以修改它。
多年前,作为一名研究生,我写了一个相当复杂的软件,融入高速铁路运输导轨组成的多个包裹的权利的方式。导轨的路径,以尽量减少横向加速度。这个问题,如下图所示,是购买的包裹,使直线导轨(虚线),它通常是不可能的。相反,我们必须采取购买的包裹,使1导轨连接的两端(实线)。 {S0的}
我很高兴与软件,它做了什么是应该做的。几年后,问题就来了,稍作修改使用这个软件可以解决。我重新打开软件,发现我的恐惧,这是无法使用。当时,我被编码的原始软件我有没有考虑为风格,尤其是样式,资助下列程序员(包括我在内)理解的解决方案。其结果是一个真正的不必要的quot;再造的wheel.quot,;
大约在同一时间,我发现我自己的编码风格,命名为一本书,都尊敬的计算机科学家沮丧,写一套,我跟着他们的指引,将允许我收回我刚才代码。对我来说,在这本书的最大的教训是:quot;编写的软件,如果你为别人写的 - 在6个月,你会是别人quot;!
是什么意思,写别人呢?我认为这意味着使用清晰的写作风格和一致的格式计划。这是什么这些准则都是。"指引"
如下编码的准则是,希望语言无关。具体的例子可以使用C或C#作为他们的榜样语言。但准则本身是不依赖于C或C#。鸣谢
我要感谢德里克M.琼斯{A}的贡献,其网站的网页位于{A2的}{A3的} {A4纸}
这些网页提供这些准则的理由大部分的基础。首要目标
一致性是最重要的准则是在计算机程序的字迹清晰。如果原来的程序员混合风格,下面的维护程序员更容易分心,从修理。这就提出了维护成本。标识符的拼写
我不认为有任何异议,标识符应该是自我描述。出现重大分歧来当标识符的拼写是问题。骆驼的情况。帕斯卡的情况下。大写。小写。底线。匈牙利表示法。都是一个或另一个段的方法,提出上诉。但同时也出现一个以上的另一种方法的福音只是一些个人的喜好拥护和不能说明一些事实,但陈述的意见。我认为这是合理的方法不一致的问题。建立完整的英语词汇的标识符。限制使用的授权集的缩写。pronounceability是一个容易申请拼写开发者的母语中找到的字符序列的特点相匹配的程度衡量方法。如果可以选择,很容易发音的字符序列,优先考虑那些有困难的发音。单独的英语单词用下划线。这种形式的分离区分程序员定义的标识符通常代表说,,API的入口点从系统中定义的标识符。使用小写字母,变量标识符。用于枚举,结构,类,接口,委托,命名空间等标识称号的情况下(第一个字母大写)。枚举值的标识符和const变量标识符使用大写字母。使用大写字母缩写。理由英文书写空白分开的话。当一个标识符的拼写是由几个不同的子组件,子组件之间使用下划线字符是最接近读者的经验与散文(即,用空格分开)可近似。一些开发商利用每个子的首字母。这种用法创建的字符序列,不像那些已培训读者的视觉外观。出于这个原因,将需要额外的努力来处理它们。在某些情况下,使用一个或多个其他字符可能会增加理解构造含有标识符(或许是因为换行符,需要组织可见源)所需的努力。选择自足和有意义的标识符。理由有唤起语义关联的标识符的拼写读者的利益。然而,可靠地唤起所需的语义关联,在不同的读者是很难实现的。如果可以选择,一个标识符的拼写,在许多人,有关标识符表示优先拼法,唤起他们人少,或俗称唤起无关的标识符表示的语义关联的语义关联,唤起。区分他们的首字母标识符。理由英语单词的开始,是以上原因的其他部分。出现心理词汇来存储他们的起点和英语口语似乎从他们开始认识字的优化的话。这表明,它是更好的开始比结束标识符的拼写差异(例如,猫,蝙蝠,垫,鼠)(如猫,驾驶室,可以和CAD)。避免超载。理由在任何情况下,一个字,应该有一个单一的意义。例如,它并不需要知道A,B和C的含义(预处理后),理解A = B C。这项声明不一定是真正的计算机语言,支持超载。缩进(见下面的Visual Studio中,)使用一个一致的的压痕计划,提高边缘检测。理由视觉接收的大脑区域选择性地边的方向。在一个知觉组织的理论,边缘检测是首次出现人类视觉系统的输入信号上执行的操作。读取源代码从左至右,从上到下。这是常见的做法是先上线序列的第一个非空白字符开始在同一水平位置。这种用法已经发现,以减少所需的可视化处理的代码共享共同的东西线的努力,例如,语句缩进通常用来表示嵌套块。边缘检测似乎是没有明显的努力,人们可以执行的操作。一个边缘也可用于加快项目的搜索,如果它沿边缘发生。声明在以下两个序列,较少的努力,需要找到一个特定的标识符在声明的第二块。在第一个块,读者首先扫描令牌找到标识符被声明的顺序。在其他块,标识符的位置是显而易见的。

Block   Declaration



  1     private List < Color >  known_colors;

        private Panel [ ] panels = null;

        private Sort_By sort_by = Sort_By.HSL;

        private ToolTip tooltip = new ToolTip ( );





  2     private List < Color >  known_colors;

        private Panel [ ]       panels = null;

        private Sort_By         sort_by = Sort_By.HSL;

        private ToolTip         tooltip = new ToolTip ( );
边缘检测也提高了阅读方法声明的理解。在下面的两个声明,事半功倍需要了解在第二个声明的声明。在第一,读者第一扫描标记序列,以找到一个标识符。在第二,标识符是显而易见的。{C}使用语句缩进一致的计划。 理由有两种常用的语句缩进计划。他们采取了以下几种形式:
if ( x )                      if ( x )

{                                 {

    if ( y )                      if ( y )

    {                                 {

        F ( ) ;                       F ( );

    }                                 }

    else                          else

    {                                 {

        G ( ) ;                       G ( );

    }                                 }

}                                 }

这两种形式之一,必须选择要使用的缩进语句机构,。有没有首选缩进语句机构的。相反,开发商的喜好是决定因素。同样,单一的规则简直是一致的。白色空间(见下面的Visual Studio中,)仅使用空白的空格字符。理由} {A5的定义为空格符,水平制表符,垂直制表符,换字符的空格和建议,他们可能被用来分隔标记。使用任何这些字符,空格字符以外,可能会导致一致的缩进计划的损失。有一个使用水平制表符,在源代码中的历史原因 - 可旋转的海量存储量有限。这个理由不再存在。大多数计算机都连接到千兆,甚至四字节的海量存储设备。因此,不再需要的源代码,以节省磁盘空间。此外,使用空间,有一个显着的优势。用空格缩进创建一致的缩进计划,无论什么显示设备可能(例如,显示器,打印页面等)。例如说,标签定义每8个字符的位置(激光打印机的正常选项卡设置)。一个维护程序员的修改,但使用空格而不是制表符缩进。这是很可能是新的或修改过的行代码的其余部分将有一个不一致缩进。 另一个困难是用制表符显示设备如何解释它们。比方说,一个程序员设置的源代码编辑器标签四个字符的位置。编码为正常的收益。程序员打印设计审查的源代码的副本。大多数激光打印机定义标签每8个字符的位置。打印代码的结果是一个重要向右缩进,程序员面临着两种选择:打印在横向模式或格式化源代码的代码。既不是特别欢迎的任务。更糟的是,这个问题本来是可以避免的使用空格缩进。源代码行长度限制的源代码行70个字符。理由quot; standardquot信件大小的纸张措施8-1/2 x 11英寸和quot standardquot的页边距是1英寸边。推荐的最小字体大小是11分。当源代码打印,打印的页面通常呈现以Courier New。当满足这些规定,一个完整的印刷线的最大宽度为70新品速递人物。在监视器上,要求下面的程序员滚动到正确的阅读源代码行是需要一个网页的读者滚动到右侧的傲慢。我们不这样做,我们的网站访问者。为什么这样做资深程序员吗?打破行当一个源代码行必须打破,以满足前面的源代码线长度的方针,打破行后,下面的运营商和标点符号之一:{体C3}或后,表明该声明是不完整的关键字之一:{的C4}理由源正在阅读时,读者获得了宝贵的视觉线索,该行已被打破,如果这些运算符,标点符号,或关键字就行了最后一个令牌。令牌分离(见下面的Visual Studio中,)从一个空格字符的逗号分隔的以下标记。一个空间,其操作数分开的二元运算符。所有其他标记彼此分开,由一个空格字符。代码折叠避免折页代码。{A6的}(使用许可)我才知道,后来是代码折叠,鼓励我写的越来越大的方法,并没有打扰他们分解成更小的一口大小的方法。其结果是,我往往结束了quot;一次写入维护neverquot的大单片方法的方案。在现代的IDE,代码折叠已经开始重现。这是奇怪的,因为代码折叠最初解决的问题,因为一直在等,更整洁,少短暂的方式消灭 - 即面向对象的设计。如果你盯着你的程序,不能见树不见林,代码折叠是错误的答案。答案是更好地组织你的程序封装成不同类别,使用接口,小的方法,等等细节。关于代码折叠的另一件事是,你最终浪费了很多时间折叠方法,展开,这是不是真的让你在任何地方。感觉就像是你正在做的工作,因为你积极点击,但你实际上没有取得任何进展。这就像试图通过不断地打开和关闭柜门的柜子里的内容重新排列。Visual Studio中
此前,在这些准则中,我提到这一段。 Visual Studio提供了满足这些准则的一些援助。可以自动在Microsoft Visual Studio IDE中的空白和缩进准则。工具→选项→文本编辑器下是无数的控制源代码的格式设置。我强烈建议程序员需要时间审查这些设置。的优势之一就是,如果你不喜欢给你的代码的格式,你可以简单的切割(按Ctrl-A,CTRL-X)和粘贴(CTRL-V)的代码。如果您的文本编辑器设置你想要什么,然后Visual Studio IDE中格式化的代码(这也可以完成从编辑→高级"菜单项),根据自己的喜好。结论
正如前面所说的,有没有quot;右wayquot格式化计算机程序,不管是什么福音说。唯一重要的规则是一致的。这条规则,如有违反,将导致代码不可读的。和难以理解的代码是不可维护的代码。
我已经几十年的计算机编程。正如我刚才指出,开发实用的指导方针是反对捍卫自己的机制。但是事情已经发生了许多倍,增加我的信心在这些准则。几年后,我离开了一个项目,在Ada写,我接到呼叫保持我曾写过的驱动程序的程序员。他承认我的编码签名,并呼吁说quot;感谢you.quot;虽然司机数百线长,他能够保持轻松的代码。历史08/04/2011 - 原创文章

回答

评论会员:游客 时间:2012/02/04
当我感到被迫让我的头围绕别人的代码,我经常发现,他们的白色空间过度简单限制的代码量我可以看到,削弱了整个代码块NBSP清晰的画面。我不是一个很多小的功能,只是打破了一个很大的问题,成可读件的风扇。如果一个线性(长)算法被编码,我宁愿读长(线性)函数描述它。主程序和辅助功能的分数之间来回跳跃,打破了流NBSP为了保持视觉分离,不使用太多空白,我这样的布局代码:(某物){do_stuff();//注释有关此功能do_more_stuff()}{dont_do_stuff()}{BR}next_bit()NBSP如果我们的IDE的真聪明,他们会自动重新加载个人设置的代码NBSP。戴夫十字
gggustafson
评论会员:游客 时间:2012/02/04
戴夫,我在总协定。是的,它会是很好,如果IDE开发花费更多的时间,创造更好的集成开发环境,将正确(程序员选项)格式代码。但要注意,正如由neil_b出,版本控制系统,以及需要帮助。我个人我在C#中,以4位tab键设置为HTML,CSS和Javascript。和2位向右迁移也是一个问题。很久很久以前,有同事发现我下面的结构,以避免其他向右迁移代码:{C5的}我一直在使用它,因为。感谢您的意见。格斯古斯塔夫森
neil_b
评论会员:游客 时间:2012/02/04
我在团队中工作,并已发现上述所有是没有价值的,除非用工具,自动化和执行准则执行。我使用ReSharper的清洁守则和FxCop标准化编码跨团队的指导方针。虽然你可以改变规则,以适应自己的意见,取得最好的结果是使用默认,所以没有人有任何不良的编码标准的借口。(我改变是唯一的默认_私有变量的前缀,它是我的宠物恨,但只是一种意见,作为老板,我可以做这个imgsrc=http://www.orcode.com/img/ico/smiley_smile.gif。gggustafson
尼尔,{BR }
多年来,我已经鼓吹"工具规则"。我什至做了一个标志。不幸的是,对他们来说,我当时工作的公司,是一个车身车间,并希望只有更快的编码。与工具没有规则,会降低人体小时。该公司在被利润的驱使,没有采取任何进一步行动。所以,我有一个概念的文件夹,规格全。

你看到Visual Studio中的工具选项?如果我要建立一个格式化工具,我会根据他们。这样,我不需要编写您的标准(老板)。而我设置的格式,不管我舒服。当我这样做,我可以重置的选项,您的标准(老板),或该公司的标准,或客户的标准....

因为有越来越多的运动距离。NET环境,也许我会建立的工具。任何有兴趣参加这样一个项目?

感谢您的意见。他们带回的回忆。
古斯塔夫森格斯
更新:2011年8月18日,下午04:31
| neil_b:我作为一名经理,以确保我们的版本控制系统中的所有项目,从而ReSharper的和FxCop的方法使用相同的规则格式化重要的事情。其他工具存在,当然,也同样好。

这一点是任何人都应该能够做一个diff文件的不同版本和代码的区别是什么,没有什么格式上的差异。

如果你想,你可以重新格式化您的个人准则,但是,这将使你在一个团队的开发效率较低,你将需要重新格式化,可以比较修改或承诺。

民主是好的,在一个团队,但一旦投票,然后每个人都有,以确认他们应该前进
评论会员:gggustafson 时间:2012/02/04
尼尔,

我认为版本控制系统(VCS)的主要问题是,他们是幼稚和不成熟。他们是没有代码的语义感字节逐字节的比较。然而,没有理由工具可以不格式化成一致的形式为VCS代码。 (你知道这种说法是多么愚蠢的吗?我们正在格式化代码,这样的工具可以处理它!)

我站在我刚才的评论。感谢你。
格斯古斯塔夫森
评论会员:尼古拉斯・凯里 时间:2012/02/04
完全正确

使用的另一个原因,强调分手在标识符的话,这样做使得理解多为母语非容易。如果一个是英语为母语的标识符沿线SemiMonthlyAccruedTotalRevenuePerSalesUnit的是很容易解析。非母语不是那么多。像Semi_Monthly_Accrued_Total_Revenue_Per_Sales_Unit的东西很容易。

研究表明,这个词的识别字的形状,而不是由字母组成的字检查指导。这是大语料库的大写文字是难以阅读的原因之一:每一个字具有相同的形状:矩形。以英语作为母语的人,是密切与熟悉组件的字的形状,因此能够很容易地掰开成其组成部分的复合标识符。非母语必须努力这样做。使用下划线,打破了一个标识符的话,使不同的单词边界。

一个谈论对齐/边缘检测大1。这是我第一次听说过有人讨论这个WRT的编码。使代码表格/尽可能经常可以更容易地找到的东西,更容易注意到这是不完全正确的东西。我想通了这一点,做维护编程,在汇编和C

不过,我想,你讨论使用空格和注释,以阻止"原子"的语句组。这是一起运行的代码是很难理解的。虽然,在一定程度上,成小原子的方法/函数重构减轻这方面的需要。

我喜欢做的一件事是打入个人计算的东西的堆栈相结合,以获得所需的结果。小个体表现比长期复杂的很容易了解;进一步,调试,记录和识别的问题,如一个例外,是简化。类似

{5233}
比同等
更容易了解/理解/调试
{C7-}
上周五,2011年8月5日,1:59 PM
修改
评论会员:Jaxag 时间:2012/02/04
这是很好的,我完全同意90%的内容。
我有问题:

1。标识符的拼写 - 强调每个子
VS大写字母在我看来,强调降低可读性时经常使用。例如一条下划线(这是相当强烈的视觉分隔)意味深长地暗示,有2个独立的逻辑/语义实体,虽然它是只有1。
我个人更喜欢"每个子大写字母"。你写的,读者没有这种视觉外观的训练。但读者又是开发商和,如果他们有至少几年的经验,他们已经看到/很可能与这种风格的工作。
当然,这更是一个个人喜好的问题...

2。线路长度/监视器
我不认为,根据字母大小的推理是有效的。我没有打印在10年内的任何代码,在这里我希望大多数开发商一样。
这是关于"重点领域" - 如果它是太宽了,你有你的注意力转移,也水平,从而降低整体的可读性
顺便说一句,1024 * 768的监控是不适合发展,甚至不1280X1024。作为开发商,我宁愿买和使用自己的液晶显示器比使用这样的小显示器,每天
评论会员:游客 时间:2012/02/04
gggustafson:1。强调与资本请注意使用下划线的理由。这些语句,得到公认的来源。另外,请看看超过39德里克琼斯;理由页。其中,你会发现生理原因,遵循的指引建议。至于资本,如果您只使用首字母大写,那么你很可能陷入冲突的框架运行的切入点。使用你的计划,如果你想有一个方法,设置一个定时器,你可能会命名方法SetTimer的。{C8的}显示732的切入点。SetTimer的是其中之一。你是在冲突中。一个维护程序员,与定时器熟悉,可能会认为你的代码SetTimer的user32.dll中SetTimer的是一个参考,而不是按照你的代码,调用。但是,如果你命名方法set_timer或Set_Timer的,维护程序员给出的方法是局部的,不是在USER32线索。70列指引请注意,这是准则。一个组织应该设置什么最适合自己的可维护性规则线的长度。我已发现70个字符,我几乎不断的情况下满足需求。你可以看到在每个源代码下载代码项目提供证明,我的规则。另外,你似乎已经错过了我的观点。在生产编程环境(从不同的爱好者,研究,系统等)的程序员有一点说的设备上,他计划。所以,如果你写的代码,你比我高得多了一项决议,将迫使我重新格式化你的代码。这使得代码难以维护。和一些生产环境(例如军队),你可能不是"购买和使用[]自己的液晶显示器。"所以,请记住未来的家伙。感谢您的意见。格斯古斯塔夫森
supercat9
评论会员:游客 时间:2012/02/04
gggustafson写道:请注意,这是准则。一个组织应该设置什么最适合自己的可维护性规则线的长度。我已发现70个字符,我几乎不断的情况下满足需求。你可以看到在每个源代码下载代码项目提供证明,我的规则。多年来,正常的"皮卡"打字文本的标准是10个字符/英寸与6号线/英寸;较小的"精英"打字的文字是12个字符/英寸与8线/英寸。前者将印六十,行80个字符,每页后者为八十,96个字符,每页的行。默认字体大小和记事本的利润可能会更大,但我认为没有理由视为"太小了"良好的可读性皮卡大小
西蒙・杜福尔:微软说,不要使用匈牙利表示法{BR }
{A7的}
评论会员:gggustafson 时间:2012/02/04
匈牙利命名法是由程序员在Xerox PARC发明的。它首次成为众所周知的,当他成为微软聘用。微软声称,这将提高程序的可读性,(从而可维护性)。匈牙利命名法,不论其支持者表示的优势,包含了一个极其危险的方面。说,例如,标识符I16height被宣布为


    Int16  I16height = 0;


在日后的维护过程中的一些时间,变量的大小太小,它必须包含一个值大于65535。因此,维护程序员改变声明:

{C10的}
现在的的变量I16height可以包含一个32位有符号integrer。但顾名思义,它不能。所以,除非维护程序员改变的的"I16height"到的"I32height"(通过亲身体验,我发现是不可能的)的所有实例,下面的维护者将得到错误的信息。

在现代集成开发环境,变量类型显示的要求。信息来源于什么编译器决定的类型是什么,而不是一个程序员在标识符的拼写表示。我倾向于认为,匈牙利命名法,只有在无类型语言的地方,不支持一个IDE。

你是正确的; Microsoft不再支持使用匈牙利命名法。然而,微软并拥护其使用,不幸的是,许多程序员和软件经理了标志,并用它跑。我们今天所看到的是,微软的失策文物。例如,最臭名昭著的是,类成员的前缀M_
格斯古斯塔夫森
评论会员:肖恩老学校游戏的家伙 时间:2012/02/04
嗯。我一般使用"M_DATA"或"MDATA类成员的公约,但没有从任何缓缴;本公约允许像集定义(int数据){MDATA =数据;},这是最可读的版本定义海事组织,包括其他人可能要维护代码。

谢谢了,
肖恩
评论会员:游客 时间:2012/02/04
gggustafson:|如果我不能够说出比阶级属性不同的参数变量,我用我#39,T认为形式是错的,我认为这是一个搁置了从匈牙利命名法感谢注释格斯古斯塔夫森
肖恩老学校比赛的家伙
评论会员:游客 时间:2012/02/04
格斯,其实我从来不等同于匈牙利命名法的M_或M前缀,所以我是有点惊讶,因为我一直被视为一个C-特定公约(我从来没有见过它在C,匈牙利命名法初步得到传播,所以我没有考虑集的一部分)。我不怀疑你的说法,这是历史上"匈牙利表示法"的事情,它只是说,到现在为止,我已经把自己在坚决"不喜欢在所有的匈牙利表示法"类别。谢谢,codeprelang="c#"spanclass="code-keyword"public/spanspanclass="code-keyword"struct/spanICONINFO{spanclass="code-keyword"public/spanspanclass="code-keyword"bool/spanfIcon;spanclass="code-keyword"public/spanspanclass="code-keyword"int/spanxHotspot;spanclass="code-keyword"public/spanspanclass="code-keyword"int/spanyHotspot;spanclass="code-keyword"public/spanspanclass="code-SDKkeyword"IntPtr/spanhbmMask;spanclass="code-keyword"public/spanspanclass="code-SDKkeyword"IntPtr/spanhbmColor;}/pre/codecodeprelang="c#"spanclass="code-keyword"public/spanspanclass="code-keyword"struct/spanIconInfo{spanclass="code-keyword"public/spanspanclass="code-keyword"bool/spanis_an_icon;spanclass="code-keyword"public/spanspanclass="code-keyword"int/spancursor_hot_spot_x;spanclass="code-keyword"public/spanspanclass="code-keyword"int/spancursor_hot_spot_y;spanclass="code-keyword"public/spanspanclass="code-SDKkeyword"IntPtr/spanicon_bitmask_bitmap_handle;spanclass="code-keyword"public/spanspanclass="code-SDKkeyword"IntPtr/spanicon_color_bitmap_handle;}/pre/code{C16的}{C17的}{C20的}感谢您的评论。