下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、分享我的面向对象分析方法作者:博客园-首页原创精华区点击:5更新时间:2011-9-18 21:10先说最重要东西,即我的核心面向对象分析思路:1)找出最关键的一些业务场景;一般通过动词来寻找, 比如招聘系统中, 一个应聘人投递一个职位就是一次应聘, 应聘就是 一个业务场景;一个学生参加某门课的考试,那么考试就是一个业务场景; 一个学生去图书 馆借书,那么借书就是一个业务场景;2 )针对每个业务场景分析出有哪些场景参与者,哪些参与者以对象的形式参与,哪些参与 者以服务的形式参与; 为什么要区分对象还是服务是因为有时候我们不关心参与者是哪个,而只关心参与者是什 么。一般服务在系统中我们只关心它是
2、什么服务,并且在系统中服务一般也只有一个实例; 而对象则不同,我们会关心对象是谁,即哪一个;3 )分析每个场景参与者对象的基本状态特征;所谓的基本状态特征是指对象与生俱来的,对象从一开始被创建出来之后就具有的状态特 征;最形象的例子就是人的身高体重,当人一出生便具有了身高和体重这两个状态特征;在比如一边博文,它从被写好之时起就具有了内容这个状态特征,但是我们可以随便修改博文的内容;但是有些状态特征是不能修改的,比如博文的创建时间一旦博文被创建之后便不能再被修改;需要注意的是我们不要把和对象关联的一些关联信息也认为是对象的基本状态特 征。比如某人有一本英语六级考试证书,那么人和证书之间的关系是拥
3、有的关系,证书不是人固有的与生俱来的基本状态特征,而是人参与了某次考试这个场景后得来的;后面我会提到这种关联关系该如何去思考和理解!4)分析每个场景参与者对象分别扮演什么角色参与场景,整个场景的完整交互过程是怎样 的,对象在参与场景的过程中执行了哪些交互行为;相信大家都明白这点非常重要,因为它涉及到对象之间如何交互,涉及到该如何分析哪个对象该具有哪个交互职责;从而最终决定了在代码级别哪个类该具有哪些方法的问题。关于这方面思考的例子我会在下面进行介绍,这里先说一下理论吧。我觉得要点是将整个业务场景中的每个交互行为通过四色原型的分析方法来理解。用一句话来概括四色原型就是:一个什么什么样的人或组织或
4、物品以某种角色在某个时刻或某段时间内参与某个活动。另外一而是本来就有的, 只不过 执行角色所定义的行为和扮 因为软件中的对象 另外从设计实现 包含很多职责, 因 软件中的对象我个技巧就是,我们经常可以问自己,这个交互行为是 “谁通知谁做什么事情? “,行为的驱动 者是谁?行为的执行者是谁?一般行为的驱动者就是通知方,行为的执行者就是被通知方, 被通知方拥有 ”通知方要求做的事情 “执行行为;另外,我觉得还需要说明的是,现实生活中 的对象并不是说其扮演了某个角色后才具有角色所定义的行为的, 是在扮演角色后表现出了该行为; 所以对于现实生活中的对象, 演角色是同时发生的, 没有谁先谁后的说法; 但
5、是软件中的对象则不同, 只是现实生活中的对象的某一个我们所关心的方面, 所以它的能力也有限。 的角度职责单一的角度来说, 我们也不会将软件中的对象设计的很复杂, 为这样会导致对象难以维护, 这样做虽不违背分析原则, 但违背设计原则。 们往往是设计成当它扮演某个角色时, 动态给对象注入角色所定义的交互行为, 从而给对象 赋予了参与场景交互的能力。 因此简单的说, 软件中的对象, 平时只具有基本的状态特征和 基本的非交互行为,而当它扮演某个角色时,则动态具有交互行为;5 )分析交互过程结束后分别会对每个场景参与者对象产生哪些基本状态特征的改变; 这个很好理解, 当一个对象参与了某个交互活动后, 一
6、些基本状态特征会发生改变, 比如一 个人参加一次 100 米跑步比赛后,心跳速度会加快;心跳速度就是人的基本体征;这个应 该很好理解吧,不多举例了。6 )分析如何记录和跟踪这一次交互行为,分析这次交互行为会产生哪些额外的信息;而一旦还这点估计大家平时很少思考,而这点我想也正是我的面向对象分析思路最具特色的地方吧! 大家一定知道, 一次对象的交互活动会产生一些与该交互活动相关的交互信息。 比如一次应 聘活动会产生一些与该活动相关的信息, 如是否录取,笔试成绩, 面试成绩等;比如一次考 试会产生考试成绩这个信息;一次借书会产生一个借阅信息(包含:借书人、被借的书、借 书时间,我们可能还会设计一个还
7、书时间);并且,在很多情况下,这些交互信息会在后续 的其他交互场景中再被更新。比如,一次应聘一开始状态可能是 ”新投递 “,表示应聘人刚刚 投了简历并选了某个职位,后来她去参加笔试或面试了,那么这次应聘的状态就变为了 ”已 笔试“或”已面试 “;在比如一个学生参加一次考试,刚开始还没有成绩,但后来老师批卷子 后便有了考试成绩。 再比如一次借书后, 如果这本书还没被还,则还书时间为空, 书了之后,便有了还书时间;因此,我们从这些规律中可以发现,交互其实是一个过程,并且该过程一旦开始后就会产生一些相关的信息, 如应聘的状态, 考试的成绩, 借阅信息的归 还时间, 等等。通常我们会把交互过程本身所涉
8、及的一切信息以及交互过程所产生的所有附 加信息作为一个整体来进行考虑。 所以, 我觉得我们有必要设计一个对象, 用来表示某一次 交互的结果, 这个结果包含交互过程本身所涉及的一切信息以及交互过程所产生的所有附加 信息;大家想想,看到 ”应聘 “这个单词,你有时候会认为它是一个动词,优势后会认为它是 一个名词。在认为是动词时,我们关注的是交互本身,活动本身,强调行为;而在认为是名 词时,我们关注的是应聘行为所产生的一切信息; 所以, 看到这里,我想大家应该心里有个 数了,就是在交互行为结束后, 我们往往需要设计一个对象用来表示一次交互活动的相关信 息;这些信息一方面体现了交互活动的参与者, (交
9、互时间,交互地点,如果我们关心这些 的话) ,另一方面体现了交互活动所产生的附加的信息,如成绩, 应聘状态, 借书还书时间,等等。最后,需要强调的是这些信息之所以设计为对象是因为这些信息不是历史,即不是不可改变的,相反,这些信息会在后续的其他交互活动中被更新;所以,看到这里,我想我们 就不用在纠结对象在参加交互活动后所产生的一些与它关联的信息该如何存放这个问题了。好了,上面就是我所掌握的面向对象分析思路。下面以图书借阅系统(点击这里下载源代码)为例,按照上面的分析方法进行分析。先简单描述一下我所说的图书借阅系统的主要业务场景:图书信息入库场景:图书馆管理员扫描不同名称的书本。大家都知道每本具体
10、的书都有一个In ternatio nal Sta ndard Book Number,国际标注书号。图书馆是根据同一个ISBN的书会有很多不同的副本,每一个副本就是一本实实在在的书。 说图书馆数据库中保存的是书本的库存信息”在图书入库的场景中,只要是即书名相同的书只会被扫描一次,然后管理员会输入这种书总共有多少本,方等库存信息。当然这只是我自己理解的业务场景, 正确的吧。ISBN,即ISBN来管理书本的, 所以,严格的ISBN相同,应该放在什么地姑且不论对错,咱们就先当这个理解是借书场景:1. 借书人持图书卡去图书馆,先找到几本要借的书,然后跑到借书处借书;2.3.借书人拿着书从图书馆离开;
11、图书管理员扫描借书人的借书卡以及书本的条形码,条形码就是ISBN ;还书场景:1.2.借书人吃图书卡去图书馆,到还书处还书;图书管理员扫描还书人的借书卡以及书本的条形码,如果有需要罚款的,也在此时 会计算出来;还书人离开图书馆;3.接下来开始对每个场景按照上面的分析思路进行分析。图书入库场景的分析:1)场景参与者:我们也不关心是这个图图书馆、书本;其中图书馆在整个图书借阅系统中只需要一个实例, 书馆还是那个图书馆,所以我觉得可以把图书馆设计为一个服务。2 )参与者基本状态特征: 书本的基本状态特征:如书名、作者、出版社等信息;图书馆的基本状态特征:没有,一般情况下服务是无状态的,服务只提供服务
12、行为;3)场景交互过程分析:很容易理解,图书馆本身就具有图书入库的行为。图书入库时,图书馆服务会生成并保存一个书本的 库存信息”该信息包含了某个名称的书本的数量、书架位置信息。该库存信息中 的Count表示某个名称的书有几本。当在借书或还书的场景发生时, 这个Count就会改变;代 码示例如下: 图书入库场景类的实现:P ublic class StoreBookC on textprivate ILibraryService library =null;private Book book =null;p ublic StoreBookC on text(ILibraryService lib
13、rary, Book book) this.library = library;this.book = book;p ublic void In teract ion( int count, stri ng locatio n)library.StoreBook(book, coun t, locati on);图书馆图书入库的方法:public void StoreBook(Book book, int count, string location) / 图书入库时生成图书的库存信息var bookStoreInfo =new BookStoreInfo(book, count);bookS
14、toreInfo.Location = location;bookStoreInfoRepository.Add(bookStoreInfo);4)交互之后,场景参与者的基本状态特征是否发生变化?都没有发生变化。借书场景分析:1)场景参与者:图书馆注册帐号、图书馆、书本;图书馆是一个服务、书本也只是一本普通的书,它没有行 为,它是被借的。需要着重分析的是图书馆注册帐号这个参与者。 先说一下我对: 软件使用 者(即软件的用户)、注册帐号、图书卡、借书人这四个概念的理解。理解这些概念非常重 要!首先,软件使用者就是软件的用户,就是我们平时所说的用户,这点没什么问题。图书 卡和注册帐号的关系是什么?
15、我们都知道现实生活中, 人持图书卡去借书; 而软件中, 人通 过其注册帐号登录,然后以该注册帐号所代表的“人 ”做事情;因此,图书卡是用户用来借书的工具; 同样注册帐号也是软件用户通过软件进行借书的工具; 用户拥有图书卡, 用户拥有 注册帐号。 那么借书人如何理解呢?我们平时所说的借书人其实就是一种角色, 即用户在通 过借书卡参与借书的行为过程中, 我们把正在执行该行为或已经执行了该行为的人叫做借书 人。用更通用的表达方式就是, 我们通常会给正在做某件事情或已经做了某件事情的参与者 一个称谓,如凶手、借书人、还书人、应聘人,等等;所以,有了这些理解之后,我们就知 道借书人只是一个角色,某个注册
16、帐号扮演了借书人这个角色后可以行驶借书的行为;2)参与者基本状态特征:书本的基本状态特征:如书名、作者、出版社等信息; 图书馆的基本状态特征:没有,一般情况下服务是无状态的,服务只提供服务行为; 注册帐号的基本状态:图书馆注册帐号有基本的状态特征,比如:卡号,所有者姓名,是否 锁定,等等;3)场景交互过程分析:某个软件的使用者, 即软件用户通过某个已注册帐号登录软件系统, 然后选择了几本想借的 书之后点击 “借书”按钮, 然后该按钮触发一个借书的场景, 该场景创建时包含了部分的场景 参与者,在借书这个例子中就是帐号和书, 然后借书场景知道帐号应该扮演借书者这个角色。 所以帐号在扮演了借书者这个
17、角色后对每一本书行驶借书的交互行为。 扮演了借书者角色的注册帐号自动具有了借书的行为, 书馆接到通知后, 这本书没有库存, 先更新库存信息, 个借书信息对象,在该行为的内部实现中, 通知图书馆把书借出来。 随后图 首先根据当前书本获取书本的库存信息, 如果当前库存信息是 0 本,说明 就抛出异常通知软件使用者这本书目前已经被借光了。 如果还有库存, 则 比如图书的数量减1,然后根据当前借书人,书本,以及当前时间生成一该对象还会包含一个图书归还时间的附加信息。 最后将该借书信息对象保 存起来。代码示例如下: 借书场景类的实现:public class BorrowBooksContextpriv
18、ate LibraryAccount account = null; private IEnumerable<Book> books = null;public BorrowBooksContext(LibraryAccount account, IEnumerable<Book> books) this .account = account;this .books = books;public void Interaction()var borrower = account.ActAs<IBorrower>(); foreach (var book in
19、books)borrower.BorrowBook(book);借阅者的借书方法:public void BorrowBook(Book book) / 通知图书馆把书借给我 library.LendBook(book, this );图书馆借出书的方法:public void LendBook(Book book, IBorrower borrower)/ 更新书本在图书馆的库存信息,如:数量信息、所在书架位置信息var bookStoreInfo = bookStoreInfoRepository.GetBookStoreInfo(book.Id);if (bookStoreInfo.Co
20、unt = 0)throw new Exception( string .Format( "The count of book '0' in library is zero, so yo u cannot borrow it." , book.BookName); bookStoreInfo.DecreaseCount();/ 数量减 1bookStoreInfo.Location =/ 生成借书信息并保存到borrowInfoRepository.Add( null; / 位置清空Repository 中new BorrowInfo(book, borro
21、wer, DateTime.Now);4)交互之后,场景参与者的基本状态特征是否发生变化?都没有发生变化。还书场景分析: 有了借书场景的分析, 那么还书场景也很容易分析了, 主要的过程是: 注册帐号扮演借阅者 角色执行还书行为, 执行过过程中通知图书馆接收某本要归还的书, 图书馆接到通知后首先 调出与该书本对应的那一次借书信息, 然后更新其还书时间, 最后更新图书的库存信息。 另 外的基本和借书类似了,相信大家一看代码都应该明白了,直接上代码吧! 还书场景类:public class ReturnBooksContextprivate LibraryAccount account = null
22、; private IEnumerable<Book> books = null;public ReturnBooksContext(LibraryAccount account, IEnumerable<Book> books) this.account = account; this.books = books;public void Interaction()var returnner = account.ActAs<IBorrower>(); foreach (var book in books)returnner.ReturnBook(book);借书者的还书方法:Publ
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 高危儿培训试题及答案解析2025版
- 检验科临床生化检验操作规范
- 2025护理核心制度考试题(附答案)
- 医疗器械经营质量管理规范培训试题及答案
- 液压与气压传动的考题及答案
- 企业重大事故隐患专项排查整治方案
- 液压与气压传动习题集附答案
- 2025年船厂监护考试题及答案
- 田园创意画课件
- 2025版痴呆症常见症状及护理指导
- 《与鲁迅先生对话》课件
- TSG D2002-2006燃气用聚乙烯管道焊接技术规则
- NB/T 11525-2024气动、电动调度单轨吊车技术条件
- DB34T 4829-2024公路工程泡沫轻质土设计与施工技术规程
- 深圳市既有住宅加装电梯工程消防审查验收 工作指引
- 沈阳市铁西区工业博物馆小学-四年级期中家长会(数说成长学绘未来)【课件】
- mbti人格测试题及答案下载
- 2025女装行业发展趋势与市场潜力探索
- 《安徒生童话》整本书阅读(教学设计)-2024-2025学年统编版语文三年级上册
- 教育培训班转让合同5篇
- 2025(人教版)小升初数学总复习 知识点总结+专项练习(含答案)
评论
0/150
提交评论