重组函数:将部分功能提炼为一个独立的函数,以便之后可被其他函数调用

2024-03-06 06:40

本文主要是介绍重组函数:将部分功能提炼为一个独立的函数,以便之后可被其他函数调用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 前言
  • 一、这样做动机是什么?
  • 二、具体实现
    • 1.示例
    • 2.开始替换
      • 2.1 检查它们是否只被赋值一次
      • 2.2 替换basePrice中的临时变量
      • 2.3 替换discount中的临时变量
      • 2.4 最终的代码
  • 总结


前言

在程序中,我们会以一个临时变量来保存某一表达式的运算结果,现在我们将这个表达式提炼到一个独立函数,将这个临时变量的所有【被引用】替换为对新函数的调用,新函数可被其他函数使用。
示例:
在这里插入图片描述


一、这样做动机是什么?

临时变量存在的问题:它们是暂时的,而且只能在所属函数内使用。
如果把临时变量替换为一个查询式,那么同一个类中所有的函数都可以获取这个信息,代码可供重复使用。

二、具体实现

1.示例

代码如下(示例):

double getPrice(){int basePrice = quantity * itemPrice;double discount;if(basePrice > 1000) discount = 0.95;else discount = 0.98;return basePricce * discount;
}

现在将basePrice 和discount替换掉。

2.开始替换

2.1 检查它们是否只被赋值一次

将临时变量声明为final进行检测

double getPrice(){final int basePrice = quantity * itemPrice;final double discount;if(basePrice > 1000) discount = 0.95;else discount = 0.98;return basePricce * discount;
}

进行编译,如果没错则表明它们的确只被赋值一次,如果临时变量不知被赋值一次,我们就不应该对其进行重构。下面我们可以放心进行修改了。


2.2 替换basePrice中的临时变量

将临时变量声明为final进行检测

double getPrice(){//替换final int basePrice = basePrice();final double discount;//替换if(basePrice()> 1000) discount = 0.95;else discount = 0.98;//替换return basePrice() * discount;
}
//作为一个函数提炼出来
private int basePrice(){return quantity * itemPrice;
}

2.3 替换discount中的临时变量

double getPrice(){final int basePrice = basePrice();//替换final double discount();//替换return basePricce() * discount();
}
private int basePrice(){return quantity * itemPrice;
}
//作为一个函数提炼出来
private int discount(){//如果上一步没有将临时变量basePrice替换为查询式,将很难提取discountif(basePrice() > 1000) discount = 0.95;else discount = 0.98;
}

2.4 最终的代码

将临时变量声明为final进行检测

//可以看到getPrice()变得非常整洁
double getPrice(){return basePricce() * discount();
}
private int basePrice(){return quantity * itemPrice;
}
private int discount(){if(basePrice() > 1000) discount = 0.95;else discount = 0.98;
}

总结

我们常常使用临时变量保存循环中的累加信息,这种情况下,整个循环都可以被提炼为一个独立的函数,这也使原本的函数可以少掉几行扰人的循环码。
有时候我们可能会用单一的循环累加好几个值,例如这一篇文章所说:
链接: 对list数组的每条数据进行条件判断,拼接之后进行发送或者返回处理
这种情况下应该针对每个累加值重复一遍循环,这样就可以将所有的临时变量都替换为查询式。

这篇关于重组函数:将部分功能提炼为一个独立的函数,以便之后可被其他函数调用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/779148

相关文章

Android使用ImageView.ScaleType实现图片的缩放与裁剪功能

《Android使用ImageView.ScaleType实现图片的缩放与裁剪功能》ImageView是最常用的控件之一,它用于展示各种类型的图片,为了能够根据需求调整图片的显示效果,Android提... 目录什么是 ImageView.ScaleType?FIT_XYFIT_STARTFIT_CENTE

Python的time模块一些常用功能(各种与时间相关的函数)

《Python的time模块一些常用功能(各种与时间相关的函数)》Python的time模块提供了各种与时间相关的函数,包括获取当前时间、处理时间间隔、执行时间测量等,:本文主要介绍Python的... 目录1. 获取当前时间2. 时间格式化3. 延时执行4. 时间戳运算5. 计算代码执行时间6. 转换为指

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

Android实现两台手机屏幕共享和远程控制功能

《Android实现两台手机屏幕共享和远程控制功能》在远程协助、在线教学、技术支持等多种场景下,实时获得另一部移动设备的屏幕画面,并对其进行操作,具有极高的应用价值,本项目旨在实现两台Android手... 目录一、项目概述二、相关知识2.1 MediaProjection API2.2 Socket 网络

Redis消息队列实现异步秒杀功能

《Redis消息队列实现异步秒杀功能》在高并发场景下,为了提高秒杀业务的性能,可将部分工作交给Redis处理,并通过异步方式执行,Redis提供了多种数据结构来实现消息队列,总结三种,本文详细介绍Re... 目录1 Redis消息队列1.1 List 结构1.2 Pub/Sub 模式1.3 Stream 结

MySQL索引的优化之LIKE模糊查询功能实现

《MySQL索引的优化之LIKE模糊查询功能实现》:本文主要介绍MySQL索引的优化之LIKE模糊查询功能实现,本文通过示例代码给大家介绍的非常详细,感兴趣的朋友一起看看吧... 目录一、前缀匹配优化二、后缀匹配优化三、中间匹配优化四、覆盖索引优化五、减少查询范围六、避免通配符开头七、使用外部搜索引擎八、分

Android实现悬浮按钮功能

《Android实现悬浮按钮功能》在很多场景中,我们希望在应用或系统任意界面上都能看到一个小的“悬浮按钮”(FloatingButton),用来快速启动工具、展示未读信息或快捷操作,所以本文给大家介绍... 目录一、项目概述二、相关技术知识三、实现思路四、整合代码4.1 Java 代码(MainActivi

Python处理函数调用超时的四种方法

《Python处理函数调用超时的四种方法》在实际开发过程中,我们可能会遇到一些场景,需要对函数的执行时间进行限制,例如,当一个函数执行时间过长时,可能会导致程序卡顿、资源占用过高,因此,在某些情况下,... 目录前言func-timeout1. 安装 func-timeout2. 基本用法自定义进程subp

一文详解如何在Python中从字符串中提取部分内容

《一文详解如何在Python中从字符串中提取部分内容》:本文主要介绍如何在Python中从字符串中提取部分内容的相关资料,包括使用正则表达式、Pyparsing库、AST(抽象语法树)、字符串操作... 目录前言解决方案方法一:使用正则表达式方法二:使用 Pyparsing方法三:使用 AST方法四:使用字

SpringBoot集成Milvus实现数据增删改查功能

《SpringBoot集成Milvus实现数据增删改查功能》milvus支持的语言比较多,支持python,Java,Go,node等开发语言,本文主要介绍如何使用Java语言,采用springboo... 目录1、Milvus基本概念2、添加maven依赖3、配置yml文件4、创建MilvusClient