设计模式与编程实践解析

24、回顾我们讨论过的模式,并思考可能实现它们的理想场景。你可能想将适配器模式应用于现有代码,因为它通常适用于与现有库进行接口交互,而非新代码。如何使用适配器来确保两个接口正确地相互交互?

适配器对象位于两个不同的接口之间,可动态地在它们之间进行转换。适配可能需要执行各种任务,如将参数转换为不同的格式、重新排列参数的顺序、调用不同名称的方法或提供默认参数。

例如,当 `Interface1` 希望调用 `make_action(some, arguments)` 方法,而现有的 `Interface2` 类提供的是 `different_action(other, arguments)` 方法时,`Adapter` 类可实现 `make_action` 接口,并将参数映射到现有的接口,这样就能让两个接口正确交互。

25、抽象工厂模式,或者更具 Python 风格的衍生模式,对于创建一键配置系统非常有用。你能想到哪些地方会用到这样的系统呢?

常见的抽象工厂模式应用场景包括:

  • 操作系统无关的工具包
  • 数据库后端
  • 特定国家的格式化器或计算器

例如:

  • 操作系统无关的 GUI 工具包可根据不同操作系统返回不同的窗口组件
  • Django 可根据配置设置返回与特定数据库后端交互的对象关系类
  • 不同国家有不同的零售商品税费计算系统,抽象工厂可返回特定的税费计算对象

26、考虑组合模式。在编程中,我们周围到处都是树状结构;其中一些,就像我们的文件层次结构示例一样,显而易见;而另一些则相当隐蔽。在哪些情况下组合模式会有用呢?你能想到在自己的代码中可以使用它的地方吗?如果稍微调整一下这个模式,例如,为不同类型的对象包含不同类型的叶子节点或组合节点,会怎样呢?

组合模式的应用场景

组合模式在多种树状结构中非常有用,包括:

  • GUI 小部件层级结构
  • 文件层级结构
  • 树集
  • HTML DOM

在实际编程中,只要涉及树状结构的场景都可能适用,例如:

  • 操作文件目录
  • 构建 GUI 界面

若稍微调整模式,可以根据不同类型对象定义不同的叶子节点或组合节点。例如,在文件系统中,除了普通文件和文件夹,还可以有链接文件等特殊类型。通过定义不同节点类型,可以灵活满足各种业务需求。

27、在启动新项目或处理现有代码时,如何实践测试驱动开发?

实践测试驱动开发

这是你的首个练习。若开启新项目,做起来会更轻松;若要处理现有代码,可先为新实现的每个特性编写测试。

28、编写测试运行覆盖率报告有什么作用?测试驱动开发和为现有代码编写测试在代码覆盖率方面有什么不同特点?即使代码覆盖率达到 100% 就意味着测试了所有可能的输入吗?

在测试中运行覆盖率报告可检查是否遗漏代码行测试。测试驱动开发较易自然达到 100% 覆盖率,而为现有代码写测试则更可能存在未测试的边界条件,即便覆盖率达 100% 也不一定测试了所有可能输入。

29、请列举一些代码测试中的边缘情况,并说明考虑这些边缘情况对代码的意义。

代码测试中的边缘情况指的是那些与预期情况有所不同的值,如:

- 空列表(当期望得到满列表时却得到空列表)
- 特殊数值(与中间整数相比的零、一或无穷大)
- 不能精确舍入的浮点数
- 类型不符的值(当期望得到数字时却得到字符串)
- 无意义的值(当期望得到有意义的东西时却得到无处不在的 `None` 值)

考虑这些边缘情况对代码的意义在于,通过对这些边缘情况进行测试,可以确保代码在各种情况下都能正常工作,从而使代码处于良好状态。

30、请简要介绍 execnet、Parallel python、Cython、PyPy - STM 和 Gevent 这几个第三方库的功能。

  • execnet 是一个允许本地和远程无共享并发的库;
  • Parallel python 是一个可以并行执行线程的替代解释器;
  • Cython 是一种与 Python 兼容的语言,可编译为 C 语言,并有释放全局解释器锁(GIL)以利用完全并行多线程的原语;
  • PyPy - STM 是在超快速的 PyPy Python 解释器实现之上的软件事务内存的实验性实现;
  • Gevent 可用于提供额外上下文。

这些库能帮助开发者在不同场景下选择合适的并发解决方案。

31、首先,回想一下你最近完成的一个编程项目。找出设计中最突出的对象。尽可能多地为这个对象想出属性。它有以下属性吗:颜色、重量、尺寸、利润、成本、名称、ID 号、价格、样式?思考这些属性的类型。它们是基本类型还是类?是否有些属性实际上是伪装的行为?有时看似数据的东西实际上是根据对象上的其他数据计算得出的,你可以使用方法来进行这些计算。这个对象还有哪些其他方法或行为?哪些对象调用了这些方法?它们与这个对象有哪些类型的关系?

## 编程项目分析指南

需结合自身最近完成的编程项目进行思考和分析,具体步骤如下:

1. **确定最突出的对象**  
   在项目中识别出最关键、核心的对象。

2. **列举可能的属性**  
   分析该对象可能具有的各种属性。

3. **判断属性类型**  
   明确每个属性的数据类型(如字符串、整数、布尔值、对象等)。

4. **识别伪装成数据的行为**  
   找出那些看似是数据,但其实可以通过计算或逻辑处理得到的行为,并将其转化为**方法**。

5. **明确其他方
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值