java feature envy_代码的坏味道(18)——依恋情结(Feature Envy)

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

特征

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

L3Byb3h5L2h0dHBzL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXRsYW50aXMxMDI0L0phdmFQYXJ0eS9tYXN0ZXIvaW1hZ2VzLyVFNyVCQyU5NiVFNyVBOCU4Qi8lRTklQUIlOTglRTYlOTUlODglRTclQkMlOTYlRTclQTglOEIvJUU5JTg3JThEJUU2JTlFJTg0L2ZlYXR1cmUtZW52eS9mZWF0dXJlLWVudnktMS5wbmc=.jpg

问题原因

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

解决方法

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).

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

L3Byb3h5L2h0dHBzL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXRsYW50aXMxMDI0L0phdmFQYXJ0eS9tYXN0ZXIvaW1hZ2VzLyVFNyVCQyU5NiVFNyVBOCU4Qi8lRTklQUIlOTglRTYlOTUlODglRTclQkMlOTYlRTclQTglOEIvJUU5JTg3JThEJUU2JTlFJTg0L2ZlYXR1cmUtZW52eS9mZWF0dXJlLWVudnktMi5wbmc=.jpg

如果一个函数明显应该被移到另一个地方,可运用 搬移函数(Move Method) 。

如果仅仅是函数的部分代码访问另一个对象的数据,运用 提炼函数(Extract Method) 将这部分代码移到独立的函数中。

如果一个方法使用来自其他几个类的函数,首先确定哪个类包含大多数使用的数据。然后,将该方法与其他数据一起放在此类中。或者,使用 提炼函数(Extract Method) 将方法拆分为几个部分,可以放置在不同类中的不同位置。

收益

减少重复代码(如果数据处理的代码放在中心位置)。

更好的代码组织性(处理数据的函数靠近实际数据)。

L3Byb3h5L2h0dHBzL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXRsYW50aXMxMDI0L0phdmFQYXJ0eS9tYXN0ZXIvaW1hZ2VzLyVFNyVCQyU5NiVFNyVBOCU4Qi8lRTklQUIlOTglRTYlOTUlODglRTclQkMlOTYlRTclQTglOEIvJUU5JTg3JThEJUU2JTlFJTg0L2ZlYXR1cmUtZW52eS9mZWF0dXJlLWVudnktMy5wbmc=.jpg

何时忽略

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

重构方法说明

搬移函数(Move Method)

问题

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

L3Byb3h5L2h0dHBzL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXRsYW50aXMxMDI0L0phdmFQYXJ0eS9tYXN0ZXIvaW1hZ2VzLyVFNyVCQyU5NiVFNyVBOCU4Qi8lRTklQUIlOTglRTYlOTUlODglRTclQkMlOTYlRTclQTglOEIvJUU5JTg3JThEJUU2JTlFJTg0L3N3aXRjaC1zdGF0ZW1lbnRzL01vdmUlMjBNZXRob2QlMjAtJTIwQmVmb3JlLnBuZw==.jpg

解决

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

L3Byb3h5L2h0dHBzL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vYXRsYW50aXMxMDI0L0phdmFQYXJ0eS9tYXN0ZXIvaW1hZ2VzLyVFNyVCQyU5NiVFNyVBOCU4Qi8lRTklQUIlOTglRTYlOTUlODglRTclQkMlOTYlRTclQTglOEIvJUU5JTg3JThEJUU2JTlFJTg0L3N3aXRjaC1zdGF0ZW1lbnRzL01vdmUlMjBNZXRob2QlMjAtJTIwQWZ0ZXIucG5n.jpg

提炼函数(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);

}

引申阅读

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

Bad Smell (代码的坏味道)

sourcemaking 如果一段代码是不稳定或者有一些潜在问题的,那么代码往往会包含一些明显的痕迹.正如食物要腐坏之前,经常会发出一些异味一样, 我们管这些痕迹叫做 "代码异味" ...

