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

news2025/1/21 7:03:10

写在前面


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

问题背景说明

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

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

10.1 思路说明

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

10.2 测试代码

import unittest


class Money:
    def __init__(self, amount, currency):
        self.amount = amount
        self.currency = currency

    @staticmethod
    def dollar(amount):
        return Dollar(amount, "USD")

    @staticmethod
    def 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.coloradmin.cn/o/2279700.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于GRU实现股价多变量时间序列预测(PyTorch版)

前言 系列专栏:【深度学习:算法项目实战】✨︎ 涉及医疗健康、财经金融、商业零售、食品饮料、运动健身、交通运输、环境科学、社交媒体以及文本和图像处理等诸多领域,讨论了各种复杂的深度神经网络思想,如卷积神经网络、循环神经网络、生成对抗网络、门控循环单元、长短期记…

Linux -- HTTP 请求 与 响应 报文

目录 请求报文: 请求方法 响应报文: 状态码 与 状态码描述 共性 常见的报头 请求报文: 请求方法 方法说明GET获取资源POST传输实体主体PUT传输文件HEAD获得报文首部DELETE删除文件OPTIONS询问支持的方法TRACE追踪路径CONNECT要求用…

小米平板pad6工程固件界面预览 修复tee损坏 修复底层分区 开diag端口

💝💝💝小米平板pad6 机型代码pipa。采用一块分辨率为 2880*1800p,支持 120/144Hz 高刷新率的国产屏,并且屏幕支持 HDR10 + 以及杜比视界。分别搭载 SM8250AC(骁龙 870)、SM8475(骁龙 8+)处理器。也适用于以下型号的小米机型:23043RP34G, 23043RP34I, 23043RP34C等…

day03_开发前准备和匹配类标签

文章目录 day03_开发前准备和匹配类标签一、标签体系(了解)二、数据导入(操作)1、背景介绍(重要)2、创建Hive表2.1 dwm_sold_goods_sold_dtl_i2.2 dwm_sell_o2o_order_i**2.3 dwd_mem_member_union_i**2.4 dwm_mem_member_behavior_day_i**2.5 dwm_mem_first_buy_i**3、数…

STM32之FreeRTOS开发介绍(十九)

STM32F407 系列文章 - freertos(十九) 目录 前言 一、简述 二、开源网址 三、原理及功能特性 1.原理 2.功能 3.特点 4.优缺点 四、参考书籍 五、实现方式 总结 前言 FreeRTOS是一个免费的、开源的实时操作系统,专为微控制器和嵌入…

第十三章:数据库技术

文章目录: 一:基础 1.概念 2.特点 3.常见数据库品牌 4.数据库应⽤系统 4.1 C/S 4.2 B/S 5.数据模型的分类 6.名词解析 7.关系运算 二:Access 1.基础 2.操作 2.1 建立表 2.2 维护表 2.3 创建查询 2.4 创建窗体 2.5 创建报表…

stm32 no connect target

解决 STM32 报错 “no target connected” 的方法 前言 stm32最小系统在下载程序是一直报错:no target connected,试了很多办法成功不了,最后将芯片擦除了才成功。 一、问题描述 当时是写flash的时候写到ST Link 存储的地方了。 之后就不…

综述:大语言模型在机器人导航中的最新进展!

简介 机器人导航是指机器人能够在环境中自主移动和定位的能力。本文系统地回顾了基于大语言模型(LLMs)的机器人导航研究,将其分为感知、规划、控制、交互和协调等方面。具体来说,机器人导航通常被视为一个几何映射和规划问题&…

OpenHarmony-7.IDL工具

IDL 工具 1.openharmony IDL工具 在OpenHarmony中,当应用/系统服务的客户端和服务端进行IPC(Inter-Process Communication)跨线程通信时,需要定义双方都认可的接口,以保障双方可以成功通信,OpenHarmony ID…

Docker私有仓库管理工具Registry

Docker私有仓库管理工具Registry 1 介绍 Registry是私有Docker仓库管理工具,Registry没有可视化管理页面和完备的管理策略。可借助Harbor、docker-registry-browser完成可视化和管理。Harbor是由VMware开发的企业级Docker registry服务。docker-registry-browser是…

人工智能之数学基础:线性代数中的线性相关和线性无关

本文重点 在线性代数的广阔领域中,线性相关与线性无关是两个核心概念,它们对于理解向量空间、矩阵运算、线性方程组以及人工智能等问题具有至关重要的作用。 定义与直观理解 当存在一组不全为0的数x1,x2,...,xn使得上式成立的时候,那么此时我们可以说向量组a1,a2...,an…

【Django】多个APP设置独立的URL

目录 方法一:各个App下设置自己的URL 1、在各自的App当中创建urls.py文件​编辑 2、在主urls当中包含子url 3、各App的urls中设置url 4、设置后台函数 5、最终结果 总结: 方法二:利用as方法,在总的URL中对views重命名 实…

函数递归的介绍

1.递归的定义 在C语言中,递归就是函数自己调用自己 上面的代码就是 main 函数在函数主体内 自己调用自己 但是,上面的代码存在问题:main 函数反复地 自己调用自己 ,不受限制,停不下来。 最终形成死递归,…

四、华为交换机 STP

生成树协议(STP)的核心目的是在存在冗余链路的网络中,构建一个无环的拓扑结构,从而防止网络环路带来的广播风暴等问题 一、STP 原理 选举根桥:网络中的每台交换机都会有一个唯一的桥 ID(BID)&am…

前端炫酷动画--图片(一)

目录 一、四角线框的跟随移动 二、元素倒影(-webkit-box-reflect) 三、模特换装(maskblend) 四、元素平滑上升 五、无限视差滚动 六、判断鼠标进入方向(轮播方向) 七、环形旋转效果 八、黑白小球交替旋转 九、hover时圆形放大 十、画一棵随机树(canvas) 十一、代码雨…

AI刷题-病毒在封闭空间中的传播时间

目录 问题描述 输入格式 输出格式 解题思路: 问题理解 数据结构选择 算法步骤 代码实现: 1.初始化: 2.设置边界条件: 3.判断 4.更新: 5.返回 最终的实现代码如下: 运行结果: …

SQL表间关联查询详解

简介 本文主要讲解SQL语句中常用的表间关联查询方式,包括:左连接(left join)、右连接(right join)、全连接(full join)、内连接(inner join)、交叉连接&…

路由器旁挂三层网络实现SDWAN互联(爱快SD-WAN)

近期因公司新办公区建设,原有的爱快路由器的SDWAN功能实现分支之间互联的服务还需要继续使用。在原有的小型网络中,使用的爱快路由器当作网关设备,所以使用较为简单,如下图所示。 现变更网络拓扑为三层网络架构,但原有的SDWAN分支…

麦田物语学习笔记:制作[SceneName]Attribute特性

基本流程 因为在现有的项目中,像开始场景的切换或者Telepot组件都需要手动输入场景名,有时还可能键入出错,而该特性能用选择的方式去解决这一问题 1.代码实现 SceneNameDrawer.cs //参数绘制 using UnityEditor; using UnityEngine; #if UNITY_EDITOR [CustomPropertyDrawer(…

HTML之拜年/跨年APP(改进版)

目录: 一:目录 二:效果 三:页面分析/开发逻辑 1.页面详细分析: 2.开发逻辑: 四:完整代码(不多废话) index.html部分 app.json部分 二:效果 三:页面…