我经常发现使用测试驱动开发有助于在面对这些问题时指导我。
设计模式是结果,而非目标。你不会想着“今天我要使用策略模式”,而是自然而然地使用它。当你在做第三个几乎相同的类时,你停下来拿起笔记本,思考通用情况并编写一个描述共享上下文的基类。然后将前两个类重构为子类,并对基类进行现实检查和修改。然后接下来的三十个类就变得轻松自如了。
直到第二天的团队会议上,你说:“我使用了策略模式。它们都工作得很好,所以只有一个测试程序,需要改变测试用例的参数。”这样你就为大家节省了30分钟的无聊时间。
熟悉设计模式可以使你在需要的情况下自然而然地使用它们。但如果人们将使用模式视为自己的目标,则会产生僵化、丑陋的代码,更多地关注机制而非目的;更关注如何做而非为什么这样做。
大多数模式解决的是诸如复杂性缓解和提供可扩展性点等经常出现的基本问题。如果明确不需要提供可扩展性点,那么提供它们只会无谓地增加代码的复杂度,并创建更多的故障点和测试用例。除非你正在构建一个发布到野外的框架,否则只解决实际面临的问题。
模式只是工具和词汇。您编写代码时应尽可能简单、易于理解和可维护。通过了解模式,您可以拥有更多选择,还可以在实施之前讨论方法的利弊。
无论哪种情况,您都不只是“切换”到“使用模式”。您只需按照自己最熟悉的方式编写最佳代码即可。
当你遇到一个可以用设计模式解决的问题时,GoF书籍的每一章都有一节介绍每个模式适用于哪些场景。你不应该分析每个问题然后去查找要使用哪种模式。相反,你应该熟悉这些模式,以便学会识别何时需要使用它们。
关于GoF的原始书籍之一最好的地方之一是讨论模式在哪些情况下最好解决问题。回顾这些讨论可以帮助您确定“是时候了”。
另一个好的起点是《Head First设计模式》。演示不同设计模式使用的练习足够详细,可以提供很好的学习体验。此外,这些练习也基于现实世界的场景,因此应用设计模式的适当时间从未是一种牵强附会。