• 在代码重构中蜕变
    时间:2012-06-24   作者:caowenbin   出处:blog.csdn.net/caowen

    这几天,要对我半年前写的代码进行一些整理工作,在看代码时发现当时有很多地方写得不够好,俗称的有“坏味道”,呵呵,重构,必须的。

    几年前通读过《重构,改善既有代码的设计》一书,虽然对各种重构模式或方法记忆有限,但精髓还是记住了:改代码而不改变软件的外在表现,循序渐进。

    其实,重构是一个开发人员的基本工作内容,是在每天的开发过程中都要用到的。离开了重构和测试,代码质量是难有保障的。有人会说没有用到重构,其实最简单的例子,当你发现一个类中有几处用到了相同的代码,你把这几行代码提取到了一个私有函数中以供复用,这就是一次重构。所以说,别跟人炫耀你会重构,这是基本功。

    好久没更新博客了,借此说说我的一点心得吧。

    1. 目的明确。代码是一种平衡的产物,很多地方都在保持着某种平衡,有功能与性能的平衡,有可靠性与可维护性的平衡等等,每一次动手,都要有一个目标,是想改进局部代码,还是想改进类结构,只有针对不同的目的才能实施不同的方法。

    2. 评估影响。改动前,最好能有个预估,对可能产生的影响做到心中有数,以免引起不必要的后果。在“坏味道”的代码中是很有可能牵一发而动全身的,要注意安全。如果只是对类的私有成员的改动,那通常影响的范围有限,如果涉及到对公有成员或保护成员的改动,那就要注意了,简单的评估方式是充分利用IDE的搜索、引用等功能,把引用过此成员的代码行全部找出来,看看影响的范围有多广,如果有些代码不在你的控制之内,那就要慎重考虑这个重构了。

    3. 慎改结构。设计人员或架构师在定义类结构的时候一定有他的综合考虑,在没有充分理解之前,请慎重吧。不要拿设计模式去套现有的结构,设计模式是个指导,如果学完设计模式还在硬用来套用,那这种僵化的思维还不如不学的好。所以,当想要做这样的重构时,请与你的设计师、架构师或有经验的同事协作,除非你自己就是设计师。

    4. 小步伐前进。每次改动尽量小,这样可以把影响限制到小范围。就像一个公式一样,如果同时改变其中的几个变量,那很难说是哪一个影响了结果,但如果一次只改变其中的一个,就可以确认其对结果的影响。尤其是当代码已经完成了用户需求,这时的重构只是为了让代码更好,切忌不要影响到已经得到用户确认的外在表现。

    5. 测试。无论你的开发是否是测试驱动,在重构时测试是保证代码正确的必要手段。修改-编译-测试,重复这个过程,直到达到目的。

    当你花了几分钟或者几个礼拜,已经让代码大为清爽的时候,回过头来对比曾经的“坏味道”,我想,你会喜欢上代码的,重构会发生在你写下一行代码的时刻,变成了编码能力了。

    少一行代码,就少一分出错的可能,别心疼你删除掉的代码,虽然那是你的心血,但那已经是历史,在重构代码中蜕变已经完成。

    网友留言/评论

    我要留言/评论

    相关文章

    搞懂java中的synchronized关键字:实际上,我关于java的基础知识的90%以上都来自Thinking in Java。对于其中的synchronized关键字,当时就是浏览一下,大概知道意思,也没有细看。后来一直没有用过这个关键字。昨天看Thinking in Patterns with Java中的Observer模式,看了其中的Observable类的源码,发现里面几乎所有的方法都用了synchronized关键字(不是全部),其中个别用了synchronized(this){}的区块。于是,我发觉有必要好好理解一下这个关键字了。
    JAVA中synchronized与static synchronized 的区别:通过分析这两个关键字的分析,我们可以理解java中锁的概念。一个是实例锁(锁在某一个实例对象上,如果该类是单例,那么该锁也具有全局锁的概念),一个是全局锁(该锁针对的是类,无论实例多少个对象,那么线程都共享该锁)。实例锁对应的就是synchronized关键字,而类锁(全局锁)对应的就是static synchronized(或者是锁在该类的class或者classloader对象上)。
    建造者模式(Builder)举例介绍:Builder模式的定义是:将一个复杂对象的构建与其表示相分离,使得同样的构建过程可以创建不同的表示。 首先它意图是要构建一个复杂的对像,而这个复杂的对像往往需要由好几个子对像或分步聚来完成最终的这个对象的构建,而这个复杂对象的子对像经常需要不断的变化,但它的构建过程是相对是稳定的。
    有关Android Activity生命周期详解:生命周期,对于初学者来讲可能比较深奥。在各种面试中,常常会被问到xxx的生命周期是什么样子的,比如:Servlet的生命周期,Spring Bean的生命周期。今天就详细的讲解一下Android Activity 的生命周期。文章主要涉及到如下几个部分:生命周期图,测试代码,结果分析。
    使用Java进行冒泡排序(冒泡排序示例):冒泡排序(Bubble Sort)是一种简单的排序算法。它重复地走访过要排序的数列,一次比较两个元素,如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需要交换,也就是说该数列已经排序完成。这个算法的名字由来是因为越小的元素会经由交换慢慢“浮”到数列的顶端。
    Java面试题中关于HashMap的小小总结:面试过程中往往会被问关于HashMap的问题,比如:说说Hashpmap的原理,HashMap怎样保证key的唯一性。下面小编给大家简单介绍一下关于HashMap的小小总结。
    JAVA正则表达式:Pattern类与Matcher类详解:java.util.regex是一个用正则表达式所订制的模式来对字符串进行匹配工作的类库包。它包括两个类:Pattern和Matcher Pattern 一个Pattern是一个正则表达式经编译后的表现模式。 Matcher 一个Matcher对象是一个状态机器,它依据Pattern对象做为匹配模式对字符串展开匹配检查。 首先一个Pattern实例订制了一个所用语法与PERL的类似的正则表达式经编译后的模式,然后一个Matcher实例在这个给定的Pattern实例的模式控制下进行字符串的匹配工作。
    线上解决Resin服务响应过慢的几个方法:最近Web服务访问量过大,由于服务器配置比较差,数量也较少,导致服务响应过慢。为了优化服务和提高响应,下面总结出几条查询Resin问题的方法。
    Java 中 Listener 模式示例:Listener模式在Java中很常见,并且很有用,下面例举一下Java的Listener模式,希望对大家有所帮助。
    Java Annotation手册(详解):在上篇文章《Java Annotation入门》中概要性的介绍了Annotation的定义、使用,范围涵盖较广,但是深度不够。所以作者在《Java Annotation入门》后,继续整理了Annotation的概念和知识点,与喜欢research的朋友们共享。