1. 找出最关键的一些业务场景;一般通过动词来寻找,比如招聘系统中,一个应聘人投递一个职位就是一次应聘,应聘就是一个业务场景;一个学生参加某门课的考试,那么考试就是一个业务场景;一个学生去图书馆借书,那么借书就是一个业务场景;
  2. 针对每个业务场景分析出有哪些场景参与者,哪些参与者以对象的形式参与,哪些参与者以服务的形式参与;为什么要区分对象还是服务是因为有时候我们不关心参与者是哪个,而只关心参与者是什么。一般服务在系统中我们只关心它是什么服务,并且在系统中服务一般也只有一个实例;而对象则不同,我们会关心对象是谁,即哪一个;
  3. 分析每个场景参与者对象的基本状态特征;所谓的基本状态特征是指对象与生俱来的,对象从一开始被创建出来之后就具有的状态特征;最形象的例子就是人的身高体重,当人一出生便具有了身高和体重这两个状态特征;再比如一篇博文,它从被写好之时起就具有了内容这个状态特征,但是我们可以随便修改博文的内容;但是有些状态特征是不能修改的,比如博文的创建时间一旦博文被创建之后便不能再被修改;需要注意的是我们不要把和对象关联的一些关联信息也认为是对象的基本状态特征。比如某人有一本英语六级考试证书,那么人和证书之间的关系是拥有的关系,证书不是人固有的与生俱来的基本状态特征,而是人参与了某次考试这个场景后得来的;后面我会提到这种关联关系该如何去思考和理解!
  4. 分析每个场景参与者对象分别扮演什么角色参与场景,整个场景的完整交互过程是怎样的,对象在参与场景的过程中执行了哪些交互行为; 相信大家都明白这点非常重要,因为它涉及到对象之间如何交互,涉及到该如何分析哪个对象该具有哪个交互职责;从而最终决定了在代码级别哪个类该具有哪些方法的问题。关于这方面思考的例子我会在下面进行介绍,这里先说一下理论吧。我觉得要点是将整个业务场景中的每个交互行为通过四色原型的分析方法来理解。用一句话来概括四色原型就是:一个什么什么样的人或组织或物品以某种角色在某个时刻或某段时间内参与某个活动。另外一个技巧就是,我们经常可以问自己,这个交互行为是“谁通知谁做什么事情?“,行为的驱动者是谁?行为的执行者是谁?一般行为的驱动者就是通知方,行为的执行者就是被通知方,被通知方拥有”通知方要求做的事情“执行行为;另外,我觉得还需要说明的是,现实生活中的对象并不是说其扮演了某个角色后才具有角色所定义的行为的,而是本来就有的,只不过是在扮演角色后表现出了该行为;所以对于现实生活中的对象,执行角色所定义的行为和扮演角色是同时发生的,没有谁先谁后的说法;但是软件中的对象则不同,因为软件中的对象只是现实生活中的对象的某一个我们所关心的方面,所以它的能力也有限。另外从设计实现的角度职责单一的角度来说,我们也不会将软件中的对象设计的很复杂,包含很多职责,因为这样会导致对象难以维护,这样做虽不违背分析原则,但违背设计原则。软件中的对象我们往往是设计成当它扮演某个角色时,动态给对象注入角色所定义的交互行为,从而给对象赋予了参与场景交互的能力。因此简单的说,软件中的对象,平时只具有基本的状态特征和基本的非交互行为,而当它扮演某个角色时,则动态具有交互行为;
  5. 分析交互过程结束后分别会对每个场景参与者对象产生哪些基本状态特征的改变;这个很好理解,当一个对象参与了某个交互活动后,一些基本状态特征会发生改变,比如一个人参加一次100米跑步比赛后,心跳速度会加快;心跳速度就是人的基本体征;这个应该很好理解吧,不多举例了。
  6. 分析如何记录和跟踪这一次交互行为,分析这次交互行为会产生哪些额外的信息;这点估计大家平时很少思考,而这点我想也正是我的面向对象分析思路最具特色的地方吧!大家一定知道,一次对象的交互活动会产生一些与该交互活动相关的交互信息。比如一次应聘活动会产生一些与该活动相关的信息,如是否录取,笔试成绩,面试成绩等;比如一次考试会产生考试成绩这个信息;一次借书会产生一个借阅信息(包含:借书人、被借的书、借书时间,我们可能还会设计一个还书时间);并且,在很多情况下,这些交互信息会在后续的其他交互场景中再被更新。比如,一次应聘一开始状态可能是”新投递“,表示应聘人刚刚投了简历并选了某个职位,后来她去参加笔试或面试了,那么这次应聘的状态就变为了”已笔试“或”已面试“;在比如一个学生参加一次考试,刚开始还没有成绩,但后来老师批卷子后便有了考试成绩。再比如一次借书后,如果这本书还没被还,则还书时间为空,而一旦还书了之后,便有了还书时间;因此,我们从这些规律中可以发现,交互其实是一个过程,并且该过程一旦开始后就会产生一些相关的信息,如应聘的状态,考试的成绩,借阅信息的归还时间,等等。通常我们会把交互过程本身所涉及的一切信息以及交互过程所产生的所有附加信息作为一个整体来进行考虑。所以,我觉得我们有必要设计一个对象,用来表示某一次交互的结果,这个结果包含交互过程本身所涉及的一切信息以及交互过程所产生的所有附加信息;大家想想,看到”应聘“这个单词,你有时候会认为它是一个动词,优势后会认为它是一个名词。在认为是动词时,我们关注的是交互本身,活动本身,强调行为;而在认为是名词时,我们关注的是应聘行为所产生的一切信息;所以,看到这里,我想大家应该心里有个数了,就是在交互行为结束后,我们往往需要设计一个对象用来表示一次交互活动的相关信息;这些信息一方面体现了交互活动的参与者,(交互时间,交互地点,如果我们关心这些的话),另一方面体现了交互活动所产生的附加的信息,如成绩,应聘状态,借书还书时间,等等。最后,需要强调的是这些信息之所以设计为对象是因为这些信息不是历史,即不是不可改变的,相反,这些信息会在后续的其他交互活动中被更新;所以,看到这里,我想我们就不用在纠结对象在参加交互活动后所产生的一些与它关联的信息该如何存放这个问题了。
  7. 原文:http://www.cnblogs.com/netfocus/archive/2011/09/18/2180656.html

