第 8 章 使用 TDD 和 SOLID 原则

当我第一次开始编程时,我立即沉迷其中。一想到能用程序和自己的想象力来解决问题,我就觉得非常兴奋。在学校的时候,有一次老师给我们布置任务,让我们用 Turbo-C 解决一些简单的代数难题。我当时浑身起鸡皮疙瘩,感到非常兴奋,因为我很快就意识到,我只需编写程序,就能反复解决这类难题。编写一次程序,传递不同的参数,得到不同的结果。我爱死它了。我还记得一个挑战,如果有人站在桥上,扔下一个球,几秒钟后听到声音,就能计算出桥的高度。很简单!现在,我可以用我的程序反复为我计算桥的高度。现在,我不必一直记住地球的重力加速度约为 9.8 m/s2 - 我只需在程序中声明即可!我明白了,在编程过程中,我可以按照自己的规则从 A 点到达 B 点。给我一个任务,我可以用自己的想象力想出一个解决方案来完成任务。对我来说,这就是编程最棒的地方。我是一个骄傲的意大利面代码编写机器。我不在乎我的代码有多干净,我只需要用代码解决问题!学习其他编程语言让我更加兴奋,我认为编程的可能性是无穷的—​只要任务或挑战不违背物理定律,我就认为可以用编程来解决!我并不注重代码的整洁性和可维护性。那是什么?我不需要这些!

当我开始从事专业的软件开发工作时,我继续保持着我的思维方式,那就是喜欢用编程来解决问题。我不在乎我的解决方案有多么杂乱无章—​它们解决了问题,我的雇主和客户都很高兴。好了,我走了。太简单了。我以为自己无所不知,无人能挡。天哪,我错得太离谱了。我学得越多,越发现自己对编程知之甚少。

当我继续与其他开发人员一起开发更复杂的项目,同时又要维护这些项目时,我才深刻地认识到,我自己编写的代码不容易维护,这让我的生活变得多么艰难。我可能不是这个星球上唯一遇到过这个问题的开发人员。我相信其他人也遇到过这些问题,我也相信会有解决方案。罗伯特-C-马丁(Robert C. Martin)提出的 SOLID 原则是让我的生活变得更轻松的解决方案之一。这些原则确实改变了我的编程生活,而将这些原则与测试驱动开发(TDD)结合使用,则让我的编程生活变得更加轻松!还有更多的原则和架构设计模式可以帮助你提高应用程序的可维护性,但在本章中,我们将在进行 TDD 的同时逐一介绍 SOLID 原则。

我们将经历将 Jira 票据解释为 BDD 测试的过程,而 BDD 测试又将帮助我们创建集成测试,直至开发解决方案代码。然后,我们将逐一介绍在实际项目中使用 TDDSOLID 原则。

在本章中,我们将讨论以下主题:

  • Jira 到 BDD 到 TDD

  • 采用单一职责原则的 TDD

  • 采用开闭原则的 TDD

  • 采用里氏替换原则的 TDD

  • 采用接口隔离原则的 TDD

  • 采用依赖倒置原则的 TDD

缩写 全称 中文

S

The Single Responsibility Principle

单一责任原则

O

The Open Closed Principle

开放封闭原则

L

Liskov Substitution Principle

里氏替换原则

I

The Interface Segregation Principle

接口分离原则

D

The Dependency Inversion Principle

依赖倒置原则

技术要求

在本章中,读者需要使用 https://github.com/PacktPublishing/Test-Driven-Development-with-PHP-8/tree/main/Chapter%208 中的存储库中的基本代码。

准备章节的开发环境

首先,在 https://github.com/PacktPublishing/Test-DrivenDevelopment-with-PHP-8/tree/main/Chapter%206/base/phptdd 获取本章的基本代码,或者只需运行以下命令:

curl -Lo phptdd.zip "https://github.com/PacktPublishing/TestDriven-Development-with-PHP-8/raw/main/Chapter%208/base.zip" && unzip -o phptdd.zip && cd base && ./demoSetup.sh

要运行容器并执行本章中的命令,您应该位于 docker-server-web-1 容器内。

运行以下命令来确认我们的 Web 服务器的容器名称:

docker ps

要运行容器,请从主机存储库的 /docker 目录运行以下命令:

docker-compose build && docker-compose up -d
docker exec -it docker-server-web-1 /bin/bash

进入容器后,运行以下命令来安装 Composer 所需的库:

/var/www/html/symfony# ./setup.sh
/var/www/html/behat# ./setup.sh