建模,是指通过对客观事物建立一种抽象的方法用以表征事物并过得对事物本身的理解,同时把这种理解概念化,将这些逻辑概念组织起来,构成一种对所观察的对象的内部结构和工作原理的便于理解的表达。
建模包含两个问题,一个是怎么建?另一个是模是什么?
第一个问题“怎么建”,依赖于方法论,再上升一点到哲学高度就是认识论。
同样的事物在不同世界观的人眼里会产生不同的结果。软件针对现实世界的建模过程。也会因为”世界观”不同而不同,简而言之,就是面向对象和面向过程两种不同的软件方法将导致不同的建模结果,显然UML是面向对象的,因此用UML建模必须采用面向对象的观点。
抽象角度的不同决定了建模方向的不同。当你试图为世界建模的时候,首先要决定的是抽象角度,即建立这个模型的目的是什么。一旦抽象角度确定,剩下的事情就变的顺理成章,而不再是杂乱无章。
在实际项目中,当我们试图去分析需求,面对大量需要资料时,是否有时候感觉到无从下手?当我们试图去做一个设计,是否有时候感觉到力不从心?这个时候与其说是分析经验不足或是设计能力不够,不如说是你还没有找到明确的抽象角度。面向对象与面向过程不同的地方是,面向过程希望你通盘考虑,这时问题变的复杂化;而面向对象希望你把事物通过抽象角度分解成小块,问题就变得简单化。
具体来说,做需求的时候,首要目标不是要弄清楚业务是如何一步一步完成的,而是要弄清楚有多少业务的参与者?每个参与者的目标是什么?参与者的目标就是你的抽象角度。与分析一个复杂的业务流程相比,单独分析参与者的一个个母的要简单的多,实际上,这就是用例!
第二个问题是”模是什么“,则依赖于确定了抽象角度下的场景模拟。
一旦决定了抽象角度,就确定了一个目标。现在,要的事情便是找出那些能够满足这一目标的事物。这并不容易。有趣的是,我们找出这些事物的过程并不是面向对象的,而是过程化的。这是因为要达到一个目标必须要有动作附加在静态的事务上,并产生一定的效果。这样一来,我们必须要搞清楚谁发出了什么动作,作用于什么事物,产生了什么结果。显然这种描述方式是过程化的。但是与面向过程方法不同的是,我们描述这个过程化的场景并不是最终目的,而是为了找出场景当中贡献于场景目标的那些事物,以及这些事物如何贡献于这个场景的。也就是说场景模拟帮助我们找出抽象的对象,而场景本身则是这些对象在一定条件下交互的一个特定的结果。当条件变化的时候,场景就会随之改变,我们并不试图控制这个场景。
一个由抽象角度确定了的目标需要由静态的事物加上特定条件下产生的一个特定的场景来完成,即静态的事物+特定的条件+特定的动作=特定的场景。
用例驱动是统一过程的重要概念,或者说整个软件生产过程就是用例驱动的。
抽象层次是面向对象方法中极其重要,但是又非常难以掌握的技巧。学会站在不同的抽象层次考虑问题是建立好模型的基础。
抽象的层次越高,具体信息越少,但是概括能力越强;反之,具体信息越丰富,结果越确定,但相应的概括能力越弱。
抽象两种方法,一种是自顶向下,另一种是自底向上。自顶向下的方法适用于人们从头开始认识一个事物。自底向上的方法适用于在实践中改进和提高认识。
在软件开发过程中,主体上应当采用自顶向下的方法,用少量的概念覆盖系统需求,再逐次降低抽象层次,直到代码编写。同时应当辅以自底向上的方法,通过总结在较低抽象层次的实践经验来改进较高层次的概念以提升软件质量。