层次化软件体系结构

层次化软件体系结构
Layered Software Architecture

一个好的Web应用程序看起来应该像一块蛋糕,如图2-1所示。

图2-1:一个层次分明的蛋糕
(minky sue摄影:http://flickr.com/photos/kukeit/8295137

事情总是先苦后甜的,所以请暂且容忍我偏离一下主题。需要注意的是这里将提到的蛋糕是英式蛋糕,而不是仅有一层的加拿大蛋糕——相信接下来你很快就能明白其中的区别。但若是你对蛋糕完全没有概念也不要紧,只要记住蛋糕是种有多个层次的甜点就够了。蛋糕底部是一层较为坚实的、类似海绵的部分。其他各层都放在这层“海绵”之上。若是没有了这一层海绵,也就不存在所谓的蛋糕了。海绵层支撑着蛋糕上所有的其他部分,进而构成了这道甜点真正的内核。海绵部分一般较大,且结实可靠,而之上蛋糕的其他部分则是短暂而易变的。

在Web系统中,持久化存储层恰似蛋糕中的海绵层。存储数据的方式多种多样——可能以硬盘上文件的形式出现,也可能就是数据库中的记录。但它却体现了我们最为重要的资产——数据。在对其进行访问、操作或显示之前,这些数据总要有个安身之所。因此数据的存储也就成为应用程序中最重要的基石。位于海绵之上的就是至关重要的果冻(Jelly)层(对北美读者而言,则是Jell-O)。每个蛋糕都有海绵层,这一层虽然很重要,但各个蛋糕的海绵都一样。只有通过果冻层才能体现蛋糕的独有特性。用户/用餐者只能通过果冻层来和海绵蛋糕层交互/食用海绵蛋糕。果冻不仅仅体现了我们蛋糕独一无二的主要特性,而且是对底部海绵层访问的必经途径。果冻层和海绵层一起才定义了什么是一个真正的蛋糕。而其他添加于这两层之上的,都是关于交互和外观的内容。

在Web系统中,我们的业务逻辑负责扮演果冻层。就像果冻层的作用一样,业务逻辑体现了我们系统与其他系统的区别和我们系统的独特之处。访问和操作数据的方式方法定义了系统的行为及所需遵循的规则。而访问系统数据的惟一途径就是通过业务逻辑。如果我们除了持久化存储和一些业务逻辑之外什么也不添加,系统也已经具备了核心功能,但没有哪位客户会愿意食用/使用它。很久以前,业务逻辑总是用C或COBOL来实现(没开玩笑)如今,只有大型系统(性能攸关)和遗留系统(修改成本过高)才采用这种方式。现在,使用你所偏爱的脚本(PHP、Perl、Python、Ruby等等),或者选择使用较为友好的Java语言来实现业务逻辑是完全可行的。

至此我们有了作为支撑的海绵层和体现个性的果冻层(上面或许还有小块水果,在分层系统中找不到能和这些水果类比的有意义的事物。但不管怎样,它们也是蛋糕的有效组成部分)。现在也许可以宣称我们有了一个甜点,是的,这个甜点正逐渐成形,但是却还不能被称为一个蛋糕。下一步我们还需要奶油冻。将奶油冻涂抹在果冻上,对用餐者而言,奶油冻是和处于它下面的层次的分界面。奶油冻并不是系统的基石。实际上,只要有必要,我们完全可以将它去掉。事实上,我就曾经烤制过极差的奶油冻(烧过头的牛奶实在糟透了),但直到我将它倒在果冻上后,才真正意识到它是多么的讨厌。这可真是个大错误,好在我可以将它刮掉重做。最后的蛋糕还挺不错。所以说,奶油冻本质上是可以被替换的。

在Web应用中,与奶油冻相对应的是我们的页面和交互逻辑。业务逻辑这个果冻层定义了如何访问、操作和存储数据,但没有规定数据应该一起被展示,也没有规定修改数据的具体流程。这些事是交给页面逻辑来做的,页面逻辑告诉用户需要经过哪些沟沟坎坎才能完成目标。页面逻辑和交互逻辑是可被替换的,替换它们不会影响到应用程序的功能。而且如果你在业务逻辑层之上构建了一系列的API(具体方法将在第12章中详细探讨),那么完全可能在业务逻辑层之上建立多个交互逻辑层。这里无法继续用蛋糕作类比了(到了某个时候,这终归是无法避免的),但我们仍然可以尝试着想象有这样一个蛋糕,它有着巨大的海绵层和果冻层,上面的多个不同区域中都有另外的层次。也就是说,底部层次可以支持多个交互层,只要将它们建立在不变的底部基石之上。

挑剔的观察者或厨师会注意到我们的甜点还不算完整——至少还需要一层,而如果要和Web系统进行类比,那么至少还需要两层。紧随奶油冻之后的层次就是乳酪,你是不可能只有奶油冻而没有乳酪的;这两样在蛋糕中是一体的。仅有奶油冻的蛋糕对普通用餐者而言是难以接受的。虽然固执的厨师/开发者会认为没有乳酪的蛋糕也算蛋糕,但对用餐者/用户而言那就是一团糟。因为我们总需要某种途径(比如乳酪)来将下层信息传达给我们的用餐者/用户。

在Web应用中,乳酪对应的是Web上的标记、桌面上的用户界面工具集和应用程序接口中的XML。标记层给人们提供访问底部层次的方法,进而给用户提供处在标记层之下层次的相关印象。单是乳酪本身无法成为一个蛋糕,甚至相对蛋糕本身来说它也不能算是蛋糕的一个重要组成,话虽如此,但天生我才必有用,它的重要用途就是告诉普通观察者这是一个蛋糕。与之相类似的,标记也用于和用户交换数据,并将交互概念传达给用户。稍微偏离一下蛋糕这个话题,浏览器和其他用户访问引擎可以由我们用户的嘴巴和味蕾来扮演,嘴巴和味蕾将食物转换为对用餐者有意义的各种感觉,而浏览器等则将我们的层次变成对用户有意义的内容。

撇开盛放蛋糕的器皿(市场部)和用餐者(用户)不谈,现在已经是万事俱备,只欠东风了。由于现在蛋糕已经具备了所有必要部分,开发者可能已经很满足而止步不前了,但是一个普通用户却会令人出乎意料地关心其表现形式。因此,在我们层次分明的杰作之上,还需要用水果、碎糖粒或者其他美妙诱人的东西来装饰和点缀。这些装饰物的主要作用,就是让其下的层次显得漂亮。漂亮的蛋糕更加易于被人们接受和承认,也能使他们食欲大增(前提是这些点缀摆设一定要好看,否则就可能有相反的效果)。

被我们比作点缀的是展现层,展现层位于我们的代码和工程学形成的杰作之上。就Web页面而言,展现层是一个由标记、级联样式表和图形(有时还有脚本化的窗口部件,如果我们不将它们归为标记一类的话)所组成的领域;对基于API的应用程序而言,展现层与上述相同;对于电子邮件,上述内容则无需存在(除非你正在发送HTML邮件,这时它的展现层和普通Web页面没什么两样)。

总之,我们想说明什么呢?一个好的Web应用有许多的层次,每一层都有其独立的功能,所有这些层次通力合作,构建起一个系统,但假如你尝试着随意组合它们,你只能得到一个劣质的系统或者说一个什么也不是的大杂烩。从开发人员/厨师的角度来考虑,自然是最底层最重要,因为它是整个上层结构的基石,支撑着我们的系统。而从用餐者/用户的角度来看,却是比较高的层次更为重要,因为它们才是甜点的亮点,用餐者/用户会将底层视作理所当然的存在,尤其是最底层。因为对用户而言,这些底部层次自然而然的就应该是Web应用的一部分。待会儿我们还会看看这些层次相互之间如何进行交互。(不幸的是,我们还无法像蛋糕一样,只要依靠重力来维持它的稳定,因为我们要的是一个经得起折腾的系统)。

摘自:《构建可扩展的Web 站点(相关阅读《构建可扩展的 Web 站点》读后随感   by  Fenny

 

 

“创业&升职”,请看《走出软件作坊》;

“求职&面试”,请看《编程之美——微软技术面试心得

posted @ 2009-02-27 16:36  博文视点  阅读(663)  评论(0编辑  收藏  举报