那上面呢是相当于识别这个类,下面我们来看一下,这个属性我们可以怎么样来识别。
一个就是说按照常识去识别一个对象应该有哪些属性,
比如说我们在座的同学是作为北大的信息学院的这样的一个学生,
那么到这个信息学院的学籍管理系统里面,就需要对你们的姓名,对吧,
你们的这个什么?地址,你们的通讯方式等等, 进行这个刻画。
所以这些完全也跟我们什么? 这个认知一个人的这样一个常识是相关的,所以从常识的角度看,
所要去描述的一个类,到底有哪些静态的一些 特性。
那么还有在当前的问题域中,对象有哪些的 属性。
比如说商品的条形码,对吧。
在这个超级市场里面,商品的条形码,经常作为商品的唯一个的这样一个标志,对吧,所以这- 里面是它
问题域所带来的,是由超市这样的一个销售领域所带来的共同的特点,所以你要把它划分上去。
还有一个比如说根据系统责任,这个对象具有哪些属性? 比如说持卡人的使用地点,另一个就是,所以这里面大家
看完全是根据这个系统责任的角度来去体现的,这是一个 银行卡的信用卡的这样的一个什么?这个管理系统,它要做的。
那么还有就是说为了建立这个对象啊,为了保存和管理哪些信息,所以这个里面也要看一下,
那么被管理的信息就要提取为属性, 那么对象为了实现操作的功能需要增加一些属性。
比如说 传感器对象,为了实现它的这个定时
采集信号的功能,有的时候就需要一个时间间隔的这样一个属性。
那么对象是否需要专属的这个属性来描述这个状态,比如说这个
设备对象,它有关闭啊待命等等,不同的这样一个状态。
所以这个时候,它不同的状态会呈现不同的行为,所以这个时候 我要设置一个状态的属性,为了
进一步去刻画或者挖掘它在那个状态下 具有什么样的行为特点。
所以这个属性的命名是为了 这个抽取或者是抽象这个系统的 操作。
那还有就是说,有什么样的,用什么 样的属性来表示聚合和关联,这个后面我们会看到。
就是说 这是关联是表示事物之间的静态的 联系,聚合实际上也是表明事物之间的这种静态的这种联系。
那进一步也是审查筛选,因为你的属性
抽取出来到底是不是重要啊,比如说我们图书管理系统里面,需不需要输入重量?不需要对吧?
所以你要按照自然常识,书是有重量的,我给它抽取出来,但是在这里面我可以把它删除了。
那么是否描述对象本身的特征,比如说课程,为了相当于
很好的安排这个多媒体电子教室,把那个老师的电话号码也写在里面,这里面是不恰当的,所- 以在这里面我完全可以给它
这个通过其他的方式给它弥补,所以把这样的不好的一些东西给它删除了。
另外是否破坏了这个对象的特征的原子性,比如说一个人的通信地址对吧,
你要如果把北京市海淀区都拆分出来,有意义吗? 没有任何的意义,对吧,所以它是一个整个连在一起才是一个完整的
通讯系统,那么还有一个就是说是否可以通过继承来得到,如果能够通过继承来得到,就不要- 设置这样的属性。
还有,是否能通过其他的属性直接的推导出来 这个属性也不需要来设置。
还有实现条件有关的这个来到问题域中考虑 比如说规范化的问题,这是完全是数据管理部分要考虑的,那么还有对象的标志问题,
这是根据你采用什么样的编程语言,不同的编程语言提供对象的这样的一个描述, 支持粒度是不一样的。
所以这个里面也是根据 OOD 去来考虑的,性能的问题。
有的时候你要来考虑,也就是说未来你可能为了提高操作的速度啊,来
增加一些主动类啊,或者是把一些主动类相当于合并啊,所以这个过程 也是性能所带来的一个东西,你也不需要考虑。
只需要来考虑它 完成了哪些事情,我把它能够真实的通过你的分析反映出来就可以了。
那么属性的命名这个里面我也不需要来考虑,刚才已经介绍了。
那么这个里面大家可以看到,在我们的这个
面向对象的分析设计里,我们推荐大家形成一个规约啊。
也就是说对于一个类,它所涉及到的方方面面进行规范化的描述,实际上就是一个补充说明。
因为 一个类图是非常抽象的,你没有办法去捕获它后面的一些属性操作所带来的一些内涵,所以在-
这个里面 我们希望形成每个类有它自己的规约描述,所以这就是
类规约里面先给出属性的这样的一个描述,比如说这里面有这个
属性的这样的一个文字的解释,类型的解释,等等。
所以到这,整个相当于我们的属性相当于就能够相当于给出来。
那个操作实际上识别的过程中就要 看对象的行为,对吧?因为操作是对象行为的这样的一种高度的抽象。
那也就是说你在识别操作的时候,要来区分一下,这个对象的行为它是具有哪一种
特点的,它是作为一种系统的行为,也就是说用于创建,删除,复制,转存这种
对象呢?还是说它具有一些简单的 这样的一些操作,就是说,一些读写属性的这样的一些
特点的,那么这是作为对象自身的这样的一个行为。
那么还有 可能是说对象本身,它执行了一些复杂的这样的一些 算法。
另外呢它实际上是对于系统中的一些 功能逻辑起到了一种支持,
所以主要是分为这三个方面来去看一下, 对象的操作整个是不是有这样的一些特点。
那么从这三个方面呢,也就帮助我们来识别出来了对象的这个操作的类型。
那么这里面也需要让大家注意到的就是说一种是类属性,
一种是这个实例属性,对吧,实例范围的属性,实例属性。
那么操作这个里面实际上也跟它对应的就是说如果我操纵的是类属性,
那么这类的操作就叫类范围的操作,那么它的 画法呢相当于也是在操作的下面有一个下划线。
那么其他的这个操作就是 普通的对象类的这个操作,就是实例范围的操作,所以大家对于
这个类范围的操作和实例范围的操作有一个界定。
那么从这上面的三个方面来发现了操作之后,我们要来看一下就是说
它这些操作到底是反映了哪些方面,一个就是说考虑一下系统的责任,逐项检查
用户的需求,提出的每一项功能的这个要求。
那么看一下,这一些的功能的需求到底是由哪些对象来提供的。
这个是帮助我们来确定这个对象的操作,一个方面,第二个就是说,考虑问题域,
因为对象所在的问题域啊,可能这个事物有一些 特殊的这样的一些行为,那么这个是这个领域,里面对象特有的一些行为。
比如说我们说的这个超市,对吧,超市管理系统,那么超市管理系统里面实际上
我们就会有这个收款机,这个收款机实际上它有一个收款的这样一个行为,也就是说
它帮助而且去在这个过程中相当于帮助来去顾客来查找 钱。
那么这样的一个特点实际上是属于这种超级市场
所共有的这样的如果你要在超市范围内,就必然会有收款机,那么收款机就会 执行这样的行为。
所以你要看一下,这样的一个领域中相应的这个对象, 有一些什么样的行为。
第三个方面比如说来分析一下对象的状态。
那么看一下对象的状态之间的转换,可能有哪一些操作去 引起的,所以空调这个对象相当于,它既然有关
和开这个状态,开这个状态里面相当于又进一步相当于会有一个启动啊,这个相当于从这个
预热以及到这个相当于制冷,等等这样的状态转换,看一下
由一些什么操作引起的?还有一个就是说追踪 操作的执行路线,这个是比较好理解,对吧?我们如果想
把这个对象中所有的操作都识别出来,我还要看一下这个对象将来它到底有哪些个行为?
那么模拟它的操作的执行,也就是说在系统范围内去跟踪, 这些行为可能会
由哪些操作所引发的的,所以这个过程中是帮助我们来识别操作。
那么从以上 这四个方面呢是帮助我们来发现操作的这样的一个策略,
那么我们识别了操作之后,我要看一下,这些操作
是否抽象得很合理,那也就是说要进行操作的审查与调整。
这个过程中就是重要的去审查 对象的每一个操作,它是否是有真正存在的价值。
也就是说,它是否直接提供了系统责任所要求的某项功能,这个是直接对应的什么?
用户的需求去看,对吧?它到底是不是满足了系统所要提供的某 某种功能的需求,那么或者是否是它响应其它的
操作来间接地帮助其它的操作,来完成某种的服务。
那这个时候帮助别人做某种事情,它也有存在的价值对吧?所以这个时候
就要从这两个方面来去看,如果从这两个方面
都不满足的话,那么这种操作应该是没有意义的,就说 被称为无用的操作。
所以这个过程中只要对这样的操作进一步的调整 那么另一点大家记住,操作因为它一定是具有高内聚性的,
也就是一个操作它完成了一项单一的完整的,这样的一个系统的功能。
那么这一点就确定了说,我进一步调整操作的方案就可以从以下两个方面:
一个就是说,一个操作包括了多项可独立 定义的功能。
我把很多的东西相当于都放在一个操作里,但是实际上 这些成分它不是高内聚的,它们之间可以独立存在的。
所以这种情况下我要把这样的操作,内部的成分进行拆分, 进而形成多个操作。
那还一种呢,我为了 相当于希望的说把这样的一个操作进行细化,在细化的过程过细了。
一个独立的功能呢相当于被化解了 N 个部分,被分解到多个对象操作中,那这种情况下
你也需要来看说这样的一些功能,它本身对于每个操作来说,不是
这个必要的对吧?不是充分必要的,那在这种情况下就需要的是
把一些其它的成分进一步聚集啊, 最终形成一个独立功能的这样一个操作,所以这是一个存在一个
操作的合并的问题,所以这就是 根据操作必须具有高内聚性的这样的一个特点,来调整就是
一些操作。
所以在 识别了操作之后,我们要来看这样的操作是不是具有主动性?主动行为的特点。
那么从也是从以上这四个方面来考虑,一个就是问题
域对吧?那也就说对象行为是被引发的,它还是主动呈现的?
那如果是主动呈现的,它应该是一个主动操作; 另一个就是它在系统之内,那么是接受系统之外的
这个外系统的这样的一个出发来去执行的? 那么这种情况下对于系统之内而言,
它没有接受其它对象的这样的一个消息就主动执行了,所以它也是 这个主动操作。
所以大家切记第二点啊,第二点是我们进行
这个类图分析的时候非常重要的一点,就看这个系统之外,与这个系统打交道的
这个参与者有哪些?那么在这个过程中可能它要接收到系统之外的,参与者给它的 这个消息啊。
那么从系统之内来看它是不是还 要接受其它对象的这样的一些消息?那么还有一个就是说
根据系统责任观察,系统功能的构成层次,这个我觉得大家也知道就说
任何复杂的事物我们都可以什么?给它分层处理,也就说最上层看到 的是大的对吧?模块。
再往下我们再把每一模块再进行细化,这样 的一个富而知之的特点帮助我们控制了分析
包括设计的这样的一个复杂性。
那么更容易理解或者是 描述大千世界,所以这个里面就来看说那么在我
观察系统功能的时候,我第一层相当于看到的对吧? 就最外层的那个应该是
考虑完成这个外层功能的对象操作,它是不是相当于就说不需要接受其它的
这个,跟它同一层中其它的这样的 一个对象,所以从最外层的这个对象里面去看,
它的这个操作是不是受着其它对象的消息出发而执行?
那么下一个我就说要对操作进行这个命名啊,操作的命名里面
也是要分为这个相当于动词的,动宾结构,比如说我们说售货员
对吧?它是作为一个事物,那要描述它的操作的话,就会有售货的操作。
那么商品呢会有售出的这样的一个操作。
那么还一个就说,在一般特殊的这个结构里面 的位置,因为我们还没有讲到
这个类之间的这样的一个对象实例之间的关系,那么
到我们这本节课相当于会讲到这个啊类,就对象这个实例之间的这个关系的时候会讲到对- 象的这个
之间的这个四种关系,那么这个一般特殊结构呢相当于就是一种关系啊,我们
被称为这个泛化关系,那么也就说是指的是,如果通用
的操作应该放在一般类中,专用的操作应该放在特殊类中,所以这种的话要来看一下
这样的一个操作的命名是否是恰当?所以根据一般类特殊类的 这样的一个位置来判断操作名字的适用范围。
那么我按照上面的方式已经 识别出操作之后,相当于要对操作进行详细的说明,就是我们说的
应该有一个类图的这样的一个规约说明, 就叫类的规约。
那也就是说要对类 的一个整体的说明,同时要对类里的属性,各种的属性进行
详细的说明啊,那要对类里的操作也要进行详细的说明。
所以类的操作进行详细的说明,就包括了操作的这样的一个文字的描述,也就是类本身它
要体现的功能的一些特点啊,它的整个在系统中的作用是什么?
包括操作啊名它的输入输出参数,参数的类型等等。
还有一点就是说 消息发送也就是指出这个操作执行的过程中
啊需不需要请求其它的一些对象的操作? 那么如果需要请求其它对象的操作的时候,
就应该给出接收这个消息的对象类名,以及执行这个消息 的操作名啊。
这也就是其它对象的对象类名,以及其它对象执行这样的一个 消息啊请求的这样一个操作的操作名。
那么还有就说操作它有的时候有一个执行 前提条件呢,这个后置条件包括
执行的这样的一个时间的,这样的一些约束要求啊给它说明。
还有一个就是 对于操作的处理流程我们可以采用流程图啊,
或者活动图,那也就是说这对于操作的内部的处理逻辑,进行进一步的详细的描述。
所以这是操作的详细说明,大家知道对于类规约而言,它是一个附加性的这样的一个说明文档。
因为我们对于我们类图来说,里面的信息太多了,我没有办法去
给出特别这个详细的,在类图上给出详细的这样的一些信息,所以需要借助于类规约
帮助软件的开发团队,来建立起这样的一个统一的认知。
也就 帮助比如说分析设置人员跟后面的编码人员达成共识。