读《重构-改善既有代码的设计》的感悟

最近一段时间读了几本不错的书:

《黑客与画家》

《代码大全》

《重构-改善既有代码的设计》

收获良多。不知不觉中自己曾经困惑的问题渐渐被解决了。困惑通常就像散列的点,散落在我们的知识网络中,没有一条线将他们连接起来。我不知道到底自己应该选择怎样的方向,所以选择多读书,多扩展知识面,这样的话说不定在读书过程中就能过无意的将两个散落的困惑连上线,从而将困惑解开,然后突然间或豁然开朗的感觉,这也许就是读书最美的地方,有点类似连连看的的感觉呢。

接下来说说看《重构》一书中收获的东西。

钻石要在阳光下才会闪耀

知识要在合适的时候出现,才会显现出其价值。当知识、阅历尚浅的时候如果直接告诉我们一个终极道理,我们是理解不了的。

为什么对《重构》一书特别有感触呢?

这是因为这本书断断续续看了很长时间,刚开始一个例子很吸引人,然后就一口气看了3,4章,后面开始觉得乏味了就没看了,每次看也都是在回老家的路上拿出来看看。没吸引力的话只能说自己可能没遇到过那种情况,以至于对书中提出的对解决方案没有共鸣。不过随着开发时间的增长,看着代码渐渐失去控制,渐渐开始困惑,到底好的程序是怎么写出来的呢?

工作中被爆过几次Bug,因为少了对对象空指针的判断。其实这个问题我知道,但是我总是不情愿写很多的判断语句,如果每一个字段都要判断,那代码写出来得多难看啊。

也正是困惑的时候,我拿起闲置已久的《重构》,开始寻求解答,先看的是如何将代码中的类型编码用多态的方式消除,简单说来也就是如何利用面向对象的多态避免使用switch或者if来对场景进行判断。

突然意识到虽然自己使用的是支持面向对象特性的语言,但是写程序的思维还是过程化的。我知道面向对象的基本特性: 多态, 封装, 继承。知道Java是面向对象语言,知道Class可以定义对象。所以我以为我用了Class我就是面向对象编程,所以我以为我给同名称的方法提供了不同的实现就是多态了,结果却发现代码中时常会出现大段的 if-else or switch。当然这只是其中一部分问题。

我真的了解多态吗?

看着《重构》中作者运用不同的手法将代码修理的清秀漂亮,才知道原来我只得面向对象其形。随着书渐渐接近尾声,我也看到了如何运用 Introduce Null Object 去除代码用户对Null值得检验。运用多态一切是那么自然。

正如下面的代码:

Customer customer = site.getCustomer();
String customerName;
if (customer == null)
    customerName = "occupant";
else 
    customerName = customer.getName();

使用Customer的用户需要对customer的情况进行判断从而决定采取的逻辑。但是如果使用 Introduce Null Object 的方法,可以减少用户方面的代码,让代码更简洁。

简单的说 Introduce Null Object 就是将要判Null的对象建立一个对应的 Null 对象,上例的话就是 NullCustomer, 用这个 Null 对象来处理为 Null 时的情况,更具体的请看下面代码:

class NullCustomer extends Customer {
    public string getName(){
        return "occupant";
    }
}

同时要修改 Site 类的 getCustomer()方法:

class Site{
    ...
    Customer customer;
    Customer getCustomer(){
        return customer == null ? new NullCustomer() : 
            customer;
    }
}

这样的话我就可以将原来的引用代码改写成

Customer customer = site.getCustomer();
String customerName = customer.getName();

这样就不用担心 Null 的判断问题了。

自从读完《重构-改善既有代码的设计》我承认我确实没有透彻的理解多态,工作中的代码有很多地方的设计可以用多态解决。

由此我不得不问自己这样一个简单的问题:我真的将面向对象理解透彻了吗?

结语

不过,话又说回来,如果有某人过早的告诉我这样的好处,我也未必领会其中奥妙,因为我尚未体验经历这样的需求,所以这样的知识对我不是必须的。当我有这样的需求以后,再告诉我这样的方法,那么体会会愈加深刻。

想来生活也是如此,都道平平淡淡才是真,也只有从体会过生活艰辛的口中说出简单的道理才会格外的有力量。哈哈。


最后再次推荐 《重构-改善既有代码的设计》,确实是一本可多得的好书,哈哈。

额,我得抽空去解决我那些看起来丑陋的代码了。