领域:即要解决的问题所在的领域,如人工智能领域,不同的领域需要不同的专业知识来建模
领域类模型:由类图,描述类及其关系的"数据字典","术语定义"组成
领域分析的目的:识别一组类,即从问题领域里抽象出一组类,处理同一领域的问题的所有应用程序都能使用这组类
(这不仅保证了类对同类应用程序的可重用性,同时保证了以后我们对此次开发的应用程序作出变化时可以很好地适应变化)
领域分析的一般方法:
一是要参考别人在这一领域已完成的工作,并查找该领域的文献,识别该领域别人应用程序都使用的类和对象
二是要对问题进行陈述,然后对陈述的文本进行分析,再进行建模
对问题陈述的要求:一是要描述问题和需求而不是要怎么做,要注重对对象及对象关系的陈述,而不是对过程的陈述
二是要描述该领域的通用需求,而不是个别应用程序的特定需求
领域分析的结果:得到一个描述类和类之间关系的领域类模型
开发领域模型
(1)准备问题陈述
准备陈述非常重要的阶段
(2)识别对象和类
使用文本分析技术从问题陈述中提取所有名词和名词短语
(目的是识别可在后续步骤中进一步详述和细化候选对象,所以不可能也没必要第一次就得到最终的类和对象,所以不必太细致)
对于提取的名词或名词短语,要仔细考虑是否真正代表了该领域的某个对象
根据经验更可能表示对象的是:
明确的事物(教室,场地)
概念事物(课程,模块)
事件(测试,考试)
外部组织(发布者,提供者)
扮演的角色(学生,老师,校长)
其他系统(招生系统,年级报告系统)
将提取的“准对象”标明类型如(概念,事件,明确事物,扮演角色,简单值-属性,外部组织,其他系统,实例,不是对象,无关),然后删去不恰当的类类型
根据经验跟可能不恰当的是
冗余类 表示同一事物的类 选择其中最具描述性的
无关类 与问题没有直接关系的类
模糊类 没有严格定义的类
属性
操作
角色 角色的名称有助于区分交互中不同对象的职责,但它们不该作为类
实现结构 某个特殊解决方案的实现细节有时会写到问题陈述中,如数组,索引的序列化文件等
得到修订的候选类
注:这一个步骤目的是识别领域中的类,所以应该忽略其他问题(如继承和实现),它们在后续步骤中处理
(4)开发数据字典
数据字典:用于记录类的相关定义。定义类的范围和细节信息
如属性和操作以及类之间的关联关系
以在后续步骤不断细化
(5)识别类之间的关联关系
在问题陈述中查找连接两个或者多个对象的动词或者动词短语,然后写出这些,并在后面标注关系,可以识别出关联关系
关联关系应该根据它的性质而不是陈述中的动词或动词短语来命名,如“账户由委托人开设”,账户与委托人的关系本质上是属有关系而非开设关系
然后出去不必要和不恰当的关联关系,并根据问题领域知识添加其他关联关系,以细化关联关系
根据经验更可能去除的关系
已去除的类的关联关系
无关的或者实现关联关系
动作
三元关联关系
导出关联关系
得到修订的关联关系
(6)识别类的属性和关联关系类
属性的识别:查找后面跟着所有格短语的名词和名词短语可以识别属性,但是仅仅在文本中不可能也不必要识别出所有的属性,属性要在后期设计阶段更易于识别
(7)利用继承关系组织类
自底向上法:
比较类的属性,操作,类名,与其他类的关联关系,或者从问题本质上来说来个类的共性关系可以查找共性
然后定义一个父类来涵盖具有共同结构的类,并把一些子类与其他类同样的关联关系删除,转移到父类中
自顶而下法:
检查某个类是否有一些特殊的情形,需要其他的结构需求或者行为需求。
查找由形容词和类名组成的名词短语,也要借鉴现实生活中对象的分类法去特殊化类,同时要思路开阔,运用领域知识
(8)为可能的查询验证访问路径
(9)迭代并细化模型
模型总是不能一次完成
需要重复以上过程以不断调节模型,细化模型,直到领域类模型稳定健壮