软件中的分层

tiers

在分解复杂的软件系统时,软件设计者用的最多的技术之一就是分层。

例如网络互联中,HTTP层架构在TCP之上,TCP架构在IP之上,IP又架构在以太网之上。

例如我们常用的很多软件,还有网站,都明显的这三层结构:表现层,业务逻辑层,数据存取层。

在这种组织方式下,上层使用了下层定义的服务,而下层对上层一无所知。另外,每一层对自己的上层隐藏其下层的细节。

好处:

在无需过多了解其他层次的基础上,可以将某一层作为一个有机整体来理解。例如,无需知道以太网的工作细节,你照样可以在TCP上构建HTTP服务。

可以替换某层的具体实现,是要替换前后提供的服务相同即可。例如,HTTP服务无论是在以太网、PPP上、还是其他任何网络上都无需改变,而且与提供传输电缆的网络运营商无关。

可以将层次间的依赖性减到最低。假设网络运营商改变了物理传输系统(电话线改为光纤),但只要IP层不变,HTTP服务就可以不变。

分层有利于标准化工作。TCP和IP就是关于他们各自层次如何工作的标准。

一旦构建好了某一层次,就可以用它为很多上层服务提供支持。如,TCP/IP同时被FTP、telnet、SSH和HTTP使用。否则,所有这些高层协议都必须编写它们各自的底层协议。

缺陷也有:

层次并不能封装所有东西。有时它会为我们带来级联修改。如,一个网站要增加一个在页面上显示的数据项,就必须要在数据库中增加相应的字段,还要修改业务逻辑层,最后修改表现层。

过多的层次会影响性能。在每一层,一般都会从一种表现形式转换到另一种。不过底层功能的封装通常带来比代价更大的效率提升。
分层架构中最困难的问题是决定建立哪些层次以及每一层的职责是什么。拿网站应用举例。

表现层的主要职责:向用户显示信息,并把从用户那里获取的信息解释成业务逻辑层上的各种动作。

业务逻辑层的主要职责:必须做所有和业务相关的工作,包括根据输入数据或已有数据进行计算,对从表现层输入的数据进行验证,以及根据从表现层接收的命令来确定该调度哪些数据存取层的逻辑。有时候,业务逻辑层对表现层完全隐藏了数据存取层。

数据存取层的主要职责:主要关注与其他系统的交互。大多数情况,其他系统是指数据库,那么数据存取层的主要职责就是存取持久数据。
简单介绍到这,主要参考《企业应用架构模式》。PHP网站中分层的实践,有机会细说。

发表评论

电子邮件地址不会被公开。 必填项已用*标注

您可以使用这些HTML标签和属性: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">