1.5 建立面向对象思维
本节将通过简单、通俗的案例来阐释对象建模的基本概念,使读者初步认识UML模型,并在开阔视野的基础上,轻松建立面向对象的思维,同时使读者掌握用面向对象方法分析问题的要领,为学习对象建模方法“热身”。
在学习案例前,我们先区分几个概念:对象技术、建模和UML。作为一种软件开发思想,对象技术是理论基础。引入对象技术的目的是能够有效地分析和设计软件系统,这个过程就是建模(关于建模的概念,将在第2章中做详细介绍)。为了表达建模结果,开发人员需要一种语言作为工具,这个工具就是统一建模语言(Unified Modeling Language, UML)。总的来说,建模是最终目的,对象技术是一种建模理论,而UML是一种体现面向对象思维的建模语言,它是将对象理论转换为实践的工具。
为了更好地理解面向对象思维方式,先来看一段个人简介:tanHuobin是类OOTeacher的一个实例,这个类是基于beiHangUniversity的softwareSchool的工作;类GraduateStudent的所有实例都可以通过Course类的对象OOTechnology建立关联,并可发送phone消息或email消息。
在该个人简介中,我们看到了类、实例、关联、消息等面向对象的词汇,这是建立面向对象思维的基础。当然,在实际应用中,这些概念并不是一次就能够定义清楚的,它需要经历一个分析和设计的过程。在本节的最后,我们将利用面向对象思维方式描述一件在日常生活中发生的事情,并借此引入后面将要学习的各种UML模型。
1.5.1 引入案例
我的一位朋友结婚了
这是人们日常生活中一件很普通的事情,但这只是事情的结果,结果背后还隐藏着很多活动和过程。这就需要经过有效地分析和设计过程来描述,下面我们将从不同的角度进行探讨。
A.这里面有什么事物?
要分析问题,首先要找到问题中所包含的事物。在本案例中,可能存在月老、小伙、姑娘、恋人、玫瑰花等各种人/物或事件。
B.每个事物看上去是什么样的?
找到这些事物后,本步就要分析每个事物的特征,以认识和理解事物本质。在本案例中,每个事物可能的特征为:月老——看上去有些年纪了、挺热心;小伙——看上去很强壮、很诚实;姑娘——看上去很漂亮,还很温柔;恋人——看上去很黏糊,最终结婚了;玫瑰花——火红火红的。
C.每个事物能做什么?
认识这些事物后,本步要分析这些事物的能力,以完成特定的事情。在本案例中,每个事物的能力有:月老——牵线搭桥,介绍两人认识;小伙——献花追求,表达爱意;姑娘——仰慕倾情,以身相许;恋人——交往,结婚;玫瑰花——令姑娘心动,传情示爱。
D.这些事物都在什么地方?
分析完这些事物本身的特征和能力后,本步就要安排这些事物出场,为此还要定义每个事物所处的位置。在本案例中,月老可能在婚介所或交友网站;小伙可能在软件园工作;姑娘可能在医院工作;而恋人则可能出现在电影院;玫瑰花可以在花店,也可以在小伙或姑娘的手中。
E.这些事物之间有什么关系?
安排好所有事物后,为了能够有效地完成事情,还需要分析他们彼此之间的关系,以便彼此合作。在本案例中,可能的关系如表1-1所示。
表1-1 各元素之间的关系
F.这些事物是怎么完成整件事情的?
最后就是我们的重头戏——要利用前面的那些事物及事物之间的关系,完成整件事情。完成本案例的过程如下所示。
(1)月老牵线搭桥,介绍小伙和姑娘认识。
(2)姑娘和小伙一见钟情,成为一对恋人。
(3)一对恋人开始交往。
(4)小伙用献花表达对姑娘的爱意。
(5)姑娘收到999朵红玫瑰,心情无比激动。
(6)小伙真心求婚,姑娘以身相许。
(7)一对恋人终于走入婚姻殿堂。
1.5.2 用面向对象思维分析案例
第1.5.1小节中用通俗的语言展示了分析问题的6个方面(A~F)。而在面向对象的方法中,分析问题的思路还是一样的,只是引入了相应的术语来表达分析维度。
A.这里面有什么事物?(类和对象)
本案例中的类为:小伙、姑娘、月老、恋人、玫瑰花。
B.每个事物看上去是什么样的?(类的属性)
每个类都有自己的属性,每个对象都有一个相应的属性值。小伙属性:体格,属性值:强壮;姑娘属性:性情,属性值:温柔;月老属性:年纪,属性值:较大;恋人属性:关系,属性值:初恋。玫瑰花:颜色;属性值:红色。
C.每个事物能做什么?(类的操作)
每个类都具备操作功能,而其对象利用这些操作完成相应的行为。小伙:追求、送花、娶亲;姑娘:爱慕、相许、出嫁;月老:牵线搭桥;玫瑰花:示爱。
D.这些事物都在什么地方?(类的状态、部署)
每个类的对象都会有它合理的或者必需的空间位置和逻辑位置。尤其当这些位置对对象的行为造成重要影响的时候,表明它们的位置极其重要。在本案例中,列出的位置对故事主要情节没有太大的影响,系统可以不予考虑。
E.这些事物之间有什么关系?(类之间的关联)
类之间的关系非常多,根据面向对象的观点,一般将类之间的关系主要分为三类:协作关系(关联),甲会对乙做什么(如月老和小伙、姑娘的关系,小伙和玫瑰的关系,小伙和姑娘的关系);整体—部分关系(聚合和组合),甲是乙的一个组成部分(如恋人和小伙的关系,恋人和姑娘的关系);抽象—具体关系(泛化),甲是乙的一个特例(如人和小伙的关系,人和月老的关系,人和姑娘的关系)。
F.这些事物是怎么完成整件事情的?(类之间的交互)
每个类都会尽量利用伙伴的能力;类之间分工协作,互通信息,共同完成整体的目标,这是面向对象的分析和设计的核心。第1.5.3小节我们将通过特定的工具(UML)表达整个完成事件的过程。
1.5.3 利用UML表达分析结果
前面两小节是通过文字的形式呈现了分析问题的过程。而在面向对象的方法中,还有更好的方式呈现这个过程,这就是建模——采用UML进行建模。
◆ 为了描述整个系统中的静态关系,采用UML类图。图1-12中的类图则代表了完整故事情节的静态模型。
图1-12 反映结婚过程的静态类图
◆ 为了理解整个事情的业务流程,可以采用UML活动图。图1-13中的活动图描述了整个事情的发生经过。
图1-13 反映结婚过程的活动图
◆ 为了对每个活动的细节进行详细分析,可以采用UML顺序图。图1-14中的顺序图描述了初次见面的情节。
图1-14 初次见面的顺序图
◆ 为了能够理解在活动系统中各个参与对象之间的关系,可以采用UML通信图。图1-15中的通信图还是描述了初次见面的情节,不过它更关注参与对象之间的协作。
图1-15 初次见面的通信图
◆ 为了了解某个对象内在的变化过程,可以采用UML状态图。图1-16的状态图展示了恋人关系的发展历程。
图1-16 恋人关系发展的状态机图