.NET应用架构设计—面向对象分析与设计四色原型模式(彩色建模、领域无关模型)(概念版)

阅读目录:程序员

  • 1.背景介绍
  • 2.问本身,UML对你来讲有意义吗?它帮助过你对系统进行分析、建模吗?
  • 3.一直以来其实咱们被一个缝隙隔开了,使咱们对OOAD高不可攀
  • 4.四色原型模式填补这个历史缝隙,让咱们真的看见OOAD的但愿
  • 5.在四色原型上运用彩色建模加强视觉冲击力
  • 6.经过四色原型模式建模出领域无关模型
  • 7.结束语:建模时你能够不考虑具体实现,可是建模者要懂技术实现

1.背景介绍

至今我都清楚的记得我第一次被面试官问起什么叫”建模“技术时的情景,那是好几年前的事情了,当时是成竹在胸的去面试一个有关系统分析、设计的.NET高级软件工程师岗位。面试官几乎没问我有关.NET方面的任何技术实现,他就简单的问了问:“你如何把握你所分析出来的系统的正确性?”,我当时有点小激动,以为这个问题应该很简单嘛,都是概念而已,让他直接点问,结果他来一句:“你懂建模吗?,能给我解释一下建模的做用吗?“,接着他出了一个小例子,让我对这个例子进行建模,要考虑到各类扩展性、业务稳定性的关键点,要边建模边说出为何要这么建模,要说出思路。他最后重点强调了一下:“建立出来的模型是不容许跟任何具体的代码、工具备关联的”。面试

在我如今看来,他的意思也就是说建立出来的UML类图模型是领域无关模型(领域通用模型),能够用任何一种编程技术去实现他,做为建模者不须要考虑这些实现细节,考虑的越多越容易分散你对真实业务的等价建模,容易犯技术人员的通病(用技术的思惟来考虑业务)。算法

我当时心想这个容易啊,不就是用UML搞点图出来作作秀嘛,体现出分析、设计的高端嘛,其余还能有啥做用;其实我当时之因此这么想是由于我对UML、建模也尝试过学习、理解和运用,结果我发现这就是一个做秀的工具罢了,对这个东西很不屑,甚至对软件工程中的“建模”领域有一种抵触心理。编程

我当时随口说了一些我学习UML建模时的心得,心想这个也就是最终答案了,由于它确实就是这个做用(”做秀“),而后我经过代码驱动建模,倒着推导出UML的类图,结果和我意料的差很少;基本上都覆盖了这个小例子的几大方面,反正面试官不知道我是如何得出这个UML类图的,只有天知道,我是经过先构建代码模型而后反方向推到出类图模型的,嘴上说的跟心理想的彻底是相反的。设计模式

在我感受很是良好的等着面试官接着问下一个问题的时候,状况出现了。面试官说我漏掉了东西,说我没有充分考虑到业务场景,没有将业务概念中的关键概念划分清楚,甚至疏忽了很重小的领域实体属性,按照我这个模型图开发出来的软件是不可以知足如今的业务要求的。我当时就蒙了,啥叫关键概念,哪一个概念不是关键概念啊,又有哪里不能用了,心理有点委屈,一时不理解,以为面试官在为难我。网络

其实我如今能明白当时面试官说的是什么意思,他是指我未能清晰的表达出各个类的职责,看上去每一个类扮演的角色都是同样的,无非就是属性、方法这些类元素,我未能捕获到核心领域概念,未能站在领域考虑建模,而是站在代码的层面上来从低往上看的,不少东西是看不清楚的,说白了,开发人员拿到这个类图可否明白本身将要面对的领域,若是能明白,此时类图模型是健康的,若是不明白那就是有问题的,由于模型图不是给本身看的,而是给整个团队交流共享的。架构

后来我本身调整了一下心情,就算面试失败我也要有总结才行,面试原本就是一个被虐的过程。(“佛曰:此时正是修行时”,就当是锻炼好了。)工具

我虚心的向面试官请教我这个模型图哪里有问题,他指出了有可能我这辈子都没法看见的分析盲点,他说这个问题是程序员用技术思惟来分析建模的通病。为何他能看见这些盲点,而我不能,我很想知道这其中的精髓,我当时就要求降薪到这里来学习,面试官不降薪愿意让我过来,他也是一个对技术有追求的人吧。可是后来我有特殊事情未能去贵公司就任,此后我一直遗憾,这个建模精髓我有可能一生都搞不懂了。学习

如今我能明白,其实若是用代码级别的分析思惟来辅助你建模就必定会有盲点,由于代码级别的“设计模式”,“设计原则”并不是建模时的“分析模式”,这是两个不一样的问题域,也就是说彼此用在不一样的业务领域的,不可以一律而论,若是交叉使用就会误导你目前的重心,你会往里面添油加醋。spa

“建模”这个很是抽象且神圣的词是多么的霸气,貌似是已经触及软件工程的最高境界了;崇拜,自卑;搞软件开发也有几年了,竟然连建模都不懂;那一晚上我完全失眠了,从那之后我在技术上充满了无助感,为何?由于我已经清楚本身要想在软件领域有必定的成果,必须学会对真实世界建模,从那开始”建模“一词在我脑子的已经和UML关系不大了。

