建模(Modeling),是指通过客观事物建立一种抽象的方法用以表征事物并获得对事物本身的理解,同时把这种理解概念化,将这些逻辑概念组织起来,构成一种对所观察的对象的内部结构和工作原理的便于理解的表达。
上面建模的定义本身就和建模工作一样非常抽象和难以理解。为了理解,我们简单地说:建模包含两个问题:
- 怎么建?
- 模是什么?
第一个问题“怎么建”,依然于方*论法**,再上升一点到哲学高度就是认识论。
我们怎么认识和描述这个世界。唯物?形而上学?唯心?同样的事物在不同世界观的人眼里会产生不同的结果。软件针对现实世界的建模过程,也会因为“世界观”不同而不同。简而言之,就是面向对象和面向过程两种不同的软件方法将导致不同的建模结果。显然UML是面向对象的,因此用UML建模必须采用面向对象的观点,否则本来准备画一只虎,结果可能是一只猫。
现在做一个快速的小测试,请在30秒内说出尽可能多的筷子、勺子和盘子的相同点和不同点。
这个问题没有标准答案。这个看似简单的问题其实反映了你是否习惯以抽象的方法去看待事物。在不知不觉中,每一组相同点和不同点都来自于你的一个抽象角度。例如,当从用途的角度去抽象时,它们的相同点可能是三者都是餐具,而不同点是筷子是用于夹的,勺子是用于舀的,盘子是用于盛的;从使用方法的角度去抽象,它们的相同点都是需要用手拿的,不同的是手的动作不同;甚至可以从字面上理解,它们的相同点是都带了一个“子”字......同样这三个东西,从不同的抽象角度可以得出不同的结果。
实际上,抽象角度的不同决定了建模方向的不同。在抽象角度确定之后,你会在不知不觉中为这三个事物建立起模型,并据此来得出相同点和不同点。例如当从用途的抽象角度去考虑的话,你在脑子里为这三个事物建立起了一个人用餐的业务逻辑模型,并且这三者在这个业务逻辑模型中表现出了各自的职责和特别的属性。
回到软件建模上来,经过小测验后你应该明白,当你试图为现实世界建模的时候,首先要决定的是抽象角度,即建立这个模型的目的是什么。一旦抽象角度确定,剩下的事情就变得顺理成章,而不再是杂乱无章。
如果对这个说话感到疑惑,请回想一下在实际项目中,当我们试图去分析需求、面对大量需求资料时,是否有时候感觉无从下手?当我们试图去做一个设计,是否有时候感觉到力不从心?这个时候与其说是分析经验不足或是设计能力不够,不如说是你还没有找到明确的抽象角度。面向对象和面向过程不同的地方是,面向过程希望你通盘考虑,这时问题变得复杂化;而面向对象希望你把事物通过抽象角度分解成小块,问题就变得简单化。正如同上面的小测试,在没有明确抽象角度之前,大部分人都会很慌张,不明白为什么要问这样一个问题,不知道从哪里回答,也不知道回答得是否准确。如果加一个条件,变成请在30秒内说出使用上筷子、勺子和盘子有什么相同点和不同点,这个问题便变得的很容易回答了。
再举一个更容易理解的例子。让我们想象一下城市里遍布的摄像机,虽然它们拍摄的都是同一座城市,但不同的机位看到的情景是不同的,每个机位都反映出了城市的一个方面。如果我们要认识这个城市,就需要先明确我们想了解城市的什么,然后选择最有代表性的机位,从各个机位采集来信息,并分析这些信息的相关性,做出逻辑解释。
城市就是我们面临的问题领域,而机位就是抽象角度。实际的需要引导我们去寻找适合的机位,从而找到适合的抽象角度。再接下来,分析工作就能顺利开展了。
道理很简单,但很实用。不论在需求分析、系统分析还是系统设计上,一定要学会采用面向对象的方法,在面对问题领域的时候首先不要决定去通盘考虑,而是找出问题领域里包含的抽象角度。如果你把抽象角度都找全了,并且这些角度都分析清楚了,问题领域也就解决了。虽然这些抽象角度在思考的时候可能是互不关联的。
具体来说,做需求的时候,首要目标不是要弄清楚业务是如何一步一步完成的,而是要弄清楚有多少业务的参与者?每个参与者的目标是什么?参与者的目标就是你的抽象角度。与分析一个复杂的业务流程相比,单独分析参与者的一个个目的要简单的多。实际上,这就是用例!这也就是为什么用例会成为业务建模的方法的原因之一。
第二个问题“模是什么”,则依赖于确定抽象角度下的场景模拟。
一旦决定了抽象角度,就确定了一个目标。现在,要做的事情便是找出那些能够满足这一目标的事物。这并不容易。有趣的是,我们找出这些事物的过程其实并不是面向对象的,而是过程化的。这是因为要达到一个目标必须要有动作附加在静态的事物上,并产生一定的效果。这样以来,我们必要要搞清楚谁发出了什么动作,作用于什么事物,产生了怎样的后果。显然这种描述方式是过程化的。但是与面向过程方法不同的是,我们描述这个过程化的场景并不是最终目的,而是为了找出场景中贡献于场景目标的那些事物,以及这些事物是如何贡献于这个场景的。也就是说场景模拟帮助我们找出抽象的对象,而场景本身则是这些对象在一定条件下交互的一个特定的结果。当条件变化的时候,场景就会随之改变,我们并不试图控制这个场景。
现在回到什么是模的问题上来,一个由抽象角度确定了的目标需要由静态的事物加上特定条件下产生的一个特定的场景来完成,即
静态的事物(物)+ 特定的条件(规则)+ 特定的动作(参与者的驱动)= 特定的场景(事件)
所以摸就是“人”、“事”、“物”、“规则”。尽管在这里它们穿上了马甲,我们还是能够一眼认出它们的真面目来。
业务建模到底是什么,如果你还没有理清楚,下图的这些公式应该会帮助你理清思路。
