`
tank2308635
  • 浏览: 191662 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

(转)怎样定义优秀的代码?

阅读更多

 

链接:http://www.ekampf.com/blog/2008/06/26/HowDoYouDefineQuotGoodCodequot.aspx


我曾经接受过一个关于优秀代码标准的电话采访。当时,我脑海中闪过的第一个念头就是:可维护性。如果代码难以被其他开发人员理解,维护或是扩展,都不能称其为优秀的代码。然后,我想到另外一些标准:高效,优雅 (简练,适当运用语言结构,环境适用性) ,模块化,适当的面向对象设计,等等。

当然,能够在没发生错误和没有安全漏洞等问题的情况下运行代码,这是优秀代码理所当然拥有的特质。

在《 Code Complete 》一书中,作者 Steve McConnel 在代码的可维护性上充分地支持了我的观点:

这本书所要做的另外一件事情就是,强调代码的易读性。而在独立编写代码的背后,其实隐藏着能与其他开发者顺利沟通的深层次目标。

计算机可不管你的代码是否好懂,虽然它看起来是能读懂你的程序,事实上计算机是在二进制环境下运行程序的。而编写可读性强的语言,则有利于其他开发者读懂你的程序。所以下这些对代码的可读性有着积极的影响:

1、易于理解性

2、复查性

3、错误率

4、Debug

5、可修改性

6、开发时间 - 上述因素的总和

7、扩展质量 - 上述因素的总和

编写可读性强的代码,事实上也不会花费更多的时间,至少在开发的最后阶段是这样的。可读性强的代码能让你更容易看懂自己写了些什么,这也是为什么要如此做的重要原因。而且,我们在查看代码时往往会顺便检查代码,这样也有利于纠正错误。可读性强的代码在阅读时会被修正,也更容易使别人把你的代码应用到类似的程序中。

……

编写可读性强的代码是开发过程中的不二选择。倾向花费大量时间写代码,却忽视阅读上的便利性,本身是一种错误的体制。开发人员应该尽力编写优秀的代码,因为这是一劳永逸这事,也不必因为糟糕的代码而花费更多精力。

另外,来自 MSDN END BRACKET 栏目的作者 Paul DiLascia ,也列出了优秀代码应有的物质:

不管你用什么语言进行开发,所有的优秀代码都会展示出共有的经典品质:简练,易于理解,模块化,层次性,设计良好,高效,优雅,并且清晰。

简练。这意味着能用五行代码解决的问题,绝不用十行代码。这也意味着,必须花费更多的精力来保证代码的简练,而不是生产令人费解的代码;这还意味着,你所厌恶的事情,是连篇累牍的开放性代码和函数。简练——即结构好,可执行,设计优秀——可以让你的代码更易于理解,也减少了错误的发生。

可读性强。正如其字,这说明你的代码应该更能让其他人看懂。要做到可读性强,就得多写注释,符合大众习惯,不要自作聪明地命名变量,比如说,用 taxrate 代替 rt 。

模块化。这意味,你得像宇宙的构成一样来开发程序。世界是由分子构成的,而这些分子又同原子,电子,核子,夸克,和连线 (如果你相信的话) 组成。类似的,优秀的程序也是由小模块建立成大的系统,而这些小模块又由更小的部分来组成。你完全可以只使用移动,插入和删除三个简单的应用,来编写一个文本编辑器。就像原子的构成方式一样,软件的组件也应该具有复用性。

层次性。程序得像蛋糕内部一样层次分明。应用运行在框架之上,框架运行在系统之上,而系统又运行在硬件之上。就算是应用程序的内部,也应该有层次。高级层访问低级层,而且事件正好相反(向下访问,向上返回) ,低级层不应该知道高级层在干些什么。事件/反馈的基本特性,就是向上发出无指向性通知。如果你的文档直接访问了框架,那可就有危险了。模块和层次由 API 来定义,这样就限定了各自的运行范围。因此,设计就变得由为重要了。

设计良好。在开发程序之前,要先花些时间来设计你的程序,因为思考的代价要小于调试。优秀的开发准则就是,花一半时间来设计。你得写一份功能说明 (这个程序是用来干嘛的) 和一个深层蓝图,而 API 的功能也应该整理成文。

高效。程序不但要运行快,而且要节省资源,它不能牵扯到文档,数据连接等等。程序只做它该做的事,不能胡乱地装载和撤销线程。在运行层上,你可以在测试之后才优化程序;但是在高级层,你必须先计划好执行过程。如果设计中要求服务器有大批量的延迟,最好用一个 DOG ( Data Output Gate ,数据输出门)。

优雅。和漂亮是一个概念,它难以描述却显而易见。优雅综合了简练,高效和简明等概念,同时还能让人感受到高贵的气质。举个例子,优雅就是使用表格,或者是用递归来编写程序:

{

    return n==0 ? 1 : n * factorial(n-1);

 }

清晰。清晰是优秀代码的基本,也是其他要素的品质保证。相对于普通机械,计算机建立更为复杂的系统的能力要强得多。对于编程来说,最基础的挑战就是减少复杂度。简单、可读性强、模块化、层次、设计良好、高效、优雅,都是久经考验达成简练代码的方法,这些可以有效地减少代码的复杂度。

清晰的代码,良好的设计,明确的目标,你必须真正地了解到自己在每个步骤所要做的事情,否则就会一事无成。差劲的程序,往往不是因为编程技术水平的问题,而是因为没有一个明确的目标。所以,设计是开发的关键,能让保持自己的目标。如果不能写出设计计划,不能向其他人解释开发目标,其实说明你连自己在做什么都不知道。

什么才是“优秀代码”最重要的特点?显然,就像软件工程里所面临的问题一样,是代码的平衡性。编写代码时,我们总是会努力保证复杂与简练之间的平衡:选择折衷的方式来编写代码,通过不断地测试来达成我们所期望的目标。

这样,优秀的代码才会完美地达成上文中所提到的所有特质。下次写程序或是看别人的代码时,好好地想想这些问题吧。

作者介绍:

Eran Kampf 有 8 年多的软件开发和研究经验。曾经以高级软件开发者的身份工作于 IDF 的 elite geospatial-intelligence 部门。现在在 SAP 担任 R&D 工程师,在 SAP 和 Microsoft 合作开发的项目中工作。

分享到:
评论

相关推荐

    jQuery图片3D翻转切换代码.zip

    《jQuery图片3D翻转切换代码详解》 在网页设计中,动态效果是吸引用户注意力的重要手段之一。本文将深入探讨一款基于jQuery实现的图片3D翻转切换代码,它利用了JavaScript的强大功能和HTML5的新特性,为用户提供了...

    玩转晋城数据APP源代码

    《玩转晋城数据APP源代码详解》 在IT领域,源代码是程序的灵魂,它揭示了应用程序的内部工作机制。本文将围绕“玩转晋城数据APP”这一主题,深入探讨其源代码的结构和功能,帮助开发者了解如何利用APICLOUD云平台...

    四种典型C语言状态机源代码

    源代码可能通过枚举类型定义不同的状态,并使用一个变量来存储当前状态。状态的转换通常是通过特定的输入或条件触发。学习此部分可以理解如何使用C语言进行简单的状态管理。 2. **有限状态机(FSM):**有限状态机...

    仿真代码.zip_sweptnbh_倾转旋翼机_悬停_悬停仿真_旋翼

    1. **模型定义**:首先,我们需要定义倾转旋翼机的物理模型,包括旋翼、机身、尾桨等组件的几何参数、质量分布、转动惯量等。这些数据是计算的基础,决定了模型的精确度。 2. **空气动力学模型**:这部分代码会描述...

    Excel 实用宏代码集

    "Excel 实用宏代码集"是一个宝贵的资源,为办公人员提供了大量的宏代码示例,有助于提升工作效率,并且对于初学者来说,是学习和理解Excel宏编程的优秀指南。 首先,让我们深入了解什么是Excel宏。宏是通过Excel的...

    精彩的源代码

    此外,良好的错误处理和日志记录也是优秀源代码的重要组成部分。 总之,“精彩的源代码”不仅仅是代码本身,它还体现了开发者的智慧和技能。在JSF框架中,精心设计的Managed Bean能够提高代码的可重用性和可维护性...

    高级记事本Notepad 2源代码

    《深入探索Notepad 2源代码:VC++与开源编程实践》 Notepad 2是一款高效、小巧且功能丰富的文本编辑器,相较于Windows系统自带的记事本,它提供了更加强大的特性,如语法高亮、自动换行、多文档界面等。这款编辑器...

    学习C# 最经典的示例(源代码)学习C# 最经典的示例(源代码)

    C# HELLOW示例,YIELD示例,XML注释示例,不安全代码示例,OLEDB示例,版本控制示例,线程示例,数组示例,属性示例,可空类型示例,事件示例,代理示例,类库示例,COM平台示例,安全性示例,结构示例,特性示例,运算符重载示例,命...

    圆的定义法(画圆)-少儿编程scratch项目源代码文件案例素材.zip

    此案例中的源代码文件“圆的定义法(画圆).sb2”就是一个实现这一概念的实际项目,孩子们可以通过分析和修改代码,直观地了解圆的绘制原理。 在Scratch中,我们可以利用“运动”类积木块来控制角色移动,如“移动...

    GBRL配套的Candle_1.1.7源代码用于DIY cnc的QT源代码

    总之,Candle 1.1.7源代码的分析不仅有助于我们理解DIY CNC控制软件的工作原理,也为我们提供了一个学习和实践QT编程的优秀实例。通过深入研究和实践,我们可以不断提升自己的编程技能,为DIY CNC项目带来更多的创新...

    编译原理源代码

    编译原理是计算机科学中的一个...通过深入研究“编译原理源代码”,不仅可以了解编译器内部的工作机制,还能掌握软件工程、数据结构和算法等多个领域的知识,这对于成为一名优秀的软件开发者或系统级程序员极其有益。

    CSS3游乐场摩天轮旋转动画代码.zip

    在本资源中,"CSS3游乐场摩天轮旋转动画代码.zip" 提供了一个使用CSS3实现的摩天轮旋转动画实例。这个压缩包包含了HTML源码和相关的CSS样式,帮助开发者了解和学习如何利用CSS3创建动态效果,特别是与交互式网页设计...

    Javascript和android原生互调,代码简洁易懂,能运行

    2. JavaScriptInterface:Android通过Java代码定义一个`@JavascriptInterface`注解的接口,该接口的方法可以在JavaScript中被调用,实现了Android原生代码向JavaScript的回调。 3. `addJavascriptInterface()`: 这...

    红外遥控器驱动代码

    4. **宏定义**:定义常量或者宏函数,例如红外信号的时序参数、错误代码等。 C语言是编写驱动代码的常用语言,因为它与硬件交互能力强,同时代码可读性和移植性良好。在编写驱动时,开发者需要注意以下几点: 1. *...

    预警系统源代码.zip

    源代码文件通常包含类定义、函数、变量、条件语句、循环结构、错误处理、数据库连接、网络通信等元素。对于"appyujing"这个子文件名,我们可以假设它代表了预警系统的应用程序主体,可能是系统的核心部分或者是一个...

    vrml代码源文件虚拟教室模型

    总之,这个“vrml代码源文件虚拟教室模型”是一个综合运用VRML技术,结合各种3D几何形状、纹理贴图和动画效果,构建出的具有互动性的教育环境。这样的模型可以为远程学习、在线教学提供新的可能,使得学生可以在虚拟...

    Java编程艺术的代码

    《Java编程艺术》是许多Java...通过阅读并实践《Java编程艺术》的源代码,你不仅可以巩固Java基础知识,还能掌握更高级的编程技巧,为成为更优秀的Java开发者打下坚实基础。不断练习和探索,将使你在这个领域游刃有余。

    自动生成代码工具-带操作界面

    代码生成是指通过自动化工具根据预先定义的模板或规则,自动生成源代码的过程。这种方式有助于减少手动编写重复代码的工作量,降低错误率,提高开发速度。 2. **操作界面的重要性** 操作界面使得非专业程序员或...

    代码 普通多目标优化算法代码.rar

    1. **定义目标函数**:根据实际问题定义多个目标函数,它们通常需要被封装为可调用的函数。 2. **编码与解码**:对问题的解决方案进行编码,例如使用二进制或实数编码,解码则是将编码的解决方案转化为实际问题的解...

    网页制作学习该掌握哪些代码?

    网页制作是数字时代不可或缺的技能之一,而要成为一名合格的网页制作者,首先需要掌握的基础代码包括HTML、CSS和XHTML。这三种语言是构建网页结构、样式和语义化的基石。 HTML(HyperText Markup Language)是网页...

Global site tag (gtag.js) - Google Analytics