第10章:Python TDD优化货币类方法与引入工厂方法

写在前面


这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 Cursor 软件后,我突然思考,对于测试开发工程师来说,什么才更有价值呢?如何让 AI 工具更好地辅助自己写代码,或许优质的单元测试是一个切入点。 就我个人而言,这本书确实很有帮助。第一次读的时候,很多细节我都不太懂,但将书中内容应用到工作中后,我受益匪浅。比如面对一些让人抓狂的代码设计时,书里的方法能让我逐步深入理解代码的逻辑与设计。 作为一名测试开发工程师,我想把学习这本书的经验分享给大家,希望能给大家带来帮助。因为现在工作中大多使用 Python 代码,所以我把书中JAVA案例都用 Python 代码进行了改写 。

问题背景说明

随着货币类功能的不断扩展,原有的times方法实现可能存在不一致或不够优化的情况。优化这些方法可以提高代码的执行效率和可维护性。同时,在创建货币对象时,如果直接依赖具体的子类,会使代码的耦合度较高,不利于代码的扩展和维护。引入工厂方法能够将对象创建逻辑封装起来,降低代码耦合,提高代码的灵活性和可扩展性。

在Python测试驱动开发(TDD)的实践中,随着货币类功能的逐步实现,优化现有方法并引入新的设计模式,能使代码结构更清晰、扩展性更强。这一章,我们聚焦于优化货币类方法,尤其是times方法,并引入工厂方法来提升代码的灵活性和可维护性。

10.1 思路说明

目前DollarFranc类中的times方法虽然功能相似,但存在一定差异,这不利于代码的统一管理和维护。我们希望将这两个方法统一,使代码更简洁。同时,为了减少在创建货币对象时对具体子类的直接依赖,我们引入工厂方法。通过工厂方法,我们可以更方便地创建不同类型的货币对象,并且在未来如果需要对货币类的创建逻辑进行修改,只需要在工厂方法中调整即可,无需在大量创建对象的地方逐一修改,降低了代码的耦合度。

10.2 测试代码

import unittestclass Money:def __init__(self, amount, currency):self.amount = amountself.currency = currency@staticmethoddef dollar(amount):return Dollar(amount, "USD")@staticmethoddef franc(amount):return Franc(amount, "CHF")class Dollar(Money):def __init__(self, amount, currency):super().__init__(amount, currency)def times(self, multiplier):return Money(self.amount * multiplier, self.currency)class Franc(Money):def __init__(self, amount, currency):super().__init__(amount, currency)def times(self, multiplier):return Money(self.amount * multiplier, self.currency)class TestMoneyOperations(unittest.TestCase):def test_dollar_times(self):five_dollars = Money.dollar(5)result = five_dollars.times(3)self.assertEqual(result.amount, 15)self.assertEqual(result.currency, "USD")def test_franc_times(self):ten_francs = Money.franc(10)result = ten_francs.times(2)self.assertEqual(result.amount, 20)self.assertEqual(result.currency, "CHF")if __name__ == '__main__':unittest.main()

10.3 源码说明

在上述代码中,我们对Money类进行了扩展,添加了两个静态方法dollarfranc,这就是我们引入的工厂方法。dollar方法用于创建Dollar对象,franc方法用于创建Franc对象,在创建对象时同时指定了对应的货币类型。

Dollar类和Franc类的构造函数现在接受两个参数,amountcurrency,并通过super().__init__(amount, currency)调用父类Money的构造函数进行初始化。

times方法在Dollar类和Franc类中被统一实现,返回一个新的Money对象,其金额是原对象金额与乘数的乘积,货币类型保持不变。

在测试类TestMoneyOperations中,test_dollar_times测试用例通过工厂方法Money.dollar创建了一个金额为5的Dollar对象,然后调用times方法进行乘法运算,验证结果的金额和货币类型是否正确。test_franc_times测试用例同理,通过Money.franc创建Franc对象并测试其times方法的正确性。这样,通过引入工厂方法和统一times方法,我们优化了货币类的代码结构,提高了代码的可维护性和扩展性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/4725.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

鸿蒙系统 将工程HarmonyOS变成OpenHarmony