Chapter 3 :代码的坏味道

"如果尿布臭了,就换掉它." --Beck奶奶,论保持小孩清洁的哲学 代码的坏味道这一章集中论述该何时重构.具体的重构方法在后面的章节. "没有任何度量规矩比得上见识广博 ...

重构 之 总结代码的坏味道 Bad Smell (一) 重复代码 过长函数 过大的类 过长参数列 发散式变化 霰弹式修改

膜拜下 Martin Fowler 大神 , 开始学习 圣经 重构-改善既有代码设计 . 代码的坏味道就意味着需要重构, 对代码的坏味道了然于心是重构的比要前提; . 作者 : 万境绝尘 转载请注明出 ...

Refactoring之——代码的坏味道(一)过长方法

1 代码的坏味道 重构一书中提到了22种代码的坏味道,大致可以分为几类. 识别代码的坏味道,有助于发现代码的潜在问题,从而可以有的放矢的修改现有代码,使之不断完善. 1.1 Bloaters(臭鲱,暂 ...

消灭 Java 代码的“坏味道”

消灭 Java 代码的“坏味道” 原创: 王超 阿里巴巴中间件 昨天 导读 明代王阳明先生在谈为学之道时说: 私欲日生,如地上尘,一日不扫,便又有一层.着实用功,便见道无终穷,愈 ...

【转】Bad Smell(代码的坏味道)

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

代码的坏味道(22)——不完美的库类(Incomplete Library Class)

坏味道--不完美的库类(Incomplete Library Class) 特征 当一个类库已经不能满足实际需要时,你就不得不改变这个库(如果这个库是只读的,那就没辙了). 问题原因 许多编程技术都建 ...

代码的坏味道(19)——狎昵关系(Inappropriate Intimacy)

坏味道--狎昵关系(Inappropriate Intimacy) 特征 一个类大量使用另一个类的内部字段和方法. 问题原因 类和类之间应该尽量少的感知彼此(减少耦合).这样的类更容易维护和复用. 解 ...

随机推荐

SQL Server 存储(5/8):理解IAM 页

在以前的文章里,我们讨论了数据页,GAM和SGAM,还有PFS页.今天我们一起来讨论下索引分配映射(Index Allocation Map:IAM)页. 在SQL Server 2005和以后的版本 ...

CSS 3 盒子属性

#box1{ width: 100px;height: 40px; border: 1px solid black;(1)内容沾满盒子的处理方式 所有的都要添加前缀,以便更好的浏览器兼容  1,ove ...

mongo 查找附近点

db.runCommand({geoNear:"demo", near: { type: "Point" , coordinates: [118.134535, ...

CJOJ 1087 【NOIP2010】乌龟棋 / Luogu 1541 乌龟棋(动态规划)

CJOJ 1087 [NOIP2010]乌龟棋 / Luogu 1541 乌龟棋(动态规划) Description 小明过生日的时候,爸爸送给他一副乌龟棋当作礼物. 乌龟棋的棋盘是一行N个格子,每个 ...

【前端】Util.js-ES6实现的常用100多个javaScript简短函数封装合集(持续更新中)

Util.js (持续更新中...) 项目地址: https://github.com/dragonir/Util.js 项目描述 Util.js 是对常用函数的封装,方便在实际项目中使用,主要内容包 ...

机器学习-kNN

基于Peter Harrington所著 kNN,即k-NearestNeighbor算法,是一种最简单的分类算法,拿这个当机器学习 ...

JDK的安装和Java环境变量配置

所需工具:JDK    下载地址:http://www.oracle.com/technetwork/java/javase/downloads/index.html

HTML5 & CSS3初学者指南(4) – Canvas使用

介绍 传统的HTML主要用于文本的创建,可以通过标签插入图像,动画的实现则需要第三方插件.在这方面,传统的HTML极其缺乏满足现代网页多媒体需求的能力.HTML5的到来,带来了新 ...

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值