以后我在软件分析、设计的海洋里苦苦寻找这个曾经在我面前就像流星同样划过的”建模金钥匙“,有了它我就能够去一个神圣的世界。展转反侧几年过去了,在前不久我终于知道“建模的金钥匙”是什么了,这类东西在网络上不多见,写的不多,下面咱们来详细了解它。

2.问本身,UML对你来讲有意义吗?它帮助过你对系统的分析、建模吗?

我想学过软件开发的人都多多少少了解UML,简单讲它就是一个用来建模的语言,你能够纯粹的把它理解成是一个画图工具,定义了一些元素,用来表达不一样的概念。这里咱们关心的是UML类图,也就是用来进行面向对象结构建模用的,经过各类不一样的图形来表达抽象的对象结构。

图1:简单的订单类图

上图是一个很简单的“订单”与“产品”相关的类图,咱们都能懂这里面的意思,由于咱们对这块的业务很了解;知道在什么地方应该有什么,好比Order中的计算商品总价的算法,有相关业务背景的人都知道这里是会存在的极大逻辑变化的地方,因此咱们须要经过接口来隔离这块逻辑。

咱们之因此可以画出这张类图跟UML这个语言自己其实不要紧,重要的是你对相关的业务很是之了解,在你脑子里能够不使用UML来建模,你能够用任何一个草图来建模,也就是说UML并不等于建模,这个要清楚的认识。那咱们使用UML有何用?它并无帮助咱们来分析系统;没错,UML从某个角度讲它没有直接帮助咱们对系统尽心分析建模,帮助咱们分析建模的是那些业务知识,懂业务的人能够不使用UML来建模,随便用一种图形表示法来讲明业务概念便可。其实UML只不过是一个通用的模型表达语言而已,是用来帮助咱们交流模型用的,并不是是建模的思想和方法。

既然UML不可以帮助咱们分析系统,那咱们如何才能准确的建模出咱们不是很熟悉的领域呢?咱们必须认可,领域专家若是懂技术确定是建模的最适合人选,可是现实并不是这样,须要咱们技术人员去熟悉领域而后建立模型,可是这中间不免会漏掉重要的业务概念,由于毕竟从真实的业务到最终的模型是有一个过程的,而最让咱们无助的是在这个过程当中没有任何可行的指导思想能够借鉴的,只有经过经验来把握最终的质量。

老是经过经验来建模不符合软件行业的发展方法,显然不行,这种建模技术难道不能够传递吗?答案是能够传递的,说明这个能够传递的技术正是本文的目的。咱们继续往下看。

3.一直以来其实咱们被一个缝隙隔开了,使咱们对OOAD高不可攀

上节中其实已经抛出建模的核心问题域了,只不过不是很明显;咱们用本节来重点突出这个长久以来一直困扰咱们建模者的问题域,以引发咱们对它的重视,由于它也是软件工程中的一个重要的研究领域。

如本节标题所说,其实咱们被一个建模时所产生的一个缝隙隔开了,而这个缝隙很长一段时间内没有人关注过,也没有引发相关重视,因此致使咱们的建模技术很难提高。

建模是一个过程,这个过程大概是这样子的,须要咱们将真实的业务场景准确的用某种建模语言表达出来,换句话说用什么建模语言表达出来很容易,重点是如何得出这个模型,而得出这个模型的过程就是咱们这里所说的建模缝隙。

图2:

从“业务概念”到“类模型”中间夹着一个“建模过程”,这个地方其实一直以来就是分析建模的鸿沟,这个空白的地方一直没有成熟的经验能够学习。在咱们对当前分析的业务不是很了解的时候如何正确的建出对应的类模型,表层的领域概念咱们能够根据本身的经验去够发现它,可是这毕竟是没法传递的知识。不少OOAD的书籍甚至包括不少软件工程中的经典书籍都未给出这里的答案,若是用一句准确的技术术语来形容这个过程的话,其实就是缺乏一套建模分析模式,缺乏一个可让咱们无论针对什么样的业务进行分析时都是一套不变的指导模式。我想这个问题对咱们建模者来讲确定是共同的问题,咱们须要解决它。只有这样咱们才不会碰见本身所不熟悉的业务领域时而一筹莫展,固然你能够说你也同样能够进行OOA,可是你必定会漏掉什么的,这是分析盲点,是没有正确指导思想的必然结果。正如上图中的”下订单“和”退货“两个核心的领域模型未能在右边的”类模型“中建模出来,大部分开发人员的通病就是没法识别出潜在的领域概念,认为”表层“ 的领域概念就是类模型中的”实体“,其实这样咱们到最后就回到了表驱动的开发过程中去,由于你只有经过E-R模型来思考时才能发现这种平面的结构,可是这又和正确的软件开发访问论背道而驰了。

