在《软件工程中的事实和谬误》一书中,Robert L. Glass说:
事实15:在小规模重用方面已经有了很好的解决方案。
事实16:在大规模重用方面仍然是一个基本未解决的问题。
事实17:在相关系统族群中,大规模重用效果最佳。
换句话说,你可以重用模块,但只能在非常相似的应用程序之间进行。试图使模块如此通用,以至于可以在任何应用程序中重用,这太难了。你最终会制作出过于复杂的可配置模块,并包含处理对给定应用程序无用的情况的大量代码。
为每个应用程序编写定制模块,只做每个应用程序需要的事情,而不多做其他事情,这样做会更好。对于像PHP这样的语言,每个请求都会加载代码,因此代码的数量对性能有显着影响,这一点尤其重要。
更细粒度的功能重用是不同的。例如,日志记录的用途在不同的应用程序中是相当相似的,无论这些应用程序彼此之间有多么不同。这就是为什么大多数框架都使用通用服务类的原因。
关于@A_Var的评论:
如果您事先知道了可能的功能范围,以及需要扩展的部分,那么您可以使类可重用。这对于在每个应用程序中使用类似的简单类来说相对容易。我提到了日志记录的例子。这就是Glass所说的小规模重用。
但我们不是在谈论简单的类。如果你尝试对一个复杂模块(比如多个类来处理多个屏幕、表单、不同的数据库架构等)进行同样的操作,编写足够通用以覆盖每个应用程序特定需求的代码就太难了。你最终需要在通用模块中添加更多代码,而这些代码总和比为每个应用程序编写单独的模块所需的代码还要多。
此外,测试成本非常高,因为你对基础模块所做的任何更改都需要重新测试使用和扩展它的所有应用程序。
最终,为每个应用程序编写新模块是更少的工作量,而且你可以通过使用更细粒度的可重用组件来获得效率。