面向对象分析方法(I)的更多相关文章

  1. 面向对象分析方法(II)

    什么是真正的对象? 什么是面向对象分析阶段时的对象? 什么是面向对象设计阶段时的对象? 什么是面向对象实现阶段时的对象? 真正的对象 我所理解的真正的对象就是现实生活中客观存在或不存在的真正的对象.这 ...

  2. Difference **面向过程(或者叫结构化)分析方法**面向对象分析方法

    面向过程和面向对象的区别 面向过程是分析出解决问题所需要的步骤,然后一步步实现,面向对象是把构成问事件分解成各个对象,建立对象的目的是为了描述某个事物在整个解决问题的步骤中的行为. 可以说面向对象是从 ...

  3. CMM模型,结构化开发方法和面向对象开发方法的比较,UML(统一建模语言),jackson开发方法

    CMM模型 一.CMM简介 CMM,英文全称为Capability Maturity Model for Software,即:软件成熟度模型. CMM的核心是把软件开发视为一个过程.它是对于软件在定 ...

  4. 面向对象分析设计-------02UML+UML各种图形及作用

    一.UML是什么?UML有什么用? 二.UML的历史 三.UML的上层结构(Superstructure) 四.UML建模工具 五.UML的图(重点) 1.用例图(use case diagram) ...

  5. <五>面向对象分析之UML核心元素之边界

    一:基本概念

  6. <四>面向对象分析之UML核心元素之用例

    一:基本概念        --->用例定义了一组用例实例,其中每个实例都是系统所执行一系列操作,这些操作生成特定主角可以观测的值.        --->所谓用例,就是一件事情,要完成这 ...

  7. <二>面向对象分析之几个关键的概念

    一:建模        --->建模,是指通过对[客观事物]建立一种抽象的方法用以表征事物并获得对事物本身的理解.同时把这种理解概念化,将这些逻辑概念组织起来,构成一种对所观察对象的内部结构和工 ...

  8. <一>面向对象分析之面向对象和面向过程

    面向对象        ---->注重的是拆分,组装.        ---->封装,继承,多态,复用(只是现象)        ---->面向对象变成的目标从来就不是复用.相反,对 ...

  9. js面向对象+一般方法的选项卡

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

随机推荐

  1. Ural 1018 (树形DP+背包+优化)

    题目链接: http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=17662 题目大意:树枝上间连接着一坨坨苹果(不要在意'坨'),给 ...

  2. NOIP200002税收与补贴

    试题描述 每样商品的价格越低,其销量就会相应增大.现已知某种商品的成本及其在若干价位上的销量(产品不会低于成本销售),并假设相邻价位间销量的变化是线性的且在价格高于给定的最高价位后,销量以某固定数值递 ...

  3. 带你学C,带你飞——入门

  4. httpclient爬取性感美图

    依赖httpclient4.2,Jsop SemeiziCrawler.java package kidbei.learn.crawler; import java.io.File; import j ...

  5. Linux 高级网络编程

    设置套接字函数: #include<sys/socket.h> int setsockopt(int sockfd, int level, int optname, const void* ...

  6. ArcEngine 获取像元值

    栅格数据获取像元值, 使用ISurface.GetElevation(IPoint pnt),功能是实现了,获取的 不是像元值,是插值结果.而由于栅格数据是离散的值,每个栅格值代表了特殊的含义,插值之 ...

  7. mysql安装后的配置

    mysql的安装其实就是一步一步按提示就可以: 1.开始安装 2.选择mysql安装位置 3.选择数据库存放位置,最好和mysql安装在一起,好查找 4.选择详细设置 5.选开发者机器 6.选多功能型 ...

  8. php任何优化的方式下这样第个列表都是再次查询

    我们的代码经理是这样的:计算总行数:select count(*) from tablename where -..查询列表select * from tablename where - limit- ...

  9. Scrum会议2

    小组名称:天天向上 项目名称:连连看 参会成员:王森(Master)张金生 张政 栾骄阳 时间:2016.10.17 已完成内容: 1.连连游戏的图片素材选取. 2.连连看具体的功能种类. 计划完成: ...

  10. eclipse安装swing插件

    最近想用java做个小应用,是那种可视化图形类的应用.因为一直比较懒,所以打算用swt拖拖拽拽.于是在就去找swt,这是以前的办法.结果发现原来最新版的eclipse自己带有一个windowbuild ...