类(对象)主要内容:类名,属性,行为。确定类,我们就是需要确定类的名称和属性以及它的行为。本文包容如下内容:
1、如何确定类名,需求建模
2、通过分类,优化模型结构
3、确定类之间如何优雅的交互
关键字:建模、 共性、低耦合,高内聚、惯用法。
如何确定类名,需求建模 (面向对象分析)
分析
目的是为了能够找到关键抽象 (一个类或对象,他是问题词汇的表的一部分,有明确的边界),确定关键抽象包含两个过程:发现和发明。分析与设计边界是模糊的。分析关注点是面临的问题域,从问题域的词汇中发现类和对象,实现真实世界的建模。设计 ,在模型中发明一些抽象和机制,为要构建的解决方案提供设计。
常见分析方法
1、经典分析
关注问题域中的实实在在的事物,事物为类和对象的主要来源— 经典分类
2、行为分析
关注动态行为,将这些行为作为类和对象的主要来源 — 概念聚集。可以依据对象的责任(对象的锲约)和系统的功能。
3、领域分析
某个领域中所有应用都通用的类和对象 ,
1、咨询领域专家(领域中的参与者,用户) ,构建一个通用的模型草稿
2、检查领域中原有的系统,以一种通用的格式展示出这反面的理解
3、咨询领域专家,确定差异和相似性
4、精细化通用模型,以包含原有系统
5、垂直领域-类似应用,水平领域-同一应用相关部分
4、用例分析
经典分析,行为分析,领域分析依赖与分析师的个人经验,这样的过程不确定,不能预测成功与否。 可以通过功能用例来确认。
5、CRC 卡
类名-顶部,责任-一半,协作者-一半
6、 非正式英语描述
7、 结构化分析
1、数据流图 -外部实体,数据存储
2、控制流图-控制存储,控制转换
类命名
1、对象应该用合适的名词词组来命名,如 theSensor 或简单shape
2、类应该用常见的名词名词词组来命名,如Sensor 或者Shape
3、如果可能,选择的名称应该是领域专家使用和认识的名称
4、修改操作应该用一个主动语态的词组来命名,如 draw 或者moveLeft
5、选择操作应该表示出查询的意思或者用be动词形式来命名
6、使用下划线或者大小写字母主要是个人喜好,但是无论使用哪种风格,至少要在程序内保持一致
类优化
1、当我们将某个关键抽象为候选者,依据测量指标来评估它 (高耦合,低内聚)
2、对于新的抽象,需要放在已经设计好的类和对象的层次结构中,通常是先创建一些看似不相似的类型,意识到它们是相关的,然后将共同点剥离出来,放到一个超类中。反复迭代, 将类和对象放到正确的抽象层次中是很难的, 类提升,发现一个通用的子类,将它的类结构上移。(开发工具有提供类似的功能 IDEA),从而增加共享度,反之,一个类它太一般化,无法派生子类,语义上面差距大,粒度规模冲突。
3、类粒度 正确选择对象取决于应用的目的,以及要操作信息的粒度
分类-优化模型结构
为什么要分类
分类基本上是发现共性的问题。当进行分类时,我们寻找具有共同结构或者表现出共同行为的一组事物,分类可以帮助我们确定类之间的泛化,特化,聚合的结构。面向对象设计中,认识到事物的相似性,能够让我们将共性放入到关键抽象与机制中,导致更小的应用和更简单的架构。分类也指导我们做出有关模块化的决定,通过发行共性可以将类放入到不同的模块中。
分类的困难性
确定类和对象没有简单的诀窍,没有完美的类结构,也没有一组正确的对象,设计和选择是许多竞争因素中的折中,
对象是有清楚定义的边界事物,一个对象与其他对象的分开的边界很模糊。比如: 一句话中 ,字符构成一类,还是单词构成一类,
不存在 完美的分类,尽管某些分类比另外一些更好,有多少人参与就有多少中分类方法,每个人关注点和视角不一样,看到的共性不一样。
明智的分类需要大量的创造性思维,例如:激光像金鱼,,,共享是他们不会吹口哨。一般人发现不了这样的共性。
好的软件设计看起来简单,但是经验表明,需要很多艰苦的工作才能设计出简单的架构。
分类过程
0、通过增量和迭代的方式来分类
1、首先使用一种随意的方式解决问题
2、人们在随着经验的积累,就可以知道哪些解决方式会更好。
3、总结出更通用的解决方案。指导更复杂的实践
4、复杂的问题,开始随意的解决问题 —循环
分类方式(经验)
经典分类(按照属性来分)
1、所有具有某一个或者某一组共同属性的实体构成一个分类,这样的属性对于这个分类是必要的,也是充分的。
比如:属性:已婚,未婚。一个人要么是已婚要么是未婚 ,属性:高,矮 不行。高矮没有明确的标准
2、利用属性作为对象间相似判断的依据 ,人们可以依据某一个属性是否存在,将对象划分到没有交集的集合中。
3、问题按照属性来分:不可能得到一个属性列表,明确哪些类在这个列表中,哪些类不在这个列表中。
概念聚集(按照概念来分)
1、类的产生 ,首先是形成类的概念描述,在依据这个描述进行分类。超越了一个属性的定义
比如:一首爱情歌曲,我们确定某个歌曲像爱情歌曲就划分到这一类
2、概念聚集与模糊(多值)理论有密切的关系,对象可以按照不同的适合程度属于一个或者多个分组,概论聚集通过最适合来进行绝对分类判断
原型理论(按照已有的类和对象的关系)
有一些抽象没有清晰界定的属性,也没有清楚的概念。 这样依靠经典分类和概念分类就不好使了。这时候可以按照与已存在类或者对象 的相似度来划分
三种方式应用:
从属性 到行为,到已有的属性和行为。首先依据特定的领域相关的属性来确定类和对象, 关注重点为 构成问题空间的词汇表结构(属性)和行为,如果不能得到满意的类结构,在使用聚集,关注重点是 协作对象的行为 ,如果不能得到满意的类结构,最后使用原型理论,参照已有的类 属性(结构),行为。
机制-类之间的协作
1、关键抽象反映了问题域的抽象,而机制是设计的灵魂,在设计过程中,开发者不仅需要考虑单个类的设计,还要考虑这些类的实例如何一起工作。
2、开发者决定采用某种协作模式后,工作会被分解到许多对象上面,即 相应类上面定义适当的方法。与单个类层次结构设计一样。机制代表了战略设计决策,单个类的接口设计更多是一种战术决策,这些战略决策必须被明确标识出来,否则我们将得到一些无法合作的类,所有类都完成自己的工作,很少考虑其他对象,最优雅、最精益、最快的程序会包含一些精心设计的机制。
3、机制实际上是我们在构造良好软件系统中发现的各种模式,是我们的惯用法。惯用法是编程文化的一部分,机制也代表个复用。
小结
1、我么先可以通过面向对象分析的经验方法:经典分析(属性),行为分析,领域分析,用例分析,CRC 卡,结构化分析 等来确定系统中类组成。
2、通过对获取到的类进行迭代式,增量式的找到其中共性来进行分类,优化类结构。找到共性的一些方法包括:经典分类,概念分类,原型理论。
3、我们还需要精心设计类之间的协作方式,使得系统可扩展,是低耦合,高内聚的。设计的手段 可以利用现有经验(惯用法)-设计模式,设计原则等。
网友评论