Pull Up Method(函数上移)

article/2025/10/30 5:51:26

动机

避免行为重复是很重要的。尽管重复的两个函数也可以各自工作得很好,但重复自身只会成为错误的滋生地,此外别无价值。无论何时,只要系统之内出现重复,你就会面临“修改其中一个却未能修改另一个”的风险。通常,找出重复也有一定困难。

如果某个函数在各个子类中的函数体都相同(它们很可能是通过复制粘贴得到的),这就是最显而易见的Pull Up Method适用场合。当然,情况并不总是如此明显。你也可以只管放心地重构,再看看测试程序会不会发牢骚,但这就需要对你的测试有充分的信心。我发现,观察这些可能重复的函数之间的差异往往大有收获:它们经常会向我展示那些我忘记测试的行为。

Pull Up Method常常紧随其他重构而被使用。也许你能找出若干个身处不同子类内的函数,而它们又可以通过某种形式的参数调整成为相同的函数。这时候,最简单的办法就是首先分别调整这些函数的参数,然后再将它们概括到超类中。当然,如果你足够自信,也可以一次完成这个两个步骤。

有一种特殊情况也需要使用Pull Up Method:子类的函数覆写了超类的函数,但却仍然做相同的工作。

Pull Up Method过程中最麻烦的一点就是:被提升的函数可能会引用只出现于子类而不出现于超类的特性。如果被引用的是一个函数,你可以将该函数也一同提升到超类,或者在超类中建立一个抽象函数。在此过程中,你可能需要修改某个函数的签名,或建立一个委托函数。

如果两个函数相似但不相同,你或许可以先借助Form Template Method构造出相同的函数,然后再提升它们。

做法

  1. 检查待提升函数,确定它们是完全一致的。
  2. 如果待提升函数的签名不同,将那些签名都修改为你想要的超类中使用的签名。
  3. 在超类中新建一个函数,将某一个待提升函数的代码复制到其中,做适当调整,然后编译。
    3.1. 如果你使用的是一种强类型语言,而待提升函数又调用了一个只出现于子类而未出现于超类的函数,你可以在超类中为被调用函数声明一个抽象函数。
    3.2. 如果待提升函数使用了子类的一个字段,你可以使用Pull Up Field将该字段也提升到超类;或者也可以先使用Self Encapsulate Field,然后在超类中把取值函数声明为抽象函数。
  4. 移除一个待提升的子类函数。
  5. 编译,测试。
  6. 逐一移除待提升的子类函数,直到只剩下超类中的函数为止。每次移除之后都需要测试。
  7. 观察该函数的调用者,看看是否可以改为使用超类类型的对象。

范例

我以Customer表示“顾客”,它有两个子类:表示“普通顾客”的RegularCustomer和表示”贵宾“的PreferredCustomer。
两个子类中都有一个createBill()函数,并且代码完全一样:
在这里插入图片描述

void createBill(Date date) {double chargeAmount = chargeFor(lastBillDate, date);addBill(date, charge);
}

但我不能直接把这个函数上移到超类,因为各个子类的chargeFor()函数并不相同。我必须先在超类中声明chargeFor()抽象函数:

class Customer...abstract double chargeFor(Date start, Date end);

然后,我就可以将createBill()函数从其中一个子类复制到超类。复制完之后应该编译,然后移除那个子类的createBill()函数,再编译并测试。随后再移除另一个子类的createBill()函数,再次编译并测试:
在这里插入图片描述


http://chatgpt.dhexx.cn/article/KNYtJgTk.shtml

相关文章

GPIO_PULLUP,PULLDOWN, NOPULL

NOPULL: 对于输出IO,配置为NOPULL,当IO输出高电平时,IO为1, 当IO输出低电平时,IO为0; PULLUP: 对于输入IO, 默认为高电平,当需要改变为低电平时配置为PULLUP。 比如:K…

pullup和pulldown在verilog中的使用方法

0 前言 这段时间涉及到了IO-PAD&#xff0c;在IO-PAD的RTL的时候注意到了pullup和pulldown&#xff0c;对这个知识比较好奇&#xff0c;就研究了一下&#xff0c;顺便记录下来&#xff0c;IO-PAD的内容等我再研究研究再考虑记录吧 >_< 1 pullup和pulldown的介绍 pullu…

电阻(4)之上拉电阻与下拉电阻详解

原文地址点击这里: 上拉(Pull Up )或下拉(Pull Down)电阻(两者统称为“拉电阻”)最基本的作用是:将状态不确定的信号线通过一个电阻将其箝位至高电平(上拉)或低电平(下拉),无论它的具体用法如何,这个基本的作用都是相同的,只是在不同应用场合中会对电阻的阻值…

解决安装文件时2502、2503错误

在安装文件时有时会出现2502、2503错误&#xff0c;重复安装也不会有什么改变&#xff0c;让人很是头疼。这种问题一般是权限的问题导致的&#xff0c;一般有两种解决办法&#xff0c;第一种就是提升当前用户的权限&#xff0c;第二种就是直接使用CMD安装&#xff0c;这里主要说…

java卸载错误2503_修复控制面板卸载程序时提示错误代码2502、2503的方法

在平常生活中大家是如何卸载软件的呢&#xff1f;有的用户会使用第三方工具&#xff0c;例如软件管家等来进行卸载&#xff0c;这样操作的用户占大多数&#xff0c;但是无法将软件卸载干净。有的用户会直接将安装目录全部删掉&#xff0c;这样操作的用户较少。最理想的卸载软件…

