技术开发 频道

你了解分层架构吗?给被PetShop“毒害”的朋友

【IT168 技术文章】

    笔者在仔细阅读了大量这方面文章后,认为许多朋友在分层架构的理解上存在两个比较大的偏颇:

    1.没有从本质角度去理解分层的内涵,而只是了解其表象。

    2.对分层架构的理解过于狭隘,只是少数概念,而又不够深入。

    许多朋友言“分层”则必称“DAL”、“BLL”、“表示层”等概念,殊不知“DAL”的内部还有“DataSource架构模式”、“t-Relational Behavioral 模式”、“t-RelationalStructural模式”等方面,而其中每个方面下下又有诸多具体模式,如“Data Source 架构模式”又有“TableDataGateway”、“Row DataGateway”、“AcitiveRecord”等等。再说“BLL”,大家都知道“BLL”是“业务逻辑层”,可是什么是“业务逻辑”?“BLL”又可以构建为“Transactiont”、“DomainModel”、“TableModule”三种模式,各是什么意思?另外,分层也不仅只有“数据访问层”+“业务逻辑层”+“表示层”这一种分法,诸如“服务层”、“持久化层”、“应用控制层”的概念朋友们是否真的熟悉呢。

    造成这种现象,我想很大一部分原因是因为大多数.NET平台的开发者(包括我在内)理解分层架构是从Microsoft的PetShop开始的。因为PetShop是官方的Demo,所以被众多.NET开发者奉为圣经,甚至成了.NET平台上分层架构的标准方案。我就曾看到许多朋友在我的博客中留下“分层架构还是PetShop最经典”、“想学分层还是看PetShop吧”、“你这是跟PetShop学得吧”这样的留言。朋友们太崇敬PetShop了,却忽略了一个事实:它仅仅是一个Demo。退一步说,即使它是一个实际应用的项目,这样通过一个具体项目去定义一个抽象概念的方式也是不科学的。

    举个例子,一个人不知道“牛”是什么东西,于是请教一位奶牛场管理员,管理员迁出一头奶牛,告诉他:“这就是牛”。从此以后,如果有人问他“牛”是什么,他就会告诉别人“牛”是一种体型庞大,行动笨拙,性格温顺,身上有黑白斑块图案,还有一个好大的咪咪,可以挤奶供人喝。有一天,他听说西班牙有斗牛这项运动,他大惊道:“这怎么可以!牛那么温顺,怎么能用来斗呢!而且牛是用来挤奶喝的啊!”

    故事中这个人犯了一个什么错误呢?他把“具体的一头奶牛”和“牛”这个抽象概念给划等号了。他认为牛就是“体型庞大,行动笨拙,性格温顺,身上有黑白斑块图案,还有一个好大的咪咪,可以挤奶供人喝”。殊不知这世界上还有黄牛、水牛、牦牛、斗牛、肉牛等各种牛。他没能做到“透过想象看本质”从而形成抽象概念,而犯了“一叶障目”的错误。

    其实,许多朋友之所以对分层架构理解片面或偏颇,是因为与故事中这个人犯了相同的错误。当初,我们不知道何为“分层架构”,于是微软给了我们一个PetShop,说:“看!这就是.NET平台下分层架构的产品。”于是我们“恍然大悟”:“噢!这就是分层架构啊!”。就这样,我们把“分层架构”这样一个内涵和外延都极大的抽象概念和一个具体的Demo划了等号,从而也变成了故事中那个人——我们言分层架构必称DAL、BLL,我们做项目必然依照PetShop方式架构……

    我们确实被PetShop“毒害”了。但这不是微软的错,更不是PetShop的错,就像在故事中,我们不能把罪责归咎于奶牛场管理员或那头奶牛。错在我们自己!当微软给我们PetShop时,我们应该在脑中清醒认识到:这是一个分层架构的Demo。而不是理解成了“这就是分层架构”。我们应该钻研、思考,从而抓住分层架构的本质,可是我们没有。与其说我们是被PetShop“毒害”了,倒不如说我们是被自己、被自己那种不良的学习习惯毒害了。我们仅看表象,还是只看了一个表象,然后就冒然对分层架构盖棺定论。而没能透过想象看本质。所以,我们同样犯了“一叶障目”的错误。

    以上的错误,笔者也曾经犯过!所以,在下文中,我想和朋友们一起分享一下我在反省自己的过程中,悟出的一些心得体会,希望能借此帮助更多朋友尽快走出“一叶障目”。

    洞悉分层的本质

    我们可以讨论如何分层,可以讨论分层的利弊,可以讨论分层有没有价值……但在这一切一切讨论之前,我们要先弄清楚一件事:分层的本质是什么?或者说:分层是怎么来的?如果这个问题不明晰,那么我们其他的讨论犹如“浮沙之上筑高台”,再精辟的言辞,如果没有一个牢固的基础,也是站不住脚的。

    想要了解分层的本质,就不得不说说分工。分工可以说是劳动生产力上最大的改良,最初分工的好处体现在“比较优势”上,由于各司其职,每个人可以从事其最擅长的劳动,再加上单纯劳动所带来的劳动熟练度提升和减少了更换劳动时的损失,使得劳动生产率大幅提升。然而,随着社会的发展,我们发现某些特殊形式的分工不但可以提高生产力,还有另一些好处!为了理解这些好处,我们举个实际的例子。

    今天是六一国际儿童节,一位母亲想给她的女儿买一个奶油蛋糕作为礼物。我们知道,蛋糕需要面粉、需要鸡蛋、需要牛奶等等,还需呀经过一系列复杂的加工和包装过程,但是这位母亲不需要关心这些,她只要去附近的超市直接买就行了。而超市里既没有养鸡场,也没有奶牛场,更没有种小麦(资讯,行情)的农民伯伯和烘焙蛋糕的工人师傅。这个简单的“买蛋糕”场景,大约可以用下图表示。

    图1、制作蛋糕的分工

    图1大约说明了一个蛋糕是如何从到达顾客手里的。可以看到,制作蛋糕不是一个单一的劳动,需要许多的分工,如果自底向上看,主要的分工包括:基础物质资料的种植生产、原料加工、蛋糕加工、商业销售。并不是所有分工都如上图这样,上图所示的分工,有一些特点,下面总结一下。

1
相关文章