重构

来源:互联网 发布:软件开发外派怎么样 编辑:程序博客网 时间:2024/04/30 10:04

代码质量一直是一个严重的问题,但是很多人都不是很重视。在程序员中,努力学习技术(如算法,CLR,SQL,WPF,WCF,NoSQL等),但是努力去学习重构及相关的知识,如单元测试,设计模式等的人却很少,觉得这些都是理论知识,不是技术,普通的开发人员用不上,是比较高层次的人才会用到的东西。其实重构方面的知识,对于普通开发人员更应该去学,因为越高层次的人写的代码越少,甚至一个项目只写核心或底层部分代码,大部分代码还是普通人员进行编写。所以,在这里简单的介绍重构的意义,希望人们能够稍微注重下重构,提高编写代码的质量。(PS:其实学习重构,还可以改善自己的工作方式和态度。重构就是要不断完善自己代码,工作也一样,也要不断完善自己的工作内容和方式,并不是做完就没事了。)

         重构:对软件内部结构的一种调整,目的是在不改变“软件之可察行为”前提下,提高其可理解性,降低其修改成本。

不注重重构原因:

1.       在短时间内,过程式编码在开发速度上有着明显的速度,而代码质量的效果无法在短期内展现

重构是不改变代码行为而改变代码结构的代码整理技术,它比较抽象,而且不会对功能和性能有所提高,它的作用是提高代码质量,使项目的扩展性和可维护性得到提高,而扩展和维护都是要过段时间才会开始进行。项目经历的时间越久,高质量代码的效果才会越发的明显。而采用过程式编码的话,重复代码复制,既不用如何考虑提炼代码,也不用过多的考虑提炼方法的方法名,短时间内的开发,过程式代码的速度是十分明显的。

2.       前人栽树后人乘凉

重构是为了未来做准备,而不是为了现状更好,自己做得努力,自己未必能够享受得到。

开发人员的流动性很大,很多项目的开发都经历不同的人或团队接手,有时候自己花费了大量时间和精力写出了高质量的代码,有可能接手项目的却是他人。自己的努力不一定得到领导的赏识,而接手的人却在好代码的基础上能快速开发,从而受到领导赏识。谁都不希望自己的心血是被别人享受,久而久之,也懒得去重构了。

3.       一步登天

很多人看了设计模式的书,觉得这些模式很不错,但是到了实际项目,却一点用不上,别人怎么写的代码自己也怎么写,能用到模式的地方也在项目搭建框架的时候已经设计好了,自己写的代码模式无用武之地,即使看着一堆感觉可以用设计模式重构的代码,也不知如何下手,最终什么也没有做。

设计模式为重构提供了目标。如果无法确定目标,应该先进行“小设计而不是大布局”,针对有“坏味道”的代码进行简单的重构,而不是纠结于能用什么设计模式。重构包括了很多技巧,如提炼方法、提取类、分解条件表达式等。

4.       觉得用处不大,不用那么在意

很多开发者觉得,我的代码就这么点,没必要抽取出来,我这代码就我一个人用,不影响别人。由此很多人也不会刻意去重构代码,觉得意义不大。开发中,我们经常参考到别人的代码,如果出现数行可用的代码,会选择复制,还是选择复用,结果是如何,我想大家都知道。如果那几行代码是在一个方法里呢?

千里之堤毁于蚁穴,没有人一开始就会去写很复杂的代码,庞大的类和方法,都是一段段重复的代码积累下来的。过多的积累将会使代码的重构难度提升,等意识到真的要重构的时候,或许代码已经到了非常难重构的地步了,这种情况下,重构需要花费更多的时间和精力,开发者也就更不愿去重构了。

5.       代码看不懂是因为水平不够

有部分技术牛人,觉得自己写的代码别人看不懂,才能突显出自己的技术水平高。别人看不懂自己的代码,是因为技术水平不够。

重构主要有以下优点:

1.       改善软件设计

目前大部分开发人员都是用面向对象语言,但并不是人人都写面向对象代码,依然写着过程式代码,因为过程式代码编写比较简单,直观看上去也比较好理解。随着项目规模慢慢变大,设计不良的程序出现的重复代码就会越来越多,也为未来的维护和二次开发埋下越来越多的“坑”。经常性的重构可以帮助代码维持较好的设计。

2.       提高代码可读性,可维护性

写出机器能读的代码人人都会写,但是写出人人都能读的代码,才是编程的艺术。可读性越高的代码,维护性也就越高。一段段简单易读的代码,无论是自己,还是他人阅读,都能很快的读出代码的表达的意思。

3.       提高编程速度

对于挺高编程速度,听起来有点违反直觉。改善设计、提高可读性都是提高质量,但是也要花相当的时间,怎么会提高速度。福勒(《重构:改善既有代码的设计》的作者)说:我绝对相信良好的设计是快读开发的根本。如果没有良好的设计,或许某一个时间段内你的进展迅速,但恶劣的设计很快就会让编程速度慢下来。会把很多时间花在调试,难以添加新功能。修改时间越来越长,因为必须花越来越多的时间去理解系统、寻找重复代码。经常性的重构可以阻止系统腐败变质,甚至提高设计质量。

在提高编程速度方面,将在系统的多次开发和维护后会更加明显。

重构的例子:

1.       改善软件设计例子

 对一个面向过程的代码编重构为面向对象的代码。

1)        面向过程:

编写一个程序,打印”Good morning!”。


现在要新增打印"Good afternoon!"和”Good night!”。


目前是英文,要改为输入想中文就中文,想英文就英文。


再新增输入一个时间,6-10点是早上,14-18是下午,19-24点是晚上。


要是再新增一个语言,代码代码将会变得更复杂,或者修改一个时间段,也会修改很多,下面,用面向对象来编码。

2)        面向对象

用到面向对象,就要涉及到类,打印”Good morning!”应该为人的行为,所以创建一个”Person”类,并向其添加”Good afternoon!”和”Good night!”。


现在添加语言类型,用Person就不合适了,把实现代码抽出来,新增一个抽象类,并新增两个继承它的子类。





再加上时间段,时间段,则再做出以下修改(还可以用状态模式再重构,这里只是简单举例,就不做了)


加上控制台的代码。


简单的重构就写好了,从这里可以看出,重构这个简单的“打印”的代码,利用简单工厂模式加依赖注入,使修改时间段不会影响Language的相关代码,增加语言和修改语言的内容也不用去修改Person,降低了耦合度和提高了扩展性。

但是从编写速度来说,编写这个功能的过程式代码速度更快,代码量更少,如果只是再加个时间段或者加个语言,单论实现速度,还是用过程式编写比较快,这也是为何注重重构的开发员人并不多的原因。

0 0
原创粉丝点击