4.四色原型模式填补这个历史缝隙,让咱们真的看见OOAD的但愿

本节咱们将讨论一个分析模式,它存在有一段时间了,值得咱们高兴的是它就是专门用来解决上述小节中阐述的“分析”鸿沟的,经过这套模式咱们几乎能够分析任何一个业务领域,不再用怕因为本身对该领域不熟悉而漏掉了重要的领域模型,而致使代码混乱、难以重构的最大问题就是丢失重要的领域概念,让各个对象的职责未能正确的在本身的空间中。

这个分析模式就是”四色原型“模式,根据名字咱们就能够大概猜出它是基于四个概念来分析咱们的业务概念,下面咱们来了解一下哪四个概念:

1.实体:也能够叫作物品,表示一个参与者,好比:客户、商品。

2.角色:实体、时刻时段的角色,如:订单的配送类型,用户的等级角色。

3.描述:用来对实体、时刻时段的公共属性进行描述,好比:客户实体的地址描述,这部分信息是能够通用的。

4.时刻时段:实体在某个时间段内的参与事件,如:订单,某个客户在某个时间段内购买了某个商品。此概念就是用来跟踪实体发生的全部须要跟踪的事件。

当咱们使用四色原型模式去分析业务概念时就很难丢失领域概念,下面咱们依然以上面的业务领域为例使用四色原型模式进行分析。

图3:

基本上咱们可使用四色原型模式去直接套某个业务领域,咱们能够根据模式的思想来推断领域模型是否须要四色中的一种。这样咱们基本上不会漏掉重要的业务概念。经过将“四色原型”模式与“RUP"制品中的“业务词汇表”、"补充性规格说明“集合能够完成美妙的OOAD敏捷过程。使用四色原型模式来验收RUP过程制品中的业务词汇表,能够判断出本身是否遗漏了重要的业务分支。

能够说四色原型模式是通往OOAD之门的金钥匙,有了它我才相信咱们如今分析的系统是OO的。

模型是让人去阅读理解的,上图中咱们很难看出哪一个是”实体“哪一个是”角色“哪一个是”时刻时段“和”描述“,因此大师们借鉴了其余领域的彩色思想来建立软件模型,这样咱们就够能一眼的看出模型的具体意思,带来强大的视觉冲击力,下节咱们详细的来看看彩色建模。

5.在四色原型上运用彩色建模加强视觉冲击力

为了可以突出模型的视觉效果,在四色原型上运用不一样的颜色来增长模型的视觉冲击力。使用彩色模型可以激发人类天生的视觉敏感性,让人一目了然的知道总体的模型是个什么结构。

图4:

使用绿色来表示实体(参与者),使用黄色表示角色,使用灰色表示描述,使用桃红色表示时刻时段。固然这里的颜色不是很准确,因为我对颜色分的不是很清楚,因此未能调出最合适的颜色,可是差很少也就好了。

这样当咱们面对一个大型的UML类图模型时就能够一眼识别出每一个模型所表明的概念它的职责也就清晰明了了。

6.经过四色原型模式建模出领域无关模型

建模时咱们是不须要考虑该模型将要被什么技术落地,也就是说该模型是领域(技术、工具、平台)无关的,可使用任何技术来实现它。经过四色原型模式构建出来的模型图更具备可塑性,概念很是的清晰,全部的模型都是概念明确的,不存在人为的设计在里面,对于任何一个建模者来讲这是很是宝贵的建模技术。若是没有四色原型模式的背景,每一个建模者都根据本身的经验来假设出不少主观的模型出来,其实这部分模型是很难让别人理解的,由于每一个人的理解角度不一样,得出的模型天然也就差异很大,因此建模时使用四色原型模式是一个比较通用的模式,得出的最后模型也是一个通用的且团队交流也是通用的。

技术无关是领域无关模型的一个面,领域无关也有另一层含义,当咱们有了四色原型模式时你是否发现你具备了征服全部业务领域的秘诀,就比如E-R模型同样,一个能够用无边际的抽象的模式,这个模式由四色基本的原型组成,而这个四个原型也是领域无关模型。

7.结束语:建模时你能够不考虑具体实现,可是建模者要懂技术实现

尽管建模高手会告诉咱们建模时不要去考虑最后具体用什么技术去实现它,其实跟你说这个话的人要么就是精通某个技术的高手,要么就是一个理论主义者,只知道画图而不知道如何具体落地领域模型的分析员,前者其实他已经作到心中有数了,为何这么说,由于不懂技术实现的人来建模时是没法建立出能用的模型的,由于概念毕竟是概念,一旦落地到代码上、架构上一切都变了,并非那么的简单直接落地的,须要考虑到读写、业务流、职责等等问题,这里面是有很强的技术问题在里面的。

好了文章到此结束,但愿本文能对那些对OOAD、UML、建模有兴趣的朋友起到一个抛砖引玉的做用,对本文的内容想进一步学习的能够参考《彩色建模》一书,这本书是OOAD大师[Peter coad]所著,谢谢你们。

 

相关文章
相关标签/搜索