何时提炼函数 & 用查询取代临时变量

拥有[短函数」(short methods)的对象会活得比较好、比较长。不熟悉面向对象技术的人,常常觉得对象程序中只有无穷无尽的delegation(委托),根本没有进行任何计算。

  

我们遵循这样一条原则:每当感觉需要以注释来说明点什么的时候,我们就把需要说明的东西写进一个独立函数中,并以其用途(而非实现手法)命名。我们可以对一组或甚至短短一行代码做这件事。哪怕替换后的函数调用动作比函数自身还长,只要函数名称能够解释其用途,我们也该毫不犹豫地那么做。关键不在于函数的长度,而在于函数「做什么」和「如何做」之间的语义距离。

   

如何确定该提炼哪一段代码昵? 一个很好的技巧是:寻找注释。它们通常是指出「代码用途和实现手法间的语义距离」的信号。如果代码前方有一行注释,就是在提醒你:可以将这段代码替换成一个函数,而且可以在注释的基础上给这个函数命名。就算只有一行代码,如果它需要以注释来说明,那也值得将它提炼到独立函数去。

 

以查询取代临时变量:  

Replace Temp with Query往往是你运用Extract Method 之前必不可少的一个步骤。局部变量会使代码难以被提炼,所以你应该尽可能把它们替换为查询式。

 

方法步骤:

1:找出只被赋值一次的临时变量(如果某个临时变量被赋值超过一次,考虑用split temporary variable将它分割)

2:将临时变量声明为final。(确保变量只是被赋值一次)

3:编译。

4:将对该临时变量赋值的语句等号右侧部分提炼到一个独立函数中。(声明为private,确保这个函数不修改任何的对象内容)

5:在该临时变量身上实施用查询取代临时变量。

  

我们常常使用临时变量保存循环中的累加信息。在这种情况下,整个循环都可以被提为一个独立函数,这也使原本的函数可以少掉几行扰人的循环码。有时候,你可能会用单一循环累加好几个值,就像本书p.26的例子那样。这种情况下你应该针对每个累加值重复一遍循环,这样就可以将所有临时变量都替换为查询式(query)。

   

Example:

1:   原来代码

double getPrice() { 
    int basePrice = _quantity * _itemPrice; 
    double discountFactor; 
    
    if (basePrice > 1000) {
        discountFactor = 0.95; 
    } else {
        discountFactor = 0.98; 
    }
    
    return basePrice * discountFactor; 
} 

   

首先把临时变量声明为final,检查是否只是被赋值一次。

double getPrice() { 
    final int basePrice = _quantity * _itemPrice; 
    final double discountFactor; 
    
    if (basePrice > 1000) {
        discountFactor = 0.95; 
    } else {
        discountFactor = 0.98; 
    }
    
    return basePrice * discountFactor; 
} 
  

 

这样一来,如果有任何问题,编译器就会警告我

  

下面一步步来:

首先把basePrice右边的提取到一个函数,然后if里面的引用这个变量的点,改为调用这个函数:

 

double getPrice() { 
    final int basePrice = basePrice(); 
    final double discountFactor; 
    
    if (basePrice() > 1000) {
        discountFactor = 0.95; 
    } else {
        discountFactor = 0.98; 
    }
    
    return basePrice * discountFactor; 
} 
 

 

private int basePrice() { 
    return _quantity * _itemPrice; 
} 

 

 

最后的return语句是对于这个变量的最后一个引用点,所以把临时变量移除,然后改为调用方法:

double getPrice() { 
    final double discountFactor; 
    
    if (basePrice() > 1000) {
        discountFactor = 0.95; 
    } else {
        discountFactor = 0.98; 
    }
    
    return basePrice() * discountFactor; 
} 

    

同理提炼discountFactor,最后函数变为:

 

double getPrice() { 
    return basePrice() * discountFactor(); 
} 
 

 

非常简练了了!!

 

 

Ruby中变量引用时的一些注意点 主要介绍了Ruby中变量引用时的一些注意点,被当作变量或被当作方法调用的情况,需要的朋友可以参考下 立即下载

相关推荐

LLC谐振变换器恒压恒流双竞争闭环控制simulink仿真(附说明文档)

内容概要:本资源是一套面向电力电子与智能控制领域的综合性科研仿真资料合集,核心聚焦于LLC谐振变换器的恒压恒流双竞争闭环控制策略设计与Simulink建模仿真实现,涵盖半桥LLC、双向全桥LLC等拓扑结构的调频闭环仿真,并提供详尽的说明文档与PPT辅助材料。资源体系不仅深入呈现LLC变换器的动态响应与控制逻辑,还扩展至双有源桥(DAB)变换器的软开关协同优化、最小应力控制、EPS调制策略及新扩展移相角优化等前沿技术,同时集成三相PWM整流器在电网不平衡条件下的功率平衡控制、VOC+SVPWM双闭环控制等典型应用场景。此外,资源包涵盖状态估计(如EKF、UKF、PF)、微电网经济调度、卡尔曼滤波融合、神经网络控制、PID优化、储能系统管理等多个交叉方向,特别强调对顶级EI期刊研究成果的高精度复现,旨在帮助科研人员快速掌握先进控制算法的核心思想与仿真实现方法。; 适合人群:电气工程、自动化、电力电子、新能源科学与工程等相关专业的硕士博士研究生、高校科研人员,以及从事新能源变换器、智能电网、电动汽车、微电网系统研发的工程技术人员。; 使用场景及目标:① 深入理解LLC与DAB变换器的闭环控制机理,掌握恒压恒流切换、软开关实现与损耗优化方法;② 利用Simulink平台构建复杂电力电子系统模型,开展动态性能分析与控制器参数整定;③ 复现高水平期刊论文中的先进控制策略,提升科研创新能力与论文发表竞争力;④ 支持毕业设计、科研课题、项目申报及工程原型开发中的仿真验证环节。; 阅读建议:建议结合提供的完整资源目录循序渐进学习,优先研读标注“顶级EI复现”的案例以获取权威方法参考,配合MATLAB/Simulink动手搭建模型,重点关注控制框图设计、调制逻辑实现与仿真结果对比,深入理解算法背后的物理意义与数学推导过程。

《重构:改善既有代码的设计》读书笔记(下)

重构:改善既有代码的设计

行走 818

2023电视专用!安卓电子相册APP避坑指南(附开源代码)

本文针对2023年智能电视用户,提供安卓电子相册APP的避坑指南与实战教程。文章详细解析了电视端相册应用的常见广告与兼容性陷阱,并指导用户如何安全获取、部署纯净的APK应用,通过核心设置实现无广告的个性化图片轮播体验,最终打造专属的家庭回忆墙。

weixin_29012677的博客 494

重构笔记——以查询取代临时变量

本文是在学习中的总结,欢迎转载但请注明出处:http://blog.youkuaiyun.com/pistolove/article/details/42167015         在上一篇文章中介绍了“ 内联临时变量“。本文将介绍“以查询取代临时变量”这种重构手法。         下面让我们来学习这种重构手法吧。 开门见山         发现:你的程序以一个临时变量保存

皮斯特劳沃 5488

实测|龙虾机器人(OpenClaw)Windows系统部署全攻略(含避坑指南)

先简单科普下:龙虾机器人本质是一款开源AI代理框架,核心优势是“能行动、可本地、高灵活”——它不内置大模型,需要对接第三方AI接口(如GPT、Claude、阿里云百炼等),但能将AI的指令转化为实际的系统操作,相当于给AI配了一个“能动手的身体”,这也是它和普通对话大模型的核心区别。今天就结合自己的实测经历,从环境准备、分步部署、初始化配置,到常见问题排查,写一篇保姆级攻略,不管是新手还是有一定技术基础的同学,都能跟着一步步完成部署,少走弯路~解决方案:检查聊天软件插件是否安装成功,权限是否配置完整;

wohaiweifaju的博客 1万+

别再只盯着时序了!聊聊SDC里那些容易被忽略的‘配角’命令:工作条件、线载模型与面积约束

本文深入探讨了SDC(设计约束)中常被忽视的关键命令,包括set_operating_conditions、set_wire_load_model和set_max_area。这些‘配角’命令在芯片设计中扮演着至关重要的角色,影响时序收敛、功耗和面积优化。文章通过实际案例和最佳实践,揭示了如何正确配置工作条件、选择线载模型以及动态调整面积约束,以提升设计质量和效率。

weixin_26875109的博客 208

Replace Temp with Query替换临时变量为函数调用

一、动机 临时变量时暂时的,只能在所属函数内使用,所以它们会驱使你写出更长的函数。 将临时变量替换为一个查询,那么同一个类中的所有函数豆浆可以获得这份信息,是你能够为这个类编写更清晰的代码。 二、做法 1、找出只被赋值一次的临时变量 2、将该临时变量声明为final 3、将“对该临时变量赋值”之语句的等号右侧部分提炼到一个独立函数中。 4、在该临时变量身上...

lixu_liuheizi的专栏 201

大智慧L2实时api接口的逐笔委托功能执行代码分享

用过l2行情接口的投资者应该都了解大部分的接口都是有逐笔委托功能的,那么大智慧L2实时api接口也有着很强大的逐笔委托功能,投资者可以通过这个逐笔委托功能可以看到一个股票的每天出现的全部委托指令,那么在这个逐笔委托功能里包含了委托价格、委托时间、委托量和委托方向四个要素!那么接下来小编就分享一下大智慧L2实时api接口的逐笔委托功能执行代码!那么在这里提个醒:投资者可以在大智慧L2实时api接口进行设置过滤,在逐笔委托列表里,就仅仅只会显示超过设置委托量或委托额的委托单,而不再显示小单。

Qq_2037696191的博客 3730

vscode(一):批量修改变量名或函数名

替换 CTRL+F打开查找窗口,将窗口变成replace模式,下面第二行填入要替换成的名称。 右边的两个图标分别代表单一代替(配合上面的左右箭头使用)和全部代替 ...

wws的博客 5万+

用 MVC 框架把 ABAP 报表写成可扩展的应用(2)

本文介绍了一个基于MVC架构的SAP报表模板,解决了传统ABAP报表开发中的三个核心痛点: 选择屏幕校验逻辑分散问题 - 通过统一的选择屏幕控制器集中管理校验逻辑 在线与后台输出不一致问题 - 共享同一数据模型,通过不同控制器实现多样化展示 屏幕流转管理混乱问题 - 主控制器统一管理所有屏幕流程和事件 该模板采用分层架构: Model层专注数据获取和业务规则 Controller层管理流程和交互 View层负责展示逻辑 特别适用于需要同时支持交互式ALV展示和后台批处理输出的报表场景,通过标准化的扩展点设计

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 78

计算机网络实验报告实验七可靠传输TCP协议分析

计算机网络实验报告实验七可靠传输TCP协议分析

m0_56638814的博客 965

《重构》学习笔记

一、重组函数,消灭临时变量   1、查询函数替换  2、分解 临时变量 后替换 (一个变量多个地方使用时)  3、提炼方法对象  (太多复杂变量)  4、检查是否存在更优算法 (1)提炼函数注意:   取个好名字  检查 所提炼代码,是否引了“作用域限于源函数”的变量、参数  检查 局部变量值 有无被 所提炼代码改变,(返回值,分解变量)  需要的变量以参数传给 把提炼函数

xxb2008的专栏 906

<PLC><汇川>汇川PLC基于EtherCat协议使用转矩模式控制SV630N伺服驱动电机

本系列是关于PLC相关的博文,包括PLC编程、PLC与上位机通讯、PLC与下位驱动、仪器仪表等通讯、PLC指令解析等相关内容。PLC品牌包括但不限于西门子、三菱等国外品牌,汇川、信捷等国内品牌。除了PLC为主要内容外,PLC相关元器件如触摸屏(HMI)、交换机等工控产品,如果有值得记录的内容,也会添加进来。

用沸腾的热血,支付我们的人生吧! 4158

从特征匹配到意图识别:自定义编译型后门检测实战指南

在网络安全领域,恶意软件检测正从传统的特征匹配向更高级的意图与模式识别演进。其核心原理在于,通过多层次、多维度的关联分析技术,构建对程序本质和攻击者行为的深度理解。这种技术价值在于能够有效应对高度定制化、无固定特征的自定义威胁,例如那些经过源代码级别混淆和加密的编译型后门。在实际应用场景中,这要求安全系统结合静态分析、动态行为监控、内存取证等多维度数据,建立基于权重的可疑模式规则库,并利用关联分析引擎还原攻击链。本文聚焦于自定义编译型后门的检测艺术,深入探讨了如何从攻击者视角构建检测体系,并分享了从数据采集

weixin_33804582的博客 566

【Flutter 面试题】 怎么减少Widget的重新构建?

关于 const 关键字的使用:在 Flutter 开发中,任何时候当你确定一个 Widget 在其整个生命周期内都不会发生变化时,使用 const 关键字声明这个 Widget。这样的声明告诉 Flutter 框架这个 Widget 可以在编译时生成,后续的构建周期中可以重用已经创建的 Widget,从而避免了重复的构建开销。这适用于静态文本、图标或整个不变的 Widget 树。

Code Metaverse 1577

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

重构·改善既有程序的设计总结(代码重构技巧)

重构本来就不是一件应该特别拨出时间做的事情,重构应该随时随地的进行。 何时重构? 1、重复代码 同一个类中有相同的表达式:提炼出重复的代码,然后让两个地方都调用被提炼出来的那一段代码; 两个互为兄弟的子类内含有相同的表达式:提炼出相同代码,将它推入超类内; 两个毫不相干的类中出现:将重复的代码提炼到一个独立的类中。 代码之间相似,并非完全相同:使用模板函数,用方法名统一差异推入超类,子...

empyan的博客 1011

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

《重构-改善既有代码的设计》重构手法(重构API)

文章内容和思路来自《重构-改善既有代码的设计》 1> 将查询函数和修改函数分离:如果某个函数只是提供一个值,没有任何看得到的副作用,那么这是一个很有价值的东西。我可以任意调用这个函数,也可以把调用动作搬到调用函数的其他地方;这种函数的测试也更容易;简而言之,需要操心的事情少多了;任何有返回值的函数都不应该有副作用 2> 函数参数化:如果我发现两个函数逻辑非常相似,只有一些字面量值不同,可以将其合并成一个函数,以参数的形式传入不同的值,从而消除重复 3&...

SuperYang_的博客 754

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

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

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

<重构>读书笔记之<使用查询替换临时变量>

动机:临时变量时临时的和局部的,把它们替换成方法后,就可以重用了。 关键:最常用的的一种情况是:临时变量只有一次赋值,例如用临时变量收集“循环计算总和”。一般将新建的方法暂时设为私有的,并且要确保方法没有修改任何对象。 示例: def price   if base_price > 1000     discount_factor = 0.05   else     discount

u011060895的专栏 541

重新组织函数--以查询取代临时变量(Replace Temp with Query)

你的程序以一个临时变量保存某一表达式的运算结果 将这个表达式提炼到一个独立函数中。将这个临时变量的所有引用点替换为对新函数的调用。此后,新函数就可以被其他函数使用。 double basePrice=_quantity*_itemPrice; if(basePrice>1000){ return basePrice*0.95; else  return basePrice*0.

HDPCOMEON的专栏 984

《重构 - 改善既有代码的设计》总结

1 重构,第一个示例 重构前,先检查自己是否有一套可靠的测试集。这些测试必须有自我验证能力。TDD 重构技术就是以微小的步伐修改程序。如果犯下错误,很容易便可发现它。 傻瓜都能写出计算机可以理解的代码。唯有能写出人类容易理解的代码的,才是优秀的程序员。 编程时,需要遵循营地法则:保证你离开时,代码库一定比来的时候更健康。 好代码验证的标准是人们是否能轻而易举的修改它。 2 重构的原则 2.1 ...

极客神殿 1321

《重构 改善既有代码的设计》(第十一章)【重构API】

将查询函数和修改函数分离(Separate Query from Modifier) 函数参数化(Parameterize Function) 移除标记参数(Remove Flag Argument) 保持对象完整(Preserve Whole Object) 以查询取代参数(Replace Parameter with Query) 以参数取代查询(Replace Query with Para...

极客神殿 957

C语言中常见不安全函数及其替换函数

C语言中,大多数的缓冲区溢出问题可以直接追溯到标准C库。罪魁祸首就是因为不进行自变量检查的、有问题的字符操作(例如:strcpy()、strcat()、sprintf()、gets()等等)。一般来讲,像“避免使用strcpy()”和“永远不使用gets()”这样严格的规则在工作中经常遇到。 一、常见问题函数及其解决方案 函数 严重性 解决方案 gets 最...

小熊爱吃竹子的博客 2117

SQL

1.数据库基本概念mysq和 redis区别2. 其他1.事务2. 使用存储过程3.使用游标4.使用触发器5.安全管理6. 数据库维护7.变量Hive4. MYSQL1.安装SQL1.语法规则1.编程规范2. 语言分类1. DML2. DDL3. DCL3.数据类型4. 运算1.运算符2. 函数5.[Date函数](%28https://blog.youkuaiyun.com/qq_38486203/article/details/80654040?ops_request_misc=%25257B%252522req.

weixin_43320465的博客 1万+
上一篇: 网上支付原理
下一篇: 改良程序的11技巧
SleepInDelphi
博客等级 码龄19年 32粉丝 388原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值