原文网址:http://blog.csdn.net/shendl/archive/2005/10/19/509556.aspx
-------“与其无尽的等待完美的设计,不如立刻着手实现可行的设计,然后再在设计出现臭味的时候重构实现!”
引言
今天,一位初学编程的朋友对我说,他写的类要么是数据类,要么是操作类。似乎写得不太好。于是,我看了他写的代码。他的类虽然编得不怎么样,但是放在他的小项目中,并没有发出多浓的bad smell。所以,我告诉他,他的类写得不错,并无不妥。
在回家的路上,我回想起这个他的这个问题,觉得有必要好好探讨一番,遂作此文。
正文
以前有一位朋友,让我给他的代码排错,我打开他发过来的代码,一股浓烈的臭味扑面而来----他居然使用中文作为变量和方法、类的名字!
我差点被这个臭味熏死!我问他,怎么可以使用中文作为变量名。他说,java用中文作变量名没问题的,是他的老师告诉他们这样子做的。
天呢!看来又是一个拿到毕业证书又立刻回到课堂教书的家伙!真是误人子弟呀!
Kent beck用bad smell来表示重构的适当时机,真是一语道破真谛!
Bad smell是代码好与不好的最天然的分界线!
一、 bad smell与代码的优劣
食品有做得好不好之分。其中一个重要的指标就是保质期。好的食品,保质期就长,坏的食品保质期就短。
对于代码来说也一样。也有一个保质能力的问题。好的代码,入口芬芳。坏的代码早早就变质了,而且随着时间的推移越来越臭,直到最后,我们只好把它扔掉----虽然它也曾经是我们花钱买来的。
对于食品来说,当然是保质期越久的食品越好。而对于代码也一样,我们都希望自己的代码持久芬芳。但是,保质期久的食品,制造成本自然会增加,而也许我们只需要这袋食品保质7天就成了,而保质1年对于生产来说实在是太大的浪费。同样,如果我们的代码只要保质3个月就可以了,我们如果执着的提高质量,让它可以保质3年,也是浪费了Money。
二、
这个世界上又终极完美的东西吗?没有,绝对没有!
以前,我们的数学、物理,还有哲学,逻辑学等等,总是追求完美的公式演绎,精确的度量,“最科学的…人类社会的最高阶段…”,最佳决策等等。
但是,追求完美的结果却总是惨痛的失败!、
“上帝不会让人类看穿整个世界”!
今天,已经有很多学者明白了这个道理。
“与其无尽的等待完美的设计,不如立刻着手实现可行的设计,然后再在设计出现臭味的时候重构实现!”
数学中出现了模糊数学。虽然我们无法精确的知道到底是多少,但是我们知道它会在什么之间。也就是说,我们知道“香well-smell和臭bad-smell”之间的分界。这就足够了!
物理学家们也明白了粒子测不准原理。这个世界上有很多东西是绝对随机的。也明白了夸克的内部我们永远无法认识。因为打碎夸克所需的力量大于整个宇宙的能量之和。“君子有所为,有所不为”!不要去做得不偿失的事情!“追求完美”就像是夸父追日,愚不可及!
“少谈点主义,多干点实事”胡适语。哲学家们业务实起来了。邓公的“实事求是”把中国人从哲学的虚妄追求(实际是空想)中解脱了出来。20多年里,抛弃理想(实际是空想)的中国人富了起来!中国人上天了!
逻辑学以前研究最佳决策。此外,管理学,军事指挥学等等的教授们也钻研与此。但是,今天,这些社会科学家们也明白了“完美是虚妄的”这个道理。现在MBA,工程硕士,工程博士,案例教学这些实际的东西大行其道。逻辑学现在也转而研究“较优决策”。
好了,说了这么多,似乎有些跑题了。以上这些其它专业的科学的发展经历,都无一例外的证明了“完美的虚妄”。我们做任何事情,都要有“先干起来再说的精神”。“瞻前顾后”“唯唯诺诺”者必将一事无成。
“与其无尽的等待完美的设计,不如立刻着手实现可行的设计,然后再在设计出现臭味的时候重构实现!”
比如说,我们接到一个项目,我们经过思考,获得了一个可行的设计方案,然后着手实现。此时,可能有一个小功能。我们是使用GOF23个设计模式,用n个类实现呢,还是立刻用10来行代码解决呢?我们应该选择“可到达目标的简单方案”。这是XP方法的一大原则。现在,这一段代码散发着well-smell。
过了几天,我们又增加几项功能。再看到这段代码时,它已经散发出bad smell了。
也许是因为,我们的代码大大增加了,一段语意含混不清的代码,让阅读者头晕。也许是因为,出现了大量代码的重复,或者是我们这一段不太“香”的代码被很多代码所调用。
为什么同一段代码,一会儿挺香的,不需要改进;一会儿又很臭,急需重构呢?答案是Context上下文,或者说是“环境”。
还记得以前学习语文和英语的时候,最强调的就是“语境”了。同样一句话,放在名著里,就是经典,放在我们的作文里就是败笔。
其实,代码的好坏,和语文的语言的好坏是最最类似的。一个软件就和一篇文章一样。
1, 软件的语言,用的是编程语言,有着特殊的语法;
而一般的文章,用的是汉语、英语、法语等等。
2, 软件的读者是程序员,他们学会了编程语言,如java;
文章的读者也一样是人,他们会文章的语言,如中文。
当然,也有不同。软件除了人可以看之外,还可以被编译器执行;
而我们一般的文章就不行了。
但是,软件实现的好坏,bad smell,well smell的判断者是人,而不是编译器。Well smell的代码常常比bad smell的代码更加低效。
因为,在软件的两个读者中,程序员是远远比编译器重要的读者。因为程序员的小时薪可是比电脑每小时运行的费用贵多了!
如果,建筑图纸是清晰的,那么工程师们建造房子,修改房子就容易多了。如果建筑图纸杂乱无章,那么新来的工程师要开展工作就需要更多时间的学习。对于通常是很复杂的软件来说,也许理解代码的工作量会大的不如重新编写代码!
软件代码,就如一篇说明文。
如果这篇说明文简单易懂,那么这篇文章就是散发着“诱人芬芳”的文章。
如果这篇说明文晦涩难懂,那么这篇文章就是散发着“恶臭”的文章。
同样的代码放在这篇软件里,它散发着“诱人芬芳”;放在另一篇软件里,它散发着“恶臭”。
因为,对于不同规模的软件,对于不同复杂度的软件,“简单易懂”是一个不同等级的要求。
对于大规模,高复杂度的软件。“简单易懂”意味着精巧的设计和实现。
而对于简单的软件,“简单易懂”意味着直白的,教科书式的实现即可。
当我们的软件逐渐向大规模,高复杂度进化的时候,我们的代码段也需要进化。进化成精巧的设计----面向接口编程,OOP的高级原则,设计模式,面向方面等都可能会用上。
所以,对于一个有经验的程序员来说,我们尽管率性而为,设计和实现软件。我们的决定往往是比较正确的。当我们看不顺眼某一段代码的时候,闻到令我很不爽的Bad Smell的时候,那么,我就会操起刀,给它们开一刀,令它们重新“简单易懂”。
Bad Smell,看不惯,看不懂,不清楚,不简洁,总之,不管怎么说,就是令我很不爽的时候,我就要重构它,或者重新设计它。
那么,我们重构的目标在哪里呢?OOP的一些高级原则怎么样?面向接口编程怎么样?GOF的23个设计模式用用的话会不会好一些呢?面向方面编程AOP,分离横切关注点怎么样?等等这些好的原理、技术都可能是我们重构的方向。或者,仅仅是Martin Fowler的那些个“重构手法”就管用了!
n 结语
“我不是什么伟大的程序员,我只是一个有着很多好习惯的程序员”Kent Beck语。这句话至今记忆犹新!这个世界上有很多伟大的程序员,但我只佩服那些“有着很多好习惯的程序员”!因为,我是一个只崇拜技术的程序员。我只崇拜那些编程高手,而所谓的编程高手就是那些“有着很多好习惯的程序员”。
我也明白高手之道,但我却一直没有养成高手的习惯。所以至今还是一个平凡的程序员,伟大的理想迟迟不能实施。当我闻到浓烈的“bad smell”的时候,我常常未能像Martin Fowle那样去重构,因为节点就在眼前!
希望这篇文章能够让你明白我们应该怎样编写程序,何时重构,何时重新设计。希望你也能养成kent beck那样的好习惯。
曾经,我也追逐完美,渴望卓越,渴望一步登天,一举成为顶尖高手。但这一切都是空想,都是“水中望月”。就算强悍如Rod Johnson,Kent beck等人,也仍在学习,仍在重构自己的代码,写出的代码,编出的软件也仍在被人批评!
“千里之行,始于足下”,让我们这些菜鸟开始编程吧!当我们闻到bad smell的时候再重构吧!我们将改变这个世界,也许有一天我也会成为人人景仰的英雄,大师。成为万千程序员的偶像!
“与其无尽的等待完美的设计,不如立刻着手实现可行的设计,然后再在设计出现臭味的时候重构实现!”
-----------------------------------
很值得思考的一篇文章,开发中我总是去想更好的结构和设计,因此浪费了时间和精力。
为什么不等代码的臭味来了再重构呢?
-----------------------------
分享到:
相关推荐
1.重构要求 2.重构的工作 3.代码的bad smell 4. 重构的例子
这个项目是一个基于Java的检测器,可以检测Fowler等人的五个。 (1999) 的代码不良气味:数据块、开关语句、推测一般性、消息链和中间人,来自 Java 源代码。
【智能优化算法-气味代理优化算法】基于气味代理优化算法求解单目标优化问题附matlab代码(SAO,Smell Agent Optimization)标准.zip
沪教版一年级英语下册(牛津版) Unit 3 Taste and smell 第1课时 教案 教学设计 .pdf
论文《A Textual-based Technique for Smell Detection》pdf全
顶级程序员培训公司Industrial Logic, Inc. 提供。重构技术的随身小纸条,详尽的代码坏味和对应的重构。强烈推荐给读过《重构:改善既有代码的设计》的人
沪教版一年级英语下册(牛津版) Unit 3 Taste and smell 第2课时 教案 教学设计 .pdf
分享了气味剂算法源代码及其原文,更多算法可进入空间查看
Coca 是一个用于系统重构、系统迁移和系统分析的工具箱。它可以分析代码中的 badsmell,行数统计,分析调用与依赖,进行 Git 分析,以及自动化重构等。
这是C语言程序设计经典236例书本里的案例的代码的电子版,代码里有注释,很生动,这是7-9章的
检测JavaScript类的内聚耦合Code Smell.pdf
长剑“B'smell” 3D 模型(低多边形)/ 免费低多边形长剑“B'smell”模型。。低多边形 模型全部展开并被贴上纹理,可用的纹理格式为 PNG,包括 1k、2k 和 4k 版本。纹理、材料和网格都有适当的名称。模型已完全贴上...
学习气味-入门套件 :flexed_biceps: 挑战页面: : :speaking_head: 讨论论坛: : :trophy: 页首横幅: : :laptop: 安装git clone ... 这将为您提供类似于以下内容的文件夹结构: .├── data│ ├── test.csv│ ...
该工具尝试通过使用您可能不知道的语言功能和标准库功能,找到可能使更多的Python代码,更漂亮的代码位 例如直接嵌套的循环(嵌套为) for i in seq_a : for j in seq_b : print ( i , j ) 将被展平为嵌套的...
findbugs是一个开源的eclipse 代码检查工具;它可以简单高效全面地帮助我们发现程序代码中存在的bug,bad smell,以及潜在隐患. 下载的文件包含如下: 1.findbugs的eclipse插件source包 2.安装及使用说明文档
为了使软件重构成为可能,已经预见了许多用于代码气味检测和/或自动或半自动重构的工具。 但是,这些工具是自反性的,是人为驱动的,因此使软件重构取决于开发人员的自然性。 尽管重构可以应用于任何编程语言,但...
代码味道重构练习 此存储库中的每个分支都有给定语言的练习。 原始源材料(在java分支中)是来自(C) Jason Gorman。 有关 TDD 和重构代码异味,请查看。
code_smell_extractor_ci 代码气味提取器在github上的项目安装要做Git: : PMD: : 系统开发Linux运行程序您必须在linux上,并且必须修改src / main / java / utilities / Utility.java中的变量: PATH_PMD =“ [您...
Form Bean是Web层的数据表示,他不能被传递到业务层;PO是持久层的数据表示,在特定... 当然了,理论是一回事,实际操作也不一定非要这样干,你可以自行取舍,在实际项目中灵活一点,增加一点bad smell,提高开发效率。
为了促进软件重构,已经提出了许多用于代码气味检测和/或用于自动或半自动重构的工具。 但是,这些工具是被动的并且是人为驱动的,因此使得软件重构取决于开发人员的自发性。 结果,在软件重构方面经验很少的软件...