在分解复杂的软件系统时,软件设计者用得最多的技能之一就是分层。在计算机本身的架构中,可以看到到处都有分层的例子:从带有操作系统调用的编程语言开始,到设备驱动程序和CPU指令集,再到芯片内部的各种逻辑门层层递进。网络互联中,FTP层架构在TCP之上,TCP架构在IP之上,IP又架构在以太网之上。
当用分层的观点来考虑系统时,可以将各个子系统想象成按照“多层蛋糕”的形式来组织,每一层都依托在其下层之上。在这种组织方式下,上层使用了下层定义的各种服务,而下层对上层一无所知。另外,每一层对自己的上层隐藏其下层的细节。因此,第4层使用第3层的服务,第3层使用第2层的服务,第4层无须知道第2层。(当然,并非所有的分层架构都这么不透明,但绝大多数是不透明的,或至少是几乎不透明的。)
将系统按照层次分解有很多重要的好处:
❑在无须过多了解其他层次的基础上,可以将某一层作为一个连贯的整体来理解。例如,无须知道以太网的工作细节,你照样可以在TCP上构建FTP服务。
❑可以替换某层的具体实现,只要前后提供的服务相同即可。例如,FTP服务无论是在以太网、PPP上还是有线电视公司使用的任何技术上运行,都无须更改。
❑可以将层次间的依赖性减到最低。假设有线电视公司改变了它的物理传输系统,但只要IP层不变,FTP服务就可以不改变。
❑分层有利于标准化工作。TCP和IP是标准,因为它们定义了各自层次的操作方式。
❑一旦构建好了某一层次,就可以用它为很多上层服务提供支持。因此,TCP/IP同时被FTP、telnet、SSH和HTTP使用。否则,所有这些高层协议都必须编写它们各自的低层协议。
分层是一种重要的技术,但也有缺陷:
❑层次封装了一些内容,但不是全部。有时它会为我们带来级联修改。在分层企业应用中,一个经典例子是添加一个需要在用户界面上显示且必须在数据库中的字段,那么还必须在用户界面和数据库之间的每一层做相应的修改。
❑过多的层次会影响性能。在每一层,一般都会从一种表现形式转换到另一种。不过底层功能的封装通常带来比代价更大的效率提升。例如,可以优化事务控制层,提高其他各层的效率。
然而,分层架构中最困难的问题是决定建立哪些层次以及每一层的职责是什么。