重构:二、在对象之间搬移特性
来源:互联网 发布:微博营销号 知乎 编辑:程序博客网 时间: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》中的第一条就是使用静态工厂方法来创建对象。
- 重构:二、在对象之间搬移特性
- 重构之在对象之间搬移特性
- 重构系列4.在对象之间搬移特性
- 重构摘要7_在对象之间搬移特性
- 读书笔记 ------ 重构 -> 在对象之间搬移特性
- 重构之在对象之间搬移特性
- 重构手法-在对象之间搬移特性
- 重构手法(二) —— 在对象之间搬移特性
- 在对象之间搬移特性(二)
- 《重构改善既有代码的设计》之重构列表--在对象之间搬移特性(二)
- 在对象之间搬移特性---搬移函数
- 在对象之间搬移特性
- PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性
- PHP 杂谈《重构-改善既有代码的设计》之二 对象之间搬移特性
- 重构方法之对象之间搬移特性
- 《重构》读书笔记(七)——第七章 在对象之间搬移特性
- 重构改善既有代码的设计--在对象之间搬移特性
- 《重构--改善既有代码的设计》--在对象之间搬移特性(7)
- Eclipse vs. IDEA快捷键对比大全
- iOS生成原生二维码
- 提高编码技能的10个小窍门
- LeetCode 485:Max Consecutive Ones(连续1的最大个数,边界条件)
- 利用Tlbimp.exe和AxImp.exe将ocx 控件转换为公共语言类型程序集
- 重构:二、在对象之间搬移特性
- CentOS安装mysql环境
- 使用GraphViz画caffe的网络结构图
- Oracle/MySQL/SQL Server查询前N条数据
- 防止页面以外的提交
- 《N-blog》学习笔记......
- Thread的start()和join()方法
- 《自控力》-- 精华摘抄
- 关于AndroidStudio如何导入新项目LibraryProject以及遇到的一些问题