在对象之间搬移特性---搬移函数

《重构-改善既有代码的设计》知识精选——重构方法合集 重新组织函数Extract Method(提炼函数)有一段代码可以被组织在一起并独立出来。将一段代码放进一个独立函数中,并让函数名称解释该函数的用途。 创造一个新函数,根据这个函数的意图来给它命名(以它「做什么」来命名, 而不是以它「怎样做」命名)。Inline Method(将函数内联化)一个函数,其本体(method body)应该与其名称(method name)同样清楚易懂。在函数调用点插入 阅读详情
你的程序中,有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用
在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数。
,或是将旧函数完全移除。

动机:

搬移函数是重构理论的支柱。如果一个类有太多行为,或者一个类与另外一个类有太多合作而形成高度耦合,就需要搬移函数。通过这种手段,可以使系统中的类更简单,这些类最终也将更干净利落的实现系统交付的任务。
首先浏览类的所有函数,从中寻找这样的函数:使用另一个对象的次数比使用自己所驻对象的次数还多。一旦移动了一些字段,就该做这样的检查。一旦发现有可能搬移的函数,就需要观察调用它的那一端、它调用的那一端,以及继承体系中它的任何一个重定义函数。然后,会根据“这个函数与哪个对象的交流比较多”,决定其移动路径。

范例:

用一个账户的Account类来说明这项重构:

Class  Account....
double overdraftCharge(){
  if(_type.isPremium){
double result=1.0;
if(_daysOverDrawn>7)
result+=(daysOverDrawn-7)*0.85;
}
else 
return daysOvedrDrawn*1.75;
}

double bankCharge(){
duoble result=4.5;
if(_daysOverDrawn>0){
result+=overdraftCharge();
return result;
}

}

private AccountType _type;
private int _daysOVerDrawn;

假如有几种新账户,每一种都有自己的“透支金额计费规则”。所以我希望将overdraftCharge()搬移到AccountType类中去。

class AccountType{
double overdraftCharge(int daysOverdrawn){
if(isPremium){
double reuslt=10;
if(daysOverdrawn>7)result+=(daysOverdrawn-7)*0.85;
reutrn result;
}else{
return daysOverdrawn*1.75;
}
}
}

将原函数中的函数本体替换为一个简单的委托动作:
Class Account...
double overdraftCharge(){
return _type.overdraftCharge(_daysOverdrawn);
}

此例中被搬移函数只引用了一个字段_daysOverdrawn;所以只需要将这个字段作为参数传递给目标函数就行了。如果被搬移函数调用了Account中的另一个函数,就不能这么简单的处理了。这种情况下必须将源对象传递给目标函数。
Class AccountType...
double overdraftCharge(Account account){
if(isPremium){
double result=10;
if(account.getDaysOverdrawn()>7){

result+=(account.getrDaysOvderDrawn()-7)*0.85;
return result;
}else{
return account.getDaysOverDrawn()*1.75;
}
}
}

如果需要源对象的多个特性,那么也需要将源对象传递给目标函数。不过目标函数如果需要太多源对象的特性,就得进一步重构。通常这种情况下,就会需要分解函数,并将其中一部分移回源类。







Python 代码的重构改善原则 (一)重构原则 1、何谓重构 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。 另一种解释是:使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。 重构不止是代码整理,它提供了一种高效且受控的代码整理技术 2、为何重构 改进软件设计:如果没有重构,程序的设计会逐渐变质,重构很像是在整理代码,你所做的就是让所有的东西回到应处的位... 阅读详情

相关推荐

手把手教你用OpenRouter免费模型:从DeepSeek V3.1到Llama 3.3的实战指南

本文详细介绍了如何利用OpenRouter平台免费接入DeepSeek V3.1、Llama 3.3等53个AI模型,提供从账号注册到实战应用的完整指南。通过文本摘要、客服对话生成和代码生成等具体案例,帮助开发者高效利用免费模型资源,提升AI应用开发效率。

weixin_29258297的博客 3557

重构-改善既有的代码设计(三)

1. 在对象之间搬移特性1.1 Move Method(搬移函数)你的程序中,有个函数与其所驻类之外的另一个类进行更多交流,调用后者或者被后者调用。在该函数最常用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或者将旧函数完全移除。 动机 如果一个类中有太多行为,或者如果一个类与另一个类有太多合作而形成高度耦合,就应该搬移函数。 做法 - 检查源类中被源函数所使用的一切特

