当前位置: 首页 > article >正文

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

写在前面


这本书是我们老板推荐过的,我在《价值心法》的推荐书单里也看到了它。用了一段时间 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.kler.cn/a/511616.html

相关文章:

  • 【学习笔记15】如何在非root服务器中,安装属于自己的redis
  • rocketmq dashboard 安装
  • w-form-select.vue(自定义下拉框组件)
  • 1.写在前面
  • 【无标题】Cloudlog 电台日志系统 request_form SQL注入漏洞复现
  • Linux自学指南(学习路线大纲)
  • 【机器学习:三十三(二)、支持向量机(SVM)的核函数:概念、类型与应用】
  • PyTorch使用教程(8)-一文了解torchvision
  • 信息安全【在Ubuntu中安装nginx、MySQL和部署PHP】
  • vmware17.5 - 解决ubuntu长按按键会导致图形界面卡死的情况
  • ThinkPhp项目解决静态资源请求的跨域问题的解决思路
  • C# 动态创建Label和ComboBox控件并修改Text
  • 大数据时代的璀璨明珠:机器学习引领的智能应用革新与深度融合探索
  • 【2024年华为OD机试】 (B卷,200分)- 跳格子游戏(Java JS PythonC/C++)
  • 第三部分:Linux中的yum
  • 有线通信方式(I2C、UART)
  • 设计模式:构建高效且可维护的软件系统的基石
  • 车载测试和相关面试
  • 类和对象——类的对象占用内存的大小计算
  • 【C++】内存管理与分配