什么是框架?

引言

框架这个词在许多的地方都能见到。在给出框架是什么的定义之前,我们会讨论骨架 、框架 和架构 这三个常见的且容易混淆但又相似的术语。在实际中,我们通常会用模式或者框架又或者架构来概括这三个术语。
回溯到尚未出现软件工程之前 ,我们能够想到当时的编程环境是“天堂”又是“地狱”。软件作为一种著作物,附带版权的保护减少了软件代码被他人修改使用的可能,阻碍了软件代码的传播,也阻碍了软件行业的发展。软件作为一种思维产物,必然带有主观性。软件作者的思维直接影响到了软件自身的质量。同时,为了复用积累下来的代码,软件作者才会对复用的代码作一定的改进。这在一定程度上对常用的代码进行了维护和复用,虽然这不是框架出现的标志,但这是框架出现的起点。

复用为本

复用是框架的基础和目的。若一个框架没有达到复用的目的,那么,我们不能称之为框架。代码的复用阶段达到相当的规模时则可以简而言之框架或伪框架。通常复用会构成库和实用性工具。“库”作为一种思维抽象而存在,描述了软件中某一部分需要完成的工作。实用性工具对库的使用进行了简要但又是实用的复用,通常把这种行为称为封装。当这些库和实用工具在经过一次又一次的重复迭代下得到稳定性的保证后,软件作者很大程度上会对其所做的软件共同的流程逻辑作一次更高层面的复用。这时候骨架就诞生了。骨架的诞生使得软件作者在项目接下来的开发中能够更加充分地集中于软件开发本身。

什么是骨架

骨架是一个软件的基本构成部分。在软件中,骨架更普遍存在在软件执行流程中。因此,骨架更像是软件共同逻辑(例如用户登录动作,用户注册动作被抽象为动作处理骨架)的抽象复用。骨架的作用使得我们能够较为轻易地构造一些传统上较为复杂的软件。例如,管理系统。管理系统通常是由较为固定的步骤构成的(例如CRUD),这些步骤抽象成一个整体的骨架能够提高代码的可维护性。同时由于骨架的存在我们可以关注在管理系统的自身,如用户数据,被管理数据,以及相关的业务操作流程。这些操作流程也可以继续进一步以一个特定的骨架而存在。这样一个个骨架能够以描述性的方式把软件从脑海中描述出来。我们可以使用流程图达到这样的目的。另外,由于骨架的简单性,我们可以在需要的时候进行较多的扩展。在这个时候软件作者更多地通过钩子(Hook)的形式来提供,即使用模板模式 。骨架在这个时候可以被看作一个单骨架的框架。了解一个单独的骨架总比多个骨架简单得多,这是一些大项目使用小框架的原因之一。总而言之,骨架具有简单性,骨架的诞生是为了对特定流程的复用;骨架具有可扩展性,可扩展性和简单性一般是关联而存在的。通过极为简单的钩子,我们可以定义一些具有特别用途的操作例如事件发布,外置插件(Plugin)等等。当一个骨架能够以一种更为通用的形式给软件带来一定的简化时,框架就出现了。

什么是框架

框架是一个软件的蓝图轮廓或者蓝图的一部分。蓝图中具体的内容能够通过骨架提供较为普遍的方案。这样能够使得“蓝图的内容”是能够被维护的。和骨架相同,框架也是为了让软件作者关注软件作者需要关注的地方,而无需对关注点以外的事情付出精力。和骨架不同,框架致力于简化软件开发,使得软件开更像一个搭积木的过程。而骨架是为了降低软件开发的复杂性把流程进行复用。框架在骨架的基础上对软件构建进行了简化,这些简化通常包含骨架层面上的简化,第三方扩展支持的简化,编码规范上的简化等等。骨架作为流程逻辑的重用,在框架中作为主要部分。这里值得说明的是,框架的大小在某些程度上并没有大小之分,仅仅是骨架和扩展涉及的范围的宽广问题。
由于涉及的范围过大而导致框架必须发生改变。这些连带作用导致了框架变得复杂和难以看到全貌。就是这样,有了小项目用大框架,大项目用小框架这个说法。对于小型项目来说,小项目并不需要在深层次了解和全局控制框架自身。因此常常为了节约不必要的框架和插件维护而选择经起考验的大框架和第三方扩展。这样一来项目只需要更加关注在自身的开发。这样节约了时间,节约了维护成本,但这些小项目通常是不考虑软件依赖的风险。而对于大项目来说,框架的本身是需要的,但框架的绝大多数骨架和扩展又是不必要的。这种情况通常会被称为冗余。为什么是不必要的呢?大项目必须要考虑到后续的开发。
骨架越多,框架就越复杂。扩展越多,需要处理的依赖风险就越多。在这个复杂的情形下,越是需要维护的软件,依赖的风险越是不可控,例如依赖被废弃对项目会有不必要的危急影响,这个影响犹如四年前的软件依赖突然需要升级最新的版本到现在一样。涉及范围广的框架所提供的骨架和扩展功能与项目自身无关,浪费了项目实际关注点的精力。这些精力对于大型项目来说是极其关键的。灵感是不稳固的,不要要求灵感能够一直留在脑海中。常常会有过度设计的事情发生,不管是笔者还是其他人。我们很难避免过度设计,这些过度设计在某些程度上是软件作者对软件发展的预测。对于小型项目,它更加需要快速开发,后续维护较少。而对于大型项目需要各个部件的密切配合甚至给扩展预留空间,往后又是需要频繁的维护和需求变更。这就要求大型项目需要承受更多的挑战。想要项目承受得起挑战,软件作者必须要确保每一部分都是简单的。

架构与框架

架构是一个用于描述整体的宏图。架构一般描述了整个应用的大体部分,如在Web 中的Frontend-Middle-Backend架构中有C/S 架构和B/S架构两种形式。这两个架构中把服务端作为后端,把HTTP 作为中间件,把客户端和浏览器作为前端。这就是架构的作用,无需注意到Web应用的具体。而集中在相应的架构层。通常我们也会在框架中使用架构来描述框架自身是如何设计的。

总结

那么框架应该是什么?框架是一个以复用为基础和目的,以骨架为主要内容的,以简化应用开发为核心的设计基础。