哼哼的博客 434

STM32串口通信实战:从CubeMX配置到printf重定向全解析

串口通信是嵌入式系统中最基础且广泛使用的数据交换方式,它基于异步串行通信原理,通过TX(发送)和RX(接收)两根信号线实现设备间的全双工通信。其技术价值在于协议简单、硬件成本低、可靠性高,是单片机与上位机调试、传感器数据采集、设备控制等场景的首选方案。在STM32等ARM Cortex-M系列MCU中,USART外设通过硬件自动处理时序,大大减轻了CPU负担。本文聚焦于嵌入式竞赛与开发中的高频需求,以STM32G431RBT6为例,详解通过CubeMX配置USART1、实现按键触发数据发送、并完成print

weixin_30603633的博客 546

7.1 move method (搬移函数)

程序中,有个函数与其所驻类之外的另一个类进行更多交流:调用后者,或被后者调用。 在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或是将旧函数完全移除。 动机: 如果一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合,我就会搬

ptn3900的专栏 920

PHP特性知识点总结

(1)类型转换之前提到过的是字符串转为整型。其实php手册里面提到了各种类型的转换。先把他放在这里。我们按照php手册上的顺序来介绍,只介绍几个比较常用的。①转化为bool②转化为整型int。

m0_73605862的博客 1295

[原创]Linux 802.11n CSI tool Monitor模式

Linux 802.11n CSI tool Monitor模式 使用AP模式的缺陷在于ping 命令速度比较慢,且不能精确控制发送的参数,比如接收的包数量是不可控的。Monitor模式可以调制发送速率、发包数量、发送天线个数、HT模式、short/long guard interval等等,因此调通Monitor模式是必须的。期间参考了博主沃一德的CSI Tool安装使用讲解,对他的工作表示感...

u014645508的博客 1万+

重构手法列表——在对象之间搬移特性

搬移函数(Move Method) 现象:有函数与其所驻类之外的另一个类进行更多交流:调用后者或被后者调用 动机:两个类并无太多合作,但是出现了高度耦合。 做法:在该函数最常引用的类中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数,或是将旧函数完全移除 搬移字段(Move Field) 现象:某个字段被其所驻类之外的另一个类更多地用到 动机:把职责迁移到更适合它的地方去 做法:在目标...

秋千不会坠的博客 758

【开关电源篇】整流及其滤波电路的工作原理和设计指南-超简单解读

半波整流是一种利用二极管的单向导通特性,将交流电转换为直流电的基础电路。它通过“切除”交流电的半个周期,仅保留另外半个周期来实现整流。1 开关电源超快学习思路点击跳转1.1开关电源的原理、结构和实物入门篇-超简单解读点击跳转1.2开关电源的EMI输入电路-超简单解读点击跳转倍压整流适用于需要高电压、小电流的特殊场合,通过电容充放电实现电压倍增。

2301_81299416的博客 2924

重构-改善既有代码的设计 读书笔记

重构-改善既有代码的设计 书名:重构-改善既有代码的设计 作者:Martin Fowler 译者:熊节 主要内容: 重构,一言以蔽之,就是在不改变外部行为的前提下,有条不紊地改善代码。多年前,正是本书原版的出版,使重构终于从编程高手们的小圈子走出,成为众多普通程序员日常开发工作中不可或缺的一部分。本书也因此成为与《设计模式》齐名的经典著作,被译为中、德、俄、日等众多语言,在世界范围内畅销不衰。 第二章 重构原则 何为重构 重构(名词):对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提

努力推石头的西西弗斯 698

Python爬虫:爬取拼多多平台商品信息、销量、价格等数据

在本篇博客中,我们将深入探讨如何使用Python爬虫技术爬取拼多多平台的商品信息,包括商品的标题、销量、价格等详细数据。拼多多的商品页面通常是分页展示的,因此我们需要遍历多个页面,获取所有商品的信息。每个商品在拼多多平台上都有一个唯一的商品ID,我们可以通过该ID访问商品页面。通过以上的技术方案和代码示例,你已经掌握了如何使用Python爬虫获取拼多多平台上的商品信息、销量、价格等数据。等技术,解决拼多多平台的反爬虫机制,成功抓取我们所需的商品数据。,我们能够应对拼多多的反爬虫机制,稳定地获取到商品数据。

