《第19章概念模型.pdf》由会员分享,可在线阅读,更多相关《第19章概念模型.pdf(8页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第 19 章 概念模型 第 19 章 概念模型 采用我们使用的相同的对象模型表示法来描述运行中程序的堆结构即结构中有什么对象,他们是怎样通过属性联系起来可以更抽象地用来描述一个系统或由系统操作所处的环境的状态空间。我把这些称为“概念模型”;在课本中,称其为“数据模型”。在练习4,示范例子和对象建模表示法描述波士顿地铁系统结构的过程中,你已经动手建立了一些概念模型。表示法自身十分简单,并且一旦你以面向实现的观点看,将Java对象换为现实世界的实体,将属性换为关系等等,模型会很容易理解。学习本课程之后,你应该能够读懂概念模型。另一方面,通过编写概念模型,你会得到更多练习。这涉及到进行恰当的抽象正如
2、你设计一个抽象数据类型的接口时必须做的。想做好很难,但障碍尤其与对象模型无关。要找到问题的实质,并将其简洁地表达通常并不容易。一旦越过这个障碍,并构造了一个概念模型,你就成功了一半。有个说法:如果你能准确地描述要解决的问题,那么你就在解决这个问题上有了进展。在软件设计上,这个进展比成功一半要好得多。所以要学会建立概念模型必须多加练习。在这个过程中有很多乐趣,当你的建模技术有所提高时,你会发现自己已成为一名优秀的设计师了。当你的概念结构清晰时,代码的结构也会变得简单和清晰,这样写代码会更有建设性。在本讲中,我会给出关于如何建增量模型的一些见解。在这些部分,模型会以最终形式出现。19.1 原子、集
3、合、关系 19.1 原子、集合、关系 我们将从集合、关系和原子开始建立模型结构。原子是一个原始的实体,有如下性质:不可分割性:不能分解为更小的部分;不变性:属性永远不变;不可解释性:没有任何内置属性,比如“数”。除了基本粒子,现实世界很少有东西是原子的。但这不影响我们将它们以原子建模。事实上我们的建模方法完全没有内置复合的概念。建立一个模型x,x由y和z两部分组成,我们会将x、y和z都视为原子的,并将制约关系用它们之间的外在的关系表示。一个集合仅仅是原子的汇集,没有重复计数和次序的概念。关系是联系原子的结构。数学上,它是一系列对子,每一对由两个原子以指定顺序组成。你可以将关系想象为一个有两列的
4、表,其中每个表目是一个原子。列的顺序很重要,行的顺序无关紧要。行中的每个列必须有一个表目。在集合和关系上定义一些操作符会更方便些。我们将用它来说明我们的图形化模型,但它们也能被用在更多易表现的约束上。给出两个集合,s和t,可以将它们的并集写成s+t,交集写成s&t,差集写成s-t。我们用no s表示s为空集,用some s表示s为非空集合。用s in t表示s中的每个元素也是t中的元素。1s=t表示s中的每个元素都是t中的元素,且反之亦然。给出一个集合s和一个关系r,s.r表示s在r下的映射即s中的元素通过r映射形成的集合。我们可以将它定义成这样的形式:s.r=y|some x:s|(x,y)
5、in r 给出一个关系r,我们将r的转置写成r 即镜像关系,将其这样定义:r=(y,x)|(x,y)in r 最后,我们将r的传递闭包写成+r:它是将x与y联系的关系,如果存在一些原子z1,z2,zn的有限序列如下:(x,z1)in r(z1,z2)in r(z2,z3)in r(zn,y)in r 并将r的自反传递闭包记为*r,即把传递闭包作补充,将每个原子与它自己关联。你可以将传递闭包设想为将某关系做1,2,3次应用时的映射;自反传递闭包则包括0次应用。让我们看一些例子。假设有一个存在或曾经存在过的人的集合Person;男人和女人的集合Man和Woman;一个将父辈和子辈联系起来的关系pa
6、rents;还有一个将一个人和配偶联系起来的关系spouse。你能解释以下语句么?在现实世界中哪些是正确的?no(Man&Woman)Man+Woman=Person all p:Person|some p.spouse=p.spouse.spouse=p all p:Person|some p.spouse all p:Person|some p.parents no p:Person|p.spouse=p all p:Person|p.sisters=q:Woman|p.parents=q.parents all p:Person|p.siblings=p.parents.parents
7、至此,以上这些反映出世界和关系的定义的基本事实。这里有一些更能引发争论的例子。no p:Person|some(p.parents&p.spouse.parents)Man.spouse in Woman some adam:Person|all p:Person|adam in p.*parents all p:Man|no q,r:p.spouse|q!=r 我假设你明白基本的逻辑表示。我还在sister的定义中稍带使用对集合的理解。在我们的表示法中如何写以下命题:每个人都有母亲。没有人有两个母亲。堂(表)兄弟是有相同(外)祖父母的人。2 第一个命题说明了重要且有趣的东西。假定一个标识符的
8、含义不言自明是很容易的,但在软件开发中,这很危险!标识符含义的含糊不清会导致许多问题。开发者对需求的理解不尽相同,并且如果模型无法装配,或者不能解决客户的问题,他们会终止开发。所以我们得小心地表达每个集合和关系的含义。在上面这个例子中我们要说明mother的含义。是生母还是法律上的,或者其他。如果你构造的概念模型使用了未在你工作的语境中定义的术语。你必须提供一个词汇表。所以在这里,我们这样写词汇表:Mother:(p,q)在mother中,q是p的生母。19.2 图形表示法 19.2 图形表示法 没有必要重新学习图形表示法的所有细节知识;你在对象模型一章中已经有所了解。我们要做的是更抽象地重新
9、解释这个表示法。查看一下家谱的对象模型。在Java语言或一个类中,每个方框代表一个原子的集合而不是对象的集合。每个箭头(实心的)代表一个集合到另一个集合的关系。它代表一个抽象的关联,而不是一个属性或实例变量。箭头的方向当然有语义结果:它在p是否是q的父辈或是相反上产生重大差别。但对于任何关系,我们可以用一个转置关系进行纠正;比如将parents换为children。不存在连通性表示法,或像一个实体变量属于一个类一样,一个关系属于一个集合的概念。3PersonJobCompanySalarycompanysalaryjobs!空心的大箭头表示子集关系。共享一个箭头的两个集合不相交。实心箭头表示子
10、集是彻底的,即超集的每个元素是至少一个子集的元素。在这个例子里,我们说每个Person是一个Man或一个Woman。没有超集的集合被称为domains。其被假设为不相交。例如没有原子既是人又是姓名。在这里我们不回顾多样性和易变性标志;在课本中关于它们的讲解非常好。19.3 三元关系 19.3 三元关系 有时我们希望所描述的关系涉及三个集合而不是两个。例如,我们要记录一个人在某公司工作领工资的事情。如果某人可以为几家公司工作,并从每个公司挣不同数目的工资,我们不能仅仅将工资和某人相联系。最简单的办法经常是新建一个域。我们在这里引入Job,并描绘一个对象模型表示从Person到Job的关系jobs
11、,从Job到Salary的关系Salary,从Job到Company的关系company。当你引入的域与原子的自然集合相符时,这个办法很可行表示法在问题域中已经得到解释。或者,你可以引入一个索引关系。如果你将从A到B的箭头标为rIndex,这表示对于每个集合Index中的原子i,都存在一个从A到B的关系ri。例如,对文件系统中的模型命名,我们会得到一个从Name到FileSystemObject的索引关系objDir,因为文件系统的每个目录概念上存在一个单独的命名关系。最后,你可以描绘出这样一个对象模型,并将它称为投影:它显示了某域中一个特定原子的关系。例如,设计一个字处理机时,可能会有一个三
12、元关系格式将StyleName和Format在一个给定的Stylesheet中联系起来。我们也许想描绘一个模型,只考虑一个stylesheet,这样这个关系将变为二元关系。419.4 三个例子 19.4 三个例子 我们看一下概念模型的三个例子。它们都很简单,却很精辟。如我希望的,三人例子表明构造很小的模型也很有用处。当你着手最终的项目时,以及在任何随后的开发中,你应该在需要的时候构造概念模型。没有必要构造一个单独的完整的模型;简单描摹多种小的模型草图,然后决定它们中的哪些需要合并。对概念建模有了经验之后,你大概会想到概念表示法的一些 明显的并且在你深入代码之后才会发现的东西。所以试着熟悉更多你
13、一开始认为需要的模型。当你编写代码时遇到复杂度上的困难,后退,去做模型草图。19.4.1 Java 类型 19.4.1 Java 类型 我们的第一个模型显示了Java中对象和变量间的关系以及它们的类型。理解这个模型对于理解动态调用和类型转换非常重要。有三个域:Object:运行期间存在于堆中的实例对象的集合 Var:以对象为值的变量的集合。包括实例变量,方法参数,静态变量和局部变量。Type:由类和接口定义的对象类型的集合。ObjectVarClassInterfaceAbstracClassObjectClassTypeotpyevtpyehods?!我们会忽略空的索引和原始类型,如int。
14、域Type分为类,抽象类,和接口。集合ObjectClass是一个单元素集它的唯一元素是名为Object的类。存在4个关系:Holds:从一个变量到它对应的对象的映射;Otype:从一个对象到它的类型的映射它的类型由某些类的构造函数构造;5 Vtype:从一个变量到它的公开类型的映射;Subs:从一个类型到它的直接子类型的映射。子类型是这个类扩展而来的类;一个接口的子类型是扩展它的接口和实现它的类。这里有一些不能用图形表达的约束:首先,基本类型安全性一个控制某变量的对象类型是集合中此变量直接或间接的子类型。all v:Var|v.holds.otype in v.vtype.*sub SetB
15、oxSubsetArrowFilledHeadArrowArrowEndRelationArrowMarkingonfromtomutabilitymultipliety!?!Java中的类型层次的一些属性:每个类型都是Object类的直接或间接子类型;一个类至多只能是一个其他的类的子类型;所有类型都不能直接或间接地是自身的子类型。Type in ObjectClass.*sub all c:Class|no c1,c2:Class|c1!=c2&c in c1.sub&c in c2.sub no t:Type|t in t.+sub 接口和抽象类不能用具体例子说明。no o:Object|
16、o.otype in(AbstractClass+Interface)19.4.2 元模型 19.4.2 元模型 我们下一个模型是图形对象建模表示法本身的元模型。它应该是自解释的。有这样一个约束:一个集合框不能有一个子集指向自己本身:no a:SubsetArrow|a.parent in a.children 除那些需要子集层次结构呈树状的约束,很少有约束;这使得此建模方法非常灵活。通常,约束在定义新集合和关系时很有用。例如,假设我们想对那些代表同类关系的弧分类:同类关 6系将对象在单一域内联系起来。能否将这个方法定义为一个新集合?(提示:首先定义一个从SetBox到SetBox的关系sup
17、er开始也许是最简单的;接着定义集合DomainBox;然后定义集合HomoArrow。)19.4.3 编号 19.4.3 编号 第三个模型描述昨天一讲中标记应用的一部分。它显示了样式单中为段落编号而存储的信息,但没有显示编号的赋值怎样自己对应到段落。也可以添加,但有一些棘手。域为:?Style:段落样式名的集合;?CounterType:计数器类型的集合(例如:阿拉伯字,字母,罗马字)?CounterValue:一个计数器可以取值的集合(如1,2,3,或a,b,c)关系为:?type:将样式名与它的已声明计数器类型关联;?initial:将样式名与它的已声明初始计数器值关联;?values:
18、将样式名与它的已声明初始计数器值关联;?follows:将某计数器值与它的下一个取值关联;?parent:将样式名与它的上层样式关联,例如段,可能是子段的上层。注意一个样式只能有一个父层样式。我们允许两个样式共享一个父层样式;例如,这允许在一个段落中有图形和子段落的独立编号,这里有一些约束:?一个样式计数器的初值必须在由此样式计数器的对等型给出的集合中。在标记中,由语法限制:即声明(例如,同时决定两者)。all s:Style|s.initial in s.type.values?一个样式不能是他自己的父层 7no s:Style|s=s.parent 这里有一些定义:?一个样式的子层对应着其
19、父层:all s:Style|s.children=s.parent?一个样式的根样式是祖先,它没有父层样式。all s:Style|s.root=r:s.*parent|no r.parent 19.5 总结 19.5 总结 图形表示法在课本中有更详细的描述。你会发现去年的6.170讲义会更有用处,在以下网址有一个包含内容列表的PDF文档。http:/sdg.lcs.mit.edu/dnj/publications.html#fall00-lectures 你可以在那里找到关于概念建模的更丰富的内容。文本符号被称为Alloy并由MIT的软件设计组(Software Design Group)设计开发。我们已经开发了一个Alloy的自动分析程序用以模拟和检验。如果你想了解更多信息,同样查看上面的公布页址,你会找到描述语言并用个案说明的论文。8