第 2 章 反模式
下面我们开始讨论反模式;在你满怀希望地以为我会告诉你一些神奇的东西,可以在不使用设计模式的情况下奇妙地简化你的代码之前,我不会这样做(我说过我很擅长粉碎希望和梦想吗?) 简而言之,反模式就是你不想在代码中出现的东西。
说到粉碎希望和梦想,如果你有初级开发人员,反模式也是一种很好的教学方法,同样应该避免。学习反模式还能提高代码审查的效率;与其根据个人观点争论代码质量,不如向外部来源咨询代码质量问题。
反模式是一种解决反复出现的问题的糟糕方法,通常效果不佳,而且有可能适得其反。反模式会造成技术债务,因为开发人员以后必须努力重构以解决最初的问题,但希望能使用更有弹性的设计模式。
我们都遇到过 "意大利面条代码"(Spaghetti Code);与我共事的一位合同开发人员在面对高额技术债务时,对要求越来越高的产品负责人感叹道: "面条太多了,我还不如开个餐馆呢!" 意大利面条代码是指程序的控制结构过于纠结和复杂,几乎无法理解,可以说是一种反模式。PHP 5.3.0 中的一个主要批评是语言中 goto 操作符的实现。事实上,那些批评其实现的人声称,Goto 操作符将为 PHP 中更多的 Spaghetti 代码提供另一个借口。
Gotos 在 PHP 中备受争议,甚至有人将其作为一个 bug 报告,并指出:"PHP 5.3 包含了 goto: "PHP 5.3 包含了 goto。这是个问题。说真的,PHP 已经发展到这一步,没有使用 goto 语句,为什么要把这种语言变成一个公共危害?
此外,缺陷报告的提交者将预期结果列为 “世界将会末日”,而实际结果是 “世界已经末日”。尽管如此,PHP 中的 goto 操作符受到严格限制,因此您不能随意进出函数。一些人还认为它们在有限状态机(基本上是基于多个输入的二进制输出的东西)中很有用,但这也是有争议的;因此,我可以让您自己判断。
您可能经历过复制和粘贴编程,其中整个代码块被复制并粘贴到程序中;这是另一个不良软件设计的例子。实际上,开发人员应该设计他们的软件来创建通用的解决方案,而不是复制、重构和粘贴代码以适应情况。
本章将以介绍为什么学习反模式很重要为开端。在这一章中,我将不仅讨论传统的反模式相关的软件设计,还讨论反模式相关的 Web 基础设施和管理风格。除此之外,我还想讨论一些 PHP 特定的反模式或 PHP 的缺陷,您可能需要在自己的代码中加以补偿。
本书末尾有一章专门介绍重构;如果重构过程对您感兴趣,这一章将帮助奠定您可能想要开始思考的想法的基础;此外,特定于设计模式的章节可能有助于您实现最终的目标代码。在专门介绍重构的章节中,我们还介绍了代码异味,它可以帮助您在维护的代码库中发现反模式。