重构:二、在对象之间搬移特性

来源:互联网 发布:微博营销号 知乎 编辑:程序博客网 时间:2024/05/16 16:08

上一篇是对单个方法进行整理,总结出了一些整理时需要用到的方式。现在是在对象之间进行整理。有时候一个类会非常大,可以考虑把这个大类缩小一点。

    • 搬移方法
    • 搬移字段
    • 提炼类
    • 将类内联化
    • 隐藏委托关系
    • 移除中间人
    • 引入外加函数

1. 搬移方法

如果某个方法大量依赖另一个对象中的方法,可以考虑将这个方法搬移到另一个对象里面。
这里写图片描述

2. 搬移字段

如果当前类的某个字段,在另一个类中多次被使用到,应该将当前类中的这个字段移动到那个类中。

3. 提炼类

某个类做了本该由两个来做的事。建立一个新类,将相关内容搬移出去。
一个类,应该是一个清晰的抽象,它应该只负责和他相关的内容。如果随着需求的逐渐增加,每次增加的需求又觉得不值得放到一个单独的类,而放在当前类中,需求越多,这个类就越来越臃肿。所以,每一次新的需求,如果与当前类本身无直接关系的话,应该把它挡在一个单独的类中。
这一点我觉得是比较有用的。根据实际工作,举一个简单的例子:
购买商品,使用微信进行支付,如果你关注了某个公众号,一旦成功支付,这个公众号便给你发送一条支付成功的消息,当然,这条消息是含有广告链接的,一旦你点击,就会跳转到一个广告页。后台要处理的事是,生成广告信息,同时发送微信消息。
这里写图片描述

public class Ad{    public void generateAd(){        //...生成广告        saveAd();        sendMsg();    }    private void saveAd(Ad ad){        //...保存广告    }    private void sendMsg(){        //...推送微信消息    }}

如果做过微信开发,肯定会知道,推送微信消息需要封装消息对象。推送不同的消息,消息对象都不同。广告类,它本身的目的是生成广告,并且保存广告,现在有一个新的需求,推送微信消息,把这个需求放在广告类中,似乎有点不合理,所以,可以考虑将推送微信消息独立为一个单独的类。至于这个类公不公开,需要看实际情况,如果不公开,就将它放在同一个包下。

public class Ad{    SendMsg sendMsg = new SendMsg();    public void generateAd(){        //...生成广告        saveAd();        sendMsg.send();    }    private void saveAd(Ad ad){        //...保存广告    }}public class SendMsg{    public void send(){        //...推送微信消息    }    ...其他方法}

4. 将类内联化

某个类,没有做太多事,可以将这个类移动到使用它的类中。
这种做法和上一步的提炼类恰好相反。

5. 隐藏委托关系

客户端和服务端之间的应用,客户端调用一系列服务接口完成一件事,可以封装为让服务端提供一个接口由客户端调用,而不公开其他的接口,这样一旦发生了什么变化,只需要修改一个地方就可以,不然客户端到处调用,都要逐个去修改。
这种方式其实就是外观模式。
这里写图片描述

6. 移除中间人

这方方式和方式5相反。如果是一个比较简单的业务逻辑,就不需要使用外观模式了。

7. 引入外加函数

有时候尽量使用静态工厂方法来创建对象。这样做的好处是,方法名可以直接表达其意图。javaAPI中有很多类都是以简单工厂方法来创建的。
例如Boolean类的valueOf()方法。
如果不存在 valueOf,会是一下结构:

public final class Boolean {    public Boolean(String str) {        if(parseBoolean(s)) {            new Boolean(true);        } else {            new Boolean(false);        }    }}

使用构造器也是可以的,一个类如果提供多个构造器,在使用时,就有点混乱了。而且一个构造器并不能直接表示出它的意图。而是用静态工厂方法模式,能很好地达到这一个效果:

public final class Boolean {    public static final Boolean TRUE = new Boolean(true);    public static final Boolean FALSE = new Boolean(false);    public static Boolean valueOf(String s) {        return parseBoolean(s) ? TRUE : FALSE;    }}

《Effective Java》中的第一条就是使用静态工厂方法来创建对象。

阅读全文
0 0
原创粉丝点击