坏味道——依恋情结(Feature Envy)

特征

一个函数访问其它对象的数据比访问自己的数据更多。

问题原因

这种气味可能发生在字段移动到数据类之后。如果是这种情况,你可能想将数据类的操作移动到这个类中。

解决方法

As a basic rule, if things change at the same time, you should keep them in the same place. Usually data and functions that use this data are changed together (although exceptions are possible).

有一个基本原则:同时会发生改变的事情应该被放在同一个地方。通常,数据和使用这些数据的函数是一起改变的。

  • 如果一个函数明显应该被移到另一个地方,可运用 搬移函数(Move Method)
  • 如果仅仅是函数的部分代码访问另一个对象的数据,运用 提炼函数(Extract Method) 将这部分代码移到独立的函数中。
  • 如果一个方法使用来自其他几个类的函数,首先确定哪个类包含大多数使用的数据。然后,将该方法与其他数据一起放在此类中。或者,使用 提炼函数(Extract Method) 将方法拆分为几个部分,可以放置在不同类中的不同位置。

收益

  • 减少重复代码(如果数据处理的代码放在中心位置)。
  • 更好的代码组织性(处理数据的函数靠近实际数据)。

何时忽略

  • 有时,行为被有意地与保存数据的类分开。这通常的优点是能够动态地改变行为(见策略设计模式,访问者设计模式和其他模式)。

重构方法说明

搬移函数(Move Method)

问题

你的程序中,有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用。

解决

在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或是旧函数完全移除。

提炼函数(Extract Method)

问题

你有一段代码可以组织在一起。

void printOwing() {
  printBanner();

  //print details
  System.out.println("name: " + name);
  System.out.println("amount: " + getOutstanding());
}

解决

移动这段代码到一个新的函数中,使用函数的调用来替代老代码。

void printOwing() {
  printBanner();
  printDetails(getOutstanding());
}

void printDetails(double outstanding) {
  System.out.println("name: " + name);
  System.out.println("amount: " + outstanding);
}

引申阅读

欢迎继续阅读 代码的症与药 系列文章。

最新文章

  1. OUTLOOK 发生错误0x8004010D
  2. 终极解决maya渲染层丢材质,变线框等问题
  3. 解决WampServer中MySQL数据库中文乱码的问题
  4. JavaWeb学习----JSP简介及入门(含Eclipse for Java EE及Tomcat的配置)
  5. c++ map删除元素
  6. MVC项目实践,在三层架构下实现SportsStore-07,实现订单提交
  7. 基本STRUTS标签-学习笔记-Bean标签
  8. [牛感悟系列]JAVA(1)理解JAVA垃圾回收
  9. Ios 给imageview 添加手势没有反应
  10. (一)Builder(建造者)模式
  11. Linux 下 编译Xerces-c++
  12. linux操作日志:远程登录设置
  13. 网络编程基础API
  14. 【数据库】MySql分割字符串
  15. 二十一、当锚点遇到fixed(margin和padding)
  16. js中常用的offset client screen对象
  17. eclipse maven scm
  18. splitter 使用
  19. 21. orcle导出sql脚本时,提示“超出打开游标最大数”
  20. 【转】SQL SERVER 2005/2008 中关于架构的理解

热门文章

  1. IE6/7下空div占用空间的问题
  2. Web性能优化:图片优化
  3. 谈一下关于CQRS架构如何实现高性能
  4. Laravel Composer and ServiceProvider
  5. dagger2系列之依赖方式dependencies、包含方式(从属方式)SubComponent
  6. springmvc SSM 多数据源 shiro redis 后台框架 整合
  7. MySQL,MariaDB:Undo | Redo [转]
  8. js实现四大经典排序算法
  9. iOS9支付宝无法调起客户端
  10. 使用Xamarin开发iOS7应用时隐藏StatusBar方法