对象技术的全部要点在于:这是一种「将数据和加诸其上的操作行为包装在一起」 的技术。有一种经典气味是:函数对某个class的兴趣高过对自己所处之host class的兴趣。这种孺慕之情最通常的焦点便是数据。无数次经验里,我们看到某个函数 为了计算某值,从另一个对象那儿调用几乎半打的取值函数(getting method)。疗法显而易见:把这个函数移至另一个地点。你应该使用Move Method (搬移函数)把它 移到它该去的地方。有时候函数中只有一部分受这种依恋之苦,这时候你应该使用 Extract Method(提炼函数) 把这一部分提炼到独立函数中,再使用Move Method(搬移函数) 带它去它的梦中家园。

当然,并非所有情况都这么简单。一个函数往往会用上数个特性,那么它究竟该被置于何处呢?我们的原则是:判断哪个class拥有最多「被此函数使用」的数据,然后就把这个函数和那些数据摆在一起。如果先以Extract Method (提炼函数)将这个函数分解为数个较小函数并分别置放于不同地点,上述步骤也就比较容易完成了。

有数个复杂精巧的模式(patterns)破坏了这个规则。说起这个话题,「四巨头」[Gang of Four]的Strategy 和Visitor立刻跳入我的脑海,Kent Beck 的 Self Delegation [Beck]也在此列。使用这些模式是为了对抗坏味道Divergent Change。最根本的原则是:将总是一起变化的东西放在一块儿。「数据」和「引用这些数据」的行为总是一起变化的,但也有例外。如果例外出现,我们就搬移那些行为,保持「变化只在一地发生」。Strategy 和Visitor『使你得以轻松修改函数行为,因为它们将少量需被覆写〔overridden)的行为隔离开来——当然也付出了「多一层间接性」的 代价。

代码的坏味道之七 :Feature Envy(依恋情结)相关推荐

  1. 简单易懂读《重构》 - Feature Envy (依恋情结)

    含义: 某个函数为了实现其功能,经常从另一个类中获取大量数据.比起自身所在的类来说,更加依赖于另一个类 坏处: 代码结构混乱,类分功不明确,可能造成其他坏味道. 目标: 确定类的具体作用,并合理摆置每 ...

  2. 3.7 Feature Envy 依恋情结

    数据本身和对数据的操作没有包装在同一个类中,则形成依恋情结 方法对某个类的兴趣大于对自己所处类的兴趣 使用 7.1 Move Method 迁移方法 将该方法移至他应该属于的类 方法的一部分更适合于其 ...

  3. 3.7 Feature envy(依恋情结)

    函数对某个类的兴趣高过对自己所处类的兴趣. 一个函数往往会用到几个类的功能,那么它究竟该被置于何处呢?判断哪个类拥有最多被此函数使用的数据,然后就把这个函数和那些数据摆在一起. 将总是一起变化的东西放 ...

  4. 重构——代码的坏味道

    1. Duplicated Code(重复的代码)   臭味行列中首当其冲的就是Duplicated Code.如果你在一个以上的地点看到相同的程序结构,那么当可肯定:设法将它们合而为一,程序会变得更 ...

  5. 21 种代码的坏味道

    1.Duplicated Code(重复的代码) 臭味行列中首当其冲的就是Duplicated Code.如果你在一个以上的地点看到相同的程序结构,那么当可肯定:设法将它们合而为一,程序会变得更好. ...

  6. 《重构 改善既有代码的设计》之代码的坏味道

    1 简介 知道"如何"不代表知道"何时".决定何时重构.何时停止和知道重构机制如何运转一样重要. 从我们的经验来看,没有任何量度规矩比得上一个见识广博者的直觉. ...

  7. 代码重构/坏味道详解

    推荐本书<重构 改善既有代码的设计> 建议购买正版图书 电子版:http://download.csdn.net/download/sunny_ran/10139470 1.Duplica ...

  8. 重构-改善既有的代码设计-------代码的坏味道

    重构-改善既有的代码设计 代码的坏味道 神秘命名(Mysterious Name) 给函数.变量.模块和类命名时,要使它能清晰地表明自己的功能和用法,使得写下的代码直观明了. 常用重构手法为重命名,包 ...

  9. 读书笔记之《重构》第三章—代码的坏味道

    第三章 代码的坏味道 这一章告诉我们,什么样的代码需要去重构,该用什么方法.寻找代码的坏味道,就是从代码中找出特定的结构,这些结构指出重构的可能性.寻找这些结构,需要学会判断,判断一个类里面有多少实例 ...

最新文章

  1. Linux命令之ln软链接
  2. selectpselect/pollppoll/epoll
  3. 详解JavaScript中ES5和ES6的类、继承之间区别和联系
  4. HDU-3038-How Many Answers Are Wrong
  5. OpenCASCADE:形状愈合之形状加工
  6. Nova虚拟机启动提示libvirtError
  7. [C++ STL algorithm] lower_bound、upper_bound、unique的本质
  8. Spring Boot----Dubbo
  9. ztree 后台异步加载_zTree异步加载实现
  10. mvc npoi将List实体导出excel的最简单方法
  11. 【细胞分割】基于matlab中值滤波+分水岭法细胞计数【含Matlab源码 640期】
  12. 华为认证的好处是什么?考试费是多少?
  13. Unix 环境高级编程书(第三版)源码编译(apue.3e)
  14. php api 文档 管理,Api开发者福利之api在线管理,模拟请求测试,文档生成工具--Apizza...
  15. 又是一年“剁手”时,AI一下更优惠?
  16. C语言从键盘输入1605,山东理工大学ACM平台题答案关于C语言 1605 Balloon Comes!
  17. 软件测试工程师怎么写okr,测试工程师提高质量的OKR该如何写?
  18. Nebula图数据库
  19. amcharts图表使用总结
  20. 70个JavaScript面试问题

热门文章

  1. Linux查看硬盘属性(机械硬盘/固态硬盘)
  2. 关于C语言define的边缘效应
  3. MSF Project Management Discipline
  4. .net 之美读书笔记
  5. draco压缩引擎学习笔记(一)
  6. java秋招面试攻略
  7. 本地地址映射成外网地址工具-ngrok
  8. [读书笔记]Core Java: Volume I - Fundamentals Chapter 1
  9. MRS CDL架构设计与实现
  10. 爬取QQ音乐周杰伦歌曲的歌词