2201_76125261的博客 3656

【Coppeliasim|轨迹规划(三)】机械臂逆解

文章目录一些设置导航点设置添加连接用于碰撞的设置代码实现终端输出 一些设置 导航点设置 关于如何添加设置 dummy 的细节建议参考官方手册,这里不再赘述。 添加连接用于碰撞的设置 按照序号点击(一个是机械臂,一个是所有的物体除了机械臂): 代码实现 getMatrixShiftedAlongZ=function(matrix,localZShift) local m={} for i=1,12,1 do m[i]=matrix[i] end

【人工智障 | 计算鸡视觉 | 机器孩】 1万+

Move Method(搬移函数)

动机 “搬移函数”是重构理论的支柱。如果一个类有太多行为,或如果一个类与另一个类有太多合作而形成高度耦合,我就会搬移函数。通过这样的手段,可以使系统中的类更简单,这些类最后也将更干净利落地实现系统交付的任务。 做法 检查源类中被源函数所使用的一切特性(包括字段和函数),考虑它们是否也该搬移(如果某个特性只被你打算搬移的那个函数用到,就应该将它一并搬移。如果另有其他函数使用了这个特性,你可以考虑将使用该特性的所有函数一起搬移。有时候,搬移一组函数比逐一搬移简单些)。 检查源类的子类和超类,看看是否有该函数的

q351477的博客 1695

10、X射线聚焦与光学元件技术解析

本文深入解析了X射线聚焦与光学元件技术,重点讨论了椭圆镜的聚焦原理及局限性,多层镜的设计优化及其突破性应用,以及X射线波导的基础理论和模式求解方法。文章还总结了这些技术的优势、局限及其在材料科学、生物学和医学等领域的广泛应用前景。通过理论推导与技术改进,这些光学元件为X射线成像技术的发展提供了重要支撑。

pz890123的博客 121

在对象之间搬移特性之一 :Move Method(搬移函数)

你的程序中,有个函数与其所驻class之外的另一个class进行更多交流:调用后者,或被后者调用。 在该函数最常引用(指涉)的class中建立一个有着类似行为的新函数。将旧函数变成一个单纯的委托函数(delegating method),或是将旧函数完全移除。 动机(Motivation) 「函数搬移」是重构理论的支柱。如果一个class有太多行为,或如果一个class与

yuwei629的专栏 1226

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

在对象之间搬移特性之七 :Introduce Foreign Method(引入外加函数)

