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

简介: 阅读目录: 1.背景介绍 2.问自己,UML对你来说有意义吗?它帮助过你对系统进行分析、建模吗? 3.一直以来其实我们被一个缝隙隔开了,使我们对OOAD遥不可及 4.四色原型模式填补这个历史缝隙,让我们真的看见OOAD的希望 5.在四色原型上运用彩色建模增强视觉冲击力 6.通过四色原型模式建模出领域无关模型 7.结束语:建模时你可以不考虑具体实现,但是建模者要懂技术实现 1.背景介绍 至今我都清楚的记得我第一次被面试官问起什么叫”建模“技术时的情景,那是好几年前的事情了,当时是胸有成竹的去面试一个有关系统分析、设计的.NET高级软件工程师岗位。

阅读目录:

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

1.背景介绍

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

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

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

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

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

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

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

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

现在我能明白,其实如果用代码级别的分析思维来辅助你建模就一定会有盲点,因为代码级别的“设计模式”,“设计原则”并非建模时的“分析模式”,这是两个不同的问题域,也就是说彼此用在不同的业务领域的,不能够一概而论,如果交叉使用就会误导你目前的重心,你会往里面添油加醋。

“建模”这个非常抽象且神圣的词是多么的霸气,貌似是已经触及软件工程的最高境界了;崇拜,自卑;搞软件开发也有几年了,居然连建模都不懂;那一夜我彻底失眠了,从那以后我在技术上充满了无助感,为什么?因为我已经清楚自己要想在软件领域有一定的成果,必须学会对真实世界建模,从那开始”建模“一词在我脑子的已经和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]所著,谢谢大家。

 

作者:王清培

出处:http://www.cnblogs.com/wangiqngpei557/

本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面

目录
相关文章
|
2月前
|
存储 Shell Linux
快速上手基于 BaGet 的脚本自动化构建 .net 应用打包
本文介绍了如何使用脚本自动化构建 `.net` 应用的 `nuget` 包并推送到指定服务仓库。首先概述了 `BaGet`——一个开源、轻量级且高性能的 `NuGet` 服务器,支持多种存储后端及配置选项。接着详细描述了 `BaGet` 的安装、配置及使用方法,并提供了 `PowerShell` 和 `Bash` 脚本实例,用于自动化推送 `.nupkg` 文件。最后总结了 `BaGet` 的优势及其在实际部署中的便捷性。
131 10
|
13天前
|
开发框架 监控 .NET
【Azure App Service】部署在App Service上的.NET应用内存消耗不能超过2GB的情况分析
x64 dotnet runtime is not installed on the app service by default. Since we had the app service running in x64, it was proxying the request to a 32 bit dotnet process which was throwing an OutOfMemoryException with requests >100MB. It worked on the IaaS servers because we had the x64 runtime install
|
10天前
Visual Studio 快速分析 .NET Dump 文件
【11月更文挑战第10天】.NET Dump 文件是在 .NET 应用程序崩溃或出现问题时生成的,记录了应用程序的状态,包括内存对象、线程栈和模块信息。通过分析这些文件,开发人员可以定位和解决内存泄漏、死锁等问题。在 Visual Studio 中,可以通过调试工具、内存分析工具和符号加载等功能来详细分析 Dump 文件。此外,还可以使用第三方工具如 WinDbg 进行更深入的分析。
|
26天前
|
JSON 算法 安全
JWT Bearer 认证在 .NET Core 中的应用
【10月更文挑战第30天】JWT(JSON Web Token)是一种开放标准,用于在各方之间安全传输信息。它由头部、载荷和签名三部分组成,用于在用户和服务器之间传递声明。JWT Bearer 认证是一种基于令牌的认证方式,客户端在请求头中包含 JWT 令牌,服务器验证令牌的有效性后授权用户访问资源。在 .NET Core 中,通过安装 `Microsoft.AspNetCore.Authentication.JwtBearer` 包并配置认证服务,可以实现 JWT Bearer 认证。具体步骤包括安装 NuGet 包、配置认证服务、启用认证中间件、生成 JWT 令牌以及在控制器中使用认证信息
|
1月前
|
存储 消息中间件 前端开发
.NET常见的几种项目架构模式,你知道几种?
.NET常见的几种项目架构模式,你知道几种?
|
2月前
|
数据采集 JSON API
.NET 3.5 中 HttpWebRequest 的核心用法及应用
【9月更文挑战第7天】在.NET 3.5环境下,HttpWebRequest 类是处理HTTP请求的一个核心组件,它封装了HTTP协议的细节,使得开发者可以方便地发送HTTP请求并接收响应。本文将详细介绍HttpWebRequest的核心用法及其实战应用。
127 6
|
2月前
|
存储 运维
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
.NET开发必备技巧:使用Visual Studio分析.NET Dump,快速查找程序内存泄漏问题!
|
3月前
|
数据库 C# 开发者
WPF开发者必读:揭秘ADO.NET与Entity Framework数据库交互秘籍,轻松实现企业级应用!
【8月更文挑战第31天】在现代软件开发中,WPF 与数据库的交互对于构建企业级应用至关重要。本文介绍了如何利用 ADO.NET 和 Entity Framework 在 WPF 应用中访问和操作数据库。ADO.NET 是 .NET Framework 中用于访问各类数据库(如 SQL Server、MySQL 等)的类库;Entity Framework 则是一种 ORM 框架,支持面向对象的数据操作。文章通过示例展示了如何在 WPF 应用中集成这两种技术,提高开发效率。
59 0
|
3月前
|
开发者 API Windows
从怀旧到革新:看WinForms如何在保持向后兼容性的前提下,借助.NET新平台的力量实现自我进化与应用现代化,让经典桌面应用焕发第二春——我们的WinForms应用转型之路深度剖析
【8月更文挑战第31天】在Windows桌面应用开发中,Windows Forms(WinForms)依然是许多开发者的首选。尽管.NET Framework已演进至.NET 5 及更高版本,WinForms 仍作为核心组件保留,支持现有代码库的同时引入新特性。开发者可将项目迁移至.NET Core,享受性能提升和跨平台能力。迁移时需注意API变更,确保应用平稳过渡。通过自定义样式或第三方控件库,还可增强视觉效果。结合.NET新功能,WinForms 应用不仅能延续既有投资,还能焕发新生。 示例代码展示了如何在.NET Core中创建包含按钮和标签的基本窗口,实现简单的用户交互。
69 0
|
3月前
|
Java Spring 自然语言处理
Spring 框架里竟藏着神秘魔法?国际化与本地化的奇妙之旅等你来揭开谜底!
【8月更文挑战第31天】在软件开发中,国际化(I18N)与本地化(L10N)对于满足不同地区用户需求至关重要。Spring框架提供了强大支持,利用资源文件和`MessageSource`实现多语言文本管理。通过配置日期格式和货币符号,进一步完善本地化功能。合理应用这些特性,可显著提升应用的多地区适应性和用户体验。
41 0