DevEco Studio软件创建工程后需要修改两个地方: 修改第二个build-profile.json5文件 将原先内容: {"app": {"signingConfigs": [],"products": [{"name": "default","signingConfig": &q…

Matlab总提示内存不够用,明明小于电脑内存

目录 前言情况1(改matlab最大内存限制)情况2(重启电脑)情况3 前言 在使用matlab中,有时候需要占用的内存并没有超过电脑内存依旧会报错,提示内存不够用,可以尝试下面几种方法,总有一…

[操作系统] 进程的调度

进程切换概念 时间⽚:当代计算机都是分时操作系统,没有进程都有它合适的时间⽚(其实就是⼀个计数 器)。时间⽚到达,进程就被操作系统从CPU中剥离下来。 死循环是如何运行? 当一个进程代码为死循环,它并不会一直占据C…

免费为企业IT规划WSUS:Windows Server 更新服务 (WSUS) 之快速入门教程(一)

哈喽大家好,欢迎来到虚拟化时代君(XNHCYL),收不到通知请将我点击星标!“ 大家好,我是虚拟化时代君,一位潜心于互联网的技术宅男。这里每天为你分享各种你感兴趣的技术、教程、软件、资源、福利…

【2025】拥抱未来 砥砺前行

2024是怎样的一年 2024在历史画卷上是波澜壮阔的一年,人工智能的浪潮来临,涌现出无数国产大模型。 22年11月ChatGPT发布,它的出现如同在平静湖面上投下一颗巨石,激起了层层波澜,短短五天用户数就达到了100万&#xff0…

Java设计模式—观察者模式

观察者模式 目录 观察者模式1、什么是观察者模式?2、观察者模式优缺点及注意事项?3、观察者模式实现?4、手写线程安全的观察者模式? 1、什么是观察者模式? - 实例:现实生活中很多事物都是依赖存在的&#x…

鸿蒙开发中的骨架图:提升用户体验的关键一环

大家好,我是小 z,今天要给大家分享一个提升用户体验的超实用技巧 —— 骨架图🎯 文章目录 一、什么是骨架图二、骨架图的作用三、鸿蒙开发中实现骨架图的方法1. 利用 opacity 奠定视觉基础2. animateTo 驱动动态变化3. 二者协同触发与展示 四…

vue+高德API搭建前端Echarts图表页面

利用vue搭建Echarts图表页面,在搭建Echarts图表中,如果搭建地理地形图需要准备一些额外的文件,地理json文件和js文件,js文件目前在网上只能找省一级的,json文件有对应的省市县,js文件和json文件对应的也是不…

我在广州学Mysql 系列——触发器的使用

ℹ️大家好,我是练小杰,这周是春节前的最后一周了,现在一双手数都能数得过来了!! 本播客将学习MYSQL中触发器的相关概念以及基础命令~~ 回顾:👉【MYSQL视图相关例题】 数据库专栏👉【…

大数据,Hadoop,HDFS的简单介绍

大数据 海量数据,具有高增长率、数据类型多样化、一定时间内无法使用常规软件工具进行捕捉、管理和处理的数据集 合 大数据的特征: 4V Volume : 巨大的数据量 Variety : 数据类型多样化 结构化的数据 : 即具有固定格式和有限长度的数据 半结构化的数据 : 是…

如何用3个月零基础入门网络安全?_网络安全零基础怎么学习

🤟 基于入门网络安全/黑客打造的:👉黑客&网络安全入门&进阶学习资源包 前 言 写这篇教程的初衷是很多朋友都想了解如何入门/转行网络安全,实现自己的“黑客梦”。文章的宗旨是: 1.指出一些自学的误区 2.提供…

微服务与docker

准备工作 在课前资料中给大家提供了黑马商城项目的资料,我们需要先导入这个单体项目。不过需要注意的是,本篇及后续的微服务学习都是基于Centos7系统下的Docker部署,因此你必须做好一些准备: Centos7的环境及一个好用的SSH客户端装好Docker会使用Docker如果是学习过上面Doc…

(7)(7.2) 围栏

文章目录 前言 1 通用设置 2 围栏类型 3 破坏栅栏行动 4 使用 RC 通道辅助开关启用栅栏 5 自动高度规避 6 在任务规划器中启用围栏 7 用于遥控飞行训练 8 MAVLink 支持 前言 ArduPilot 支持基于本机的圆柱形(“TinCan”)和多边形和/或圆柱形、…

uniapp——App 监听下载文件状态,打开文件(三)

5 实现下载文件并打开 这里演示,导出Excel 表格 文章目录 5 实现下载文件并打开DEMO监听下载进度效果图为什么 totalSize 一直为0? 相关Api: downloader DEMO 提示: 请求方式支持:GET、POST;POST 方式需要…

mybatis的多对一、一对多的用法

目录 1、使用VO聚合对象(可以解决这两种情况) 多对一: 一对多: 2、非聚合的多对一做法: 3、非聚合的一对多做法: 1、使用VO聚合对象(可以解决这两种情况) 当我需要多对一、一对…

Vscode:问题解决办法 及 Tips 总结

Visual Studio Code(简称VSCode)是一个功能强大的开源代码编辑器,广泛用于各种编程语言和开发场景,本博客主要记录在使用 VSCode 进行verilog开发时遇到的问题及解决办法,使用过程中的技巧 文章目录 扩展安装失败调试配…

MySQL 窗口函数

MySQL 窗口函数 1,窗口函数 1.1,什么是窗口函数1.2,基本语法 2,函数详解 2.1,聚合函数2.2,排序函数2.3,偏移函数2.4,值函数 3,进阶用法 1,窗口函数 1.1&am…

基于vite+vue3+mapbox-gl从零搭建一个项目

下面是基于 Vite、Vue 3 和 Mapbox GL 从零搭建一个项目的完整步骤,包括环境搭建、依赖安装、配置和代码示例。 文章目录 1. 初始化项目2. 安装 mapbox-gl 依赖3. 配置 Mapbox Access Token4. 实现地图组件5. 在 App.vue 中使用地图组件6. 启动开发服务器7. 添加自定…

Data Filtering Network 论文阅读和理解

目录 一、TL;DR 二、Introduction 2.1 apple的结论 2.2 业界做法: 2.3 我们的做法(Apple) 2.4 如何获取好的DFN 三、未完待续(这周出去购物了,下周继续补充) 一、TL;DR 核心…

ingress-nginx代理tcp使其能外部访问mysql

一、helm部署mysql主从复制 helm repo add bitnami https://charts.bitnami.com/bitnami helm repo updatehelm pull bitnami/mysql 解压后编辑values.yaml文件,修改如下(storageclass已设置默认类) 117 ## param architecture MySQL archit…