你所使用的server class需要一个额外函数,但你无法修改这个class。 在client class中建立一个函数,并以一个server class实体作为第一引数(argument) :   Date newStart = new Date (previousEnd.getYear(),                     previousEnd.getMonth(

yuwei629的专栏 909

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

重构-改善既有的代码设计-在对象之间搬移特性(7)

在对象之间编译特性 7.1搬移函数(Move Method) 7.2搬移字段(Move Field) 7.4.提炼类(Extract Class) 7.4.将类内联化(Inline Class) 7.5.隐藏“委托关系”(Hide Delegate) 7.6.移除中间人(Re...

310

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

重构的基本手法

重构的基本手法有很多,可以大致分为以下几类:1. 重新组织函数 (Composing Methods)2. 在对象之间搬移特性 (Moving Features Between Objects)3. 重新组织数据 (Organizing Data)4. 简化条件表达式 (Simplifying Conditional Expressions)5. 简化函数调用 (Simplifying Method Calls)6. 处理概括关系 (Dealing with Generalization)

heeheeai的博客 2099

重构第七章读后总结

本章讲的是在对象之间搬移特性,主要手法有如下几个: 1、搬移函数: 什么时候用?        在程序中如果有个函数与其所驻类之外的另一个类进行更多的交流,调用后者或被后者调用。 怎么用?        在该函数最常用的类中建立一个有着类似行为的新函数,将旧函数变成一个单纯的委托函数或者将旧函数移除。 具体做法:       1、检查源类中被源函数

zgxy666的博客 453

重构·改善既有代码的设计.03之重构手法(上)

之前的重构系列中,介绍了书中提到的重构基础,以及识别代码的坏味道。今天继续第三更,讲述那些重构手法(上)。看看哪些手法对你的项目能有所帮助…

有一只柴犬的专栏 1832

狗 S 一样的代码!快,重构我!

点击上方“Java基基”,选择“设为星标”做积极的人,而不是积极废人!源码精品专栏原创 | Java 2020超神之路,很肝~中文详细注释的开源项目RPC 框架 Dubbo 源码解析...

weixin_44421461的博客 143

狗屎一样的代码如何重构???

代码都是不断改出来的,没有谁一开始就能写出漂亮的代码,因为需求都是不断变更的。在不断变更代码的时候,对代码进行思考,调整结构。 一、重构原则 1、何谓重构 对软件内部结构的一种调整,目的是在不改变软件可观察行为的前提下,提高其可理解性,降低其修改成本。 另一种解释是:使用一系列重构手法,在不改变软件可观察行为的前提下,调整其结构。 重构不止是代码整理,它提供了一种高效且受控的代码整理技术 2、为何...

失忆๑的博客 198

重构(改善既有代码的设计)--读书笔记2

重构(改善既有代码的设计)–读书笔记1中,总结了什么是重构,为什么要重构,该在什么地方重构以及代码的坏味道。接着上一篇博客,本篇博客总结常用的重构手法,对于每一个重构手法,我将会做一个简要介绍,必要的时候我会再给出一个简单的示例加以说明。 一.重新组织函数 1. Extract Method(提炼函数)     你有一段代码可以被组织在一起并独立出来。     将这段代码放进一个独立的函数中

静墨的博客 541

java简单代码_java如何写出简洁代码

一、重构原则:1、三次法则(事不过三,三则重构)2、何时重构:(1)添加功能时重构(2)修补错误时重构(3)复审代码时重构3、重构优点:(1)允许逻辑共享(2)分开解释意图和实现(3)隔离变化(4)封装条件逻辑4、重构难点:(1)数据库(2)修改接口解决办法:不要过早发布接口,请修改你的代码所有权策略,使重构更顺畅。(3)难以通过重构手法完成的设计改动5、重构与设计:重构肩负一项特殊使命,它和设计...

weixin_39609166的博客 267

跟狗屎一样的代码,到底该如何重构?

程序员的成长之路互联网/程序员/技术/资料共享关注阅读本文大概需要 18 分钟。来自:网络,侵删跟狗屎一样的代码,到底该如何重构?其实,代码都是不断改出来的,没有谁一开始就能写出漂亮的代...

良月柒 550

《重构:改善既有代码的设计》读书笔记(持续更新中)

背景(我也不知道这个算不算读书笔记,书本知识点整理和个人理解内容可跳至下面正文): 最近过年加找工作一直没想起来整理学习内容, 时间都很零碎。回想一下, 的确一直以来都是为了完成项目去看知识点。 除了刚开始想转行做IT的时候跟着慕课网的两条前后端路线系统地学习了一下, 但是终究囫囵吞枣。 前几天刚好有被问到《重构》这本书的内容。这两天临时抱佛脚看一下。 有了一定量的代码量积累的现在, 带着些许...

yytoo2的博客 2459

《重构 改善既有代码的设计 2,2021京东最新Java面试真题解析

将所有对该变量的引用动作,替换为对它赋值那个表达式本身。 4、以查询取代临时变量 将这个表达式提炼到一个独立函数中,将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可被其他函数使用。 5、引入解释性变量 将复杂表达式的结果放进一个临时变量,以此变量名称来解释表达式用途。 「动机」 在条件逻辑中,引入解释性变量特别有价值,你可以用这项重构将每个条件子句提炼出来,以一个良好命名的临时变量来解释对应条件子句的意义。使用这项重构的另一种情况是,在较长算法中,可以运用临时变量来解释每一步运算的意义。

m0_60388216的博客 401
上一篇: 重新组织函数--Substitute Algorithm(替换算法)
下一篇: 在对象之间搬移特性---Hide Delegate(隐藏委托关系)
HDPCOMEON
博客等级 码龄15年 1粉丝 21原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值