上一篇是对单个方法进行整理,总结出了一些整理时需要用到的方式。现在是在对象之间进行整理。有时候一个类会非常大,可以考虑把这个大类缩小一点。
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》中的第一条就是使用静态工厂方法来创建对象。