面向对象分析与设计
对于一个做开发做了十多年的老鸟来说,回过头来再来看这本书,思想上经历了三个起伏;首先重看这本书的由头是我指点一个小弟做技术要抓理论,后来灰狗头来想自己其实也没有把理论很好梳理,于是想到了这本书,之前看的是英文版,看的云里雾里,这次借了本中文版;然后在看的过程中,我突然发现其实里面讲述的我都知道,于是走马观花的翻完,讲真,没有多少太多新的,有冲击力的东西,但是看到部分点的时候,还是有一种惊醒的感觉;看完之后,我突然想到其实真正的工作中,我到底有多少是想到了理论到实践面向对象?我做技术是否有理论作指导,还是纯粹的“经验主义者”?我突然感到有些道理,于是发现其实系统的梳理一下OOA,OOD,在在实践中有理论依据做知道也是一件惬意的事情。
面向对象的概念
面向对象的意义是什么?分析复杂系统。其实你可以理解一下分析这次,其实分析就是讲一个整体,进行分解有意义的单元(小块儿),然后进行理解和研究(析),这一分一析就是面向对象的意义。其实很多人讲什么面向对象以及,重回XX(比如函数编程)这样的文体我就会笑,因为这样讲的人连层次就搞错了,就像说辽宁在大连哪里一样。函数编程是编码级别,OO则是设计层面,你应该看到过用C来实现面向对象,语言,编程的范式都是编码级别,但是面向对象的设计则是更高一个级别。
面向对象在更高层次有两种形式:分离和层次,分离就是保持独立,可以理解为松耦合,在实践上可以是面向接口编程;层次就是关系,比如继承,依赖,关联,外在(宏观)是层次做组织,内在则是分离做关系;这样设计出来的东西及时逻辑性比较强,同时用便于设计和维护。
面向对象首先要理清楚,就是对象和类的关系,类是抽象,一种泛化,对象则是这种抽象的实现,比如手机这个概念就是一个抽象,华为手机就是一个具体;但是其实抽象是具有某种想对象,比如华为手机相对于荣耀可能即使一种抽象。上面讲的层次,就是每个层次都有针对上个层次的实现,同时可能会针对下层抽象(叶子层次就没法抽象了)。他们共通包含三部分:状态,行为以及标识。标志是说明我是谁,状态我现在属性是什么,行为则是我能做什么。描述一个类的能力,注意能力这个层在类级别代表类的能力,用在整体的架构上则代表设计元素的能力,比如一个模块,一个层次具备的能力。
面向对象分析
面向对象分析其实是一个过程,首先是识别对象,识别对象通常有两种方式分别是基于名词,另外一种基于概念,比如“一首流行歌曲”,概念通常可以是作为抽象类的实现类,因为概念多是某个名词的一种扩展。
分析完了对象的同时还要捕获对象的行为;在梳理行为的同时要分析这个行为发生者,发生时间以及发生的地点环境,这就是用例;
对象分析出来之后,有了一定的积累就可以尝试从对象中抽象出类,类是一个抽象概念,是某些具有共同行为的对象的抽象;
抽象出类之后,在根据对象间关系,抽象出类的模式,或者说机制,大家非常熟悉的24种设计模式就属于这个。
当你通过分析类的过程中,你会逐渐的清楚业务的情况,于是会逐渐建立起来一个领域概念,就是高层次的“分类”,对于领域进行分析,然后再考虑领域间的交互模式以及领域公开的接口。所以设计其实从底向上的设计思路;但是并不是一成不变,关键还是看业务情况你可以从哪里入手;如果从业务来看一眼就可以看出来领域划分,那么首先就是领域划分出来;如果是一眼可以抽象出来类,那么可以在对象和类同步进行分析。
总之,你要不断有一个意识,就是对象,行为,类,机制(模式),领域,领域关系这些点要一轮一轮的分析并不断的进行丰满。
实战
真正面向对象的分析流程一言以蔽之,自顶向下分析。
1. 划定范围,这个阶段通过用例图来识别出来,用户,目标系统(在4C分析法里面叫Cotext),以及系统依赖;注意这个三个要素要是别出来;目标系统内部先不需要考虑,都是黑盒;
2. 分析系统,在目标系统里面,进行整体划分,可以划分为那些系统(System);
3. 分析子系统,再来分析子系统的使命;不过使命和系统的关系有些,鸡和蛋的恭喜,因为在分析系统步骤,其实划分的依据就是使命;但是在分析子系统环节还是需要进行分析,不过这个时候使命可以更加详细和完善一些;以上步骤都是在用例图中完成;
4. 再针对使命级别进行黑盒分析,通过活动图(或者viso里面的泳道图)来进行黑盒级别的(某个)使命流程分析,这里只有两个泳道,一个operator,一个是System;输出的是针对某个使命的系统用例;到此才是到了一个粗用例的级别;
5. 再针对使命进行白盒分析,在白盒分析中,需要进一步将使命拆分为片段(Segment),继续通过永道图来表达Segment之间交互来表达一个流程相对完整的交互流程;输出的是由一个片段动作组成的哟泳道图(活动图)
说明:开始的时候我有些疑问,为什么不适用序列图呢?感觉两者形式上很接近;首先序列图是OO设计阶段工具,比如序列图强调的是对象间交互的流程以及“消息”,是细节设计;永道图(互动图)则是主要分析流程;所以两者级别不一样。
6. 对于片段动作进行整合,分组,形成片段用例;
7. 对片段(Segment)进行分析,形成子系统的白盒活动图;
8. 对Segment进行逻辑架构,可以通过组件图来进行表达,目的就是将Segment里面的子系统(Subsystem)之间交互情况表达清楚。
这个例子来自于书中第8章,应该说这个是一个比较标准的OOA->OOD的过程,因为举例比较复杂,所以,对系统的分析分了很多层次,System -> Mission -> Segment -> Subsysem;我理解Mission和Segment是中间环节,关键是希望能够从System,通过Mission和Segment两个环节,可以识别并分析出来SubSystem。