联发科MT2503D处理器详细参数介绍

MT2503D集成了一个ARM7EJ-STM内核&#xff0c;它是运行高级gsm协议软件的主处理器&#xff0c;以及多媒体应用程序、单数字信号处理器核&#xff0c;它管理低层 层次调制解调器和先进的音频功能&#xff0c;嵌入式处理器运行蓝牙基带和链路控制协议和蓝牙无线电控制。 MT 2503…

java内部错误2503_win10安装和卸载Java jdk错误出现2503,2502错误

本人android studio3.0运行helloworld都报错,打开不了守护进程,然后看网上说java版本可能不对,想卸载java,发现任务管理器怎么都卸载不了,网上说的两个办法都试了没用,一天的挣扎,终于找到下面网址的解决办法。 在使用java安装程序时,有时候会出现安装和卸载失败的问题…

MT2503D完整规格书,MT2503D daatsheet资料下载

MT2503D SOC Processor Datasheet MT2503D是一种基于低功耗CMOS工艺的集成前沿电源管理单元、模拟基带和无线电电路的单片芯片。 MT2503D是一个功能丰富和功能非常强大的单芯片解决方案&#xff0c;用于高端GSM/GPRS能力。基于32位ARM7EJ-STMRISC处理器&#xff0c;MT2503D的卓…

java卸载2503,无法安装msi格式软件提示错误代码2502、2503怎么办?

无法安装msi格式软件提示错误代码2502、2503怎么办?一遇英文界面&#xff0c;就感觉心里没底&#xff0c;偏偏薄名女偏逢薄命郎&#xff0c;安装msi格式软件&#xff0c;出现了下面界面&#xff1a; The installer has encountered an unexpected error installing this packa…

python错误2503_Win10卸载python总是提示error2503失败各种解决办法

最近win10的电脑装了python的3.4,然后想卸载,就总是提示error 2053,类似于这种: 下面是我的坎坷解决之路: 1、网上说,任务管理器 --> 详细信息 --> explorer.exe结束任务,结束资源管理器,然后,文件--运行新任务 -- 如下图所示: 然后重复卸载操作,然后还是失败…

解决安装node失败 报错2503

此问题是如何遇到的呢&#xff1f; 在node官网下载的安装包&#xff0c;在安装到最后突然报出一个 2503 的弹窗&#xff0c;具体报错内容如下&#xff1a; 导致安装失败&#xff01; 解决方式&#xff1a; 电脑&#xff1a;window 1. 在win 搜索框 找到 “Windows PowerS…

Nodejs安装时出现2503错误

解决方案&#xff1a; 1、管理员身份运行命令行 2、进入nodejs安装包目录 3、在命令行运行以下指令

安装出现2503 error

输入命令&#xff1a; msiexec /package "D:\TortoiseGit-2.13.0.1-64bit.msi"

MT2503原理图芯片资料整合下载,MT2503处理器概述

MT2503处理器在过去两年里,可以说很火的一款物联网芯片了。就是不知道今年咋样了。我也整理了MT2503的一些技术资料,如:datasheet,源码,参考设计,原理图,FAQ等,比较全面,需要的可在下方留言,笔者来分享给你 下面就来讲讲这款SOC吧。 MT2503芯片是基于ARMv7和采用高…

安装nodejs报错2503

提示&#xff1a;解决安装软件报2503错误的方法&#xff08;windows系统&#xff09; 安装Nodejs报错 背景 背景 提示&#xff1a;发现软件装不上背景步骤 现有windows 10操作系统官网下载安装node 官网地址傻瓜式一步步安装&#xff0c;最后报错如下图&#xff1a;报错原因…

QGis 安装 the error code 2503

1、管理员方式打开 CMD命令行&#xff1b; 2、运行 msiexec /package "E:\QGIS-OSGeo4W-3.22.5-1.msi" &#xff1b;

【推荐系统】:协同过滤和基于内容过滤概述

【推荐系统】&#xff1a;协同过滤和基于内容过滤概述 &#x1f338;个人主页&#xff1a;JOJO数据科学&#x1f4dd;个人介绍&#xff1a;统计学top3高校统计学硕士在读&#x1f48c;如果文章对你有帮助&#xff0c;欢迎✌关注、&#x1f44d;点赞、✌收藏、&#x1f44d;订阅…

协同过滤相似度

使用不同相似度计算方式实现协同过滤 如果 买/没买 点/没点数据 0/1 适合使用杰卡德相似度 - from sklean.metrics import jaccard_similarity_score - jaccard_similarity_score(df[item A],df[item B]) -一般使用评分去做协同过滤 推荐使用皮尔逊相关系数 - 评分预测 基于用…

协同过滤算法_协同过滤在新闻推荐CTR预估中的应用

概述协同过滤算法是推荐系统中的最基本的算法&#xff0c;该算法不仅在学术界得到了深入的研究&#xff0c;而且在工业界也得到了广泛的应用。本文介绍最基本的基于物品的和基于用户的协同过滤算法&#xff0c;并结合新闻推荐的CTR预估&#xff0c;介绍基于物品的协同过滤算法在…

python协同过滤_协同过滤的python简易实现

原标题&#xff1a;协同过滤的python简易实现 了解推荐算法的人对协同过滤都不陌生&#xff0c;协同过滤就寻找和被推荐客户品味相似的客户&#xff0c;找出利用这些相似客户的偏好特征为用户推荐产品。下面就通过一个简单的示例将协同过滤加以实现。 关注我们公众号的粉丝都知…