`
tank2308635
  • 浏览: 188917 次
  • 性别: 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 合作开发的项目中工作。

分享到:
评论

相关推荐

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

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

    《你必须知道的495个C语言问题》

    1.7 怎样声明和定义全局变量和函数最好? 4 1.8 如何在C中实现不透明(抽象)数据类型? 5 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 5 存储类型 6 1.10 同一个静态...

    JAVA上百实例源码以及开源项目源代码

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    你必须知道的495个C语言问题.pdf

    1.7 怎样声明和定义全局变量和函数最好? 1.8 如何在C中实现不透明(抽象)数据类型? 1.9 如何生成“半全局变量”,就是那种只能被部分源文件中的部分函数访问的变量? 存储类型 1.10 同一个静态(static)函数或变量的...

    Visual C++ 2010入门经典(第5版)--源代码及课后练习答案

    该资料是《Visual C++ 2010入门经典(第5版)》的源代码及课后练习答案 对应的书籍资料见: Visual C++ 2010入门经典(第5版) 基本信息 原书名: Ivor Horton's Beginning Visual C++ 2010 原出版社: Wrox 作者: ...

    jQuery权威指南-源代码

    jQuery是继Prototype之后的又一个优秀JavaScript框架,深受全球开发者欢迎,已经成为Web开发领域的事实标准。jQuery以其轻巧的体积、强大的选择器、出色的DOM封装、丰富的插件支持使得广大的Web前端开发者得心应手,...

    零基础学HTML CSS源代码

    第1章(源代码\第1章) 示例描述:本章演示HTML基本知识 HTML基本标记.html HTML基本标记的用法。 我的第一张网页.html 演示我的第一张网页。 第2章(源代码\第2章) ...

    C语言入门经典(第4版)--源代码及课后练习答案

    本书集综合性、实用性为一体,是学习C语言的优秀入门教材,在世界范围内广受欢迎,口碑极佳。书中除了讲解C程序设计语言,还广泛介绍了作为一名C程序设计人员应该掌握的必要知识,并提供了大量的实用性很强的编程...

    JAVA上百实例源码以及开源项目

     Java非对称加密源程序代码实例,本例中使用RSA加密技术,定义加密算法可用 DES,DESede,Blowfish等。  设定字符串为“张三,你好,我是李四”  产生张三的密钥对(keyPairZhang)  张三生成公钥(publicKeyZhang...

    《C++编程艺术》教程+代码

    非常优秀的C++教材,并且附有源码。 目 录 第1章 C++的功能 1 1.1 简洁而丰富的语法 1 1.2 功能强大的库 2 1.3 STL 2 1.4 程序员控制一切 3 1.5 细节控制 3 1.6 运算符重载 3 1.7 一种简洁精练的对象模型 4 1.8 C++...

    模拟动态分区存储管理中地址转换

    本人此报告成绩优秀,参考绝对不让你后悔) 要求完成的主要任务: (包括课程设计工作量及其技术要求,以及说明书撰写等具体要求) 1.要求首先采用动态分区方案,用最先适用算法对作业实施内存分配,然后把作业地址...

    AppFramework数据库访问组件_代码生成插件_V1.1.rar

    而IBatisNet若要返回不同的字段就要定义多套ResultMap,否则就定义一套所有字段的ResultMap,任何查询都返回所有字段。这样无疑浪费了数据库服务器与应用服务器之间的网络带宽,在进行海量数据访问时性能将严重降低...

    精通qt4编程(源代码)

    因为Qt 4框架设计得非常优秀,在2006年的第16届Jolt大奖上,Qt 4获得了类库、框架和组件类别的Jolt生产力奖。 \和Java的“一次编译,到处运行”跨平台不同的是,Qt是源代码级的跨平台,一次编写,随处编译。一次开发...

    精通Qt4编程(第二版)源代码

    因为Qt 4框架设计得非常优秀,在2006年的第16届Jolt大奖上,Qt 4获得了类库、框架和组件类别的Jolt生产力奖。 \和Java的“一次编译,到处运行”跨平台不同的是,Qt是源代码级的跨平台,一次编写,随处编译。一次...

    基于MVVM的IOS开发框架EasyIOS.zip

    整合了很多开源的优秀代码 部分函数借鉴了BeeFramework 常用类库: Action 负责网络数据请求 Model 负责数据存储 SceneModel 负责Scene与Model的绑定,调用action进行数据请求 Scene 一个视图...

    ASP 使用jqGrid实现读写删的代码(json)

    jqGrid是一个优秀的基于jQuery的DataGrid框架,想必大伙儿也不陌生,网上基于ASP的资料很少,我提供一个,数据格式是json的: 、一个针对jqGrid的json类:这段代码似乎是由官网论坛的一些PHP中转化而来,我们存为...

    Delphi的原子世界简介

    而DELPHI的Object Pascal语言吸收了一些高级面向对象语言的优秀特征,又保留可将程序直接编译成机器代码的传统优点,比较完美地解决了高级功能与程序效率的问题。 正是由于DELPHI在应用程序中保留了完整的类信息,...

    C++ Primer第四版【中文高清扫描版】.pdf

    书中不但新增大量教学辅助内容,用于强调重要的知识点,提醒常见的错误,推荐优秀的编程实践,给出使用提示,还包含大量来自实战的示例和习题。对C++基本概念和技术全面而且权威的阐述,对现代C++编程风格的强调,使...

    opencc4j::China:OpenChinese Convert是一个开源项目,用于繁体中文和简体中文之间的转换。(java中文繁简体转换)

    支持自定义分词支持判断个别字(词)是否为简体/繁体支持返回字符串中简体/繁体的列表信息v1.6.0版本变更支持返回单一汉字的所有繁简体列表测试代码见test文件夹。可以用作学习相关方法的使用方式。创作缘由OpenCC的...

Global site tag (gtag.js) - Google Analytics