1、面向对象的分析的局限
首先,让我们来考察一下面向对象的分析方法(OOA)。软件工程领域的研究者们提出了许多OOA的方法,比较著名的有Boohc,Jaeobson’5oosE,uRmbaugh’5OM工Fusion,Coad一oYurdon等。这些中的每一个都是一套完整的方法。每一种都有自己的优点和缺点。简单的说,Boohc方法在设计和建造阶段特别有效,OOSE为需求分析和高层设计提供了杰出的支持。我们来考察Coad的OOA方法。第一步,标识对象。从问题空间、文字资料和图片资料入手,寻找结构、其它系统、设备、记住的事件、扮演的角色、地点及组织单元,考虑需要的记忆、需要的服务、公共属性、公共服务及基本需求,剔除不必要的记忆或服务、单个的实例和派生的结果,用单个名词或形容词+名词来命名。第二步,标识结构。分类结构表示类一成员组织,反映通用性一专用性。组装结构表示聚合,反映整体和组成部分。把每一个对象考虑成通用的,然后再考虑成专用的,可以标识出分类结构。把每一个对象考虑成一个整体,然后再考虑成一个组成部分,可以标识出树状结构。第三步,标识主题。对每一个结构增加一个相应的主题,对每一个对象增加一个相应的主题,如果主题个数超过7个左右,则进一步精简主题。第四步,表示属性。检查问题空间,将现实中的对象与实际表述该对象的属性联系起来。在分类结构中,公共的属性放在结构的高层,特殊的放在低层。标识和定义实例连接。增加实例连接线;反映问题空间的对应关系;努力获得最少的必要的连接集合。第五步,标识服务。首先表示基本服务—发生(增加、修改、删除和选择)、计算和监视服务。然后标识附加服务,使用两种方法:1、对象生命历程—定义基本序列,检查每一步的演变,增加服务;2、状态一事件一响应—定义主要的系统状态,列出外界事件及所需要的响应,扩充服务和消息连接。标识消息连接。对己经存在实例连接的实例增加消息连接,然后,检查一个实例需要另一个实例所做的处理,寻找额外的消息连接。因此,Coad认为从稳定性最高的对象开始分析,最后再分析系统的功能有助于适应需求的变化。但是,这种方法在一定情况会出现一定局限性。问题在于,前四步产生了一个现实世界的模型,但并未考虑系统的功能。在第五步时,系统的整体的功能要被分解为对象和对象之间的操作来完成。当系统的功能比较简单时,这种分解依靠经验可以较好的完成。但当系统属于以下几种情况时,这种分解会变得十分困难。1、系统功能非常复杂;2、系统存在多个目标;3、系统拥有一定的智能;4、并行系统。系统功能非常复杂,通常来说,此功能涉及对象众多,操作繁杂。因此难于分解,而一个给定的分解是否能完成所需的功能也难于验证。若系统存在多个目标,就存在多个目标之间的竞争问题。如两个目标分别要求同一对象提供服务。这时,这种分解就难以进行。当系统拥有一定智能,这种智能将表现出一定的主动性,即系统会“主动”进行某些操作。而前四步所确定的对象均为问题空间的对象的抽象,因此系统中没有出现主动的动机。另外,由于在考虑对象属性时还未考察其功能,因此很难确定其属性。
2、AOA的方法
我们在分析中用e概念来封装功能。每一项功能由一个e来映射。e具有以下特性:l、e拥有资源,包括用以完成功能的对象,CPu等;2、Agent了解完成功能所需要的步骤;3、Agent可以拥有与其它Agent之间通讯的能力;4、如果需要,Agent可以应用人工智能的技术。作者在Coad的方法的基础上进行改进,引入Agent的概念。第一步,标识对象。从问题空间、文字资料和图片资料入手,寻找结构、其它系统、设备、记住的事件、扮演的角色、地点及组织单元,考虑需要的记忆、需要的服务、公共属性、公共服务及基本需求,剔除不必要的记忆或服务、单个的实例和派生的结果,用单个名词或形容词+名词来命名。第二步,标识结构。分类结构表示类一成员组织,反映通用性一专用性。组装结构表示聚合,反映整体和组成部分。把每一个对象考虑成通用的,然后再考虑成专用的,可以标识出分类结构。把每一个对象考虑成一个整体,然后再考虑成一个组成部分,可以标识出树状结构。第三步,标识主题。对每一个结构增加一个相应的主题,对每一个对象增加一个相应的主题,如果主题个数超过7个左右,则进一步精简主题。在主题层分出主题和它们之间的消息连接。第四步,标识Agent。若系统功能简单,不存在并行问题,则可以略过本步和第五步第六步,本方法退化为Coad方法。否则,标识出系统的Agent。可以使用如下方法标识系统gAent的候选者。首先,考虑系统的目标,即系统要做什么。一个复杂的系统的目标通常不止一个。系统的每一个目标都是gAent的候选者。其次,考虑系统中是否存在相互协作或竞争的因素。这种因素也是Agent的候选者。第三,考虑系统中是否存在并行成分。每一个并行成分都是gAent的候选者。第四,考虑系统中是否有人工智能的成分。可以将人工智能的部分作为Agent的候选者。有了候选者之后,要对这些候选者进行筛选。筛选的最主要的标准就是该功能是否具有主动性。即它是否有自己独立的目标,并在没有外来动力的情况下来完成任务。例如,对一个字处理软件来说,定期自动保存文档就是一个主动的任务,而保存文档就是一个被动的任务。其次,该功能是否可以与其它功能并行。如果它只能和其它某个功能串行完成,则其很可能是那个功能的子集。筛选后的功能作为系统的gAent。通常,我们可以用功能的执行者来命名Agent。如Autosaver或AutosaveAgent。第五步,标识每个Agent相关的对象。对于每一个Agent,考虑为了完成该功能必须拥有的资源。在第一步中标识出的对象中找出那些对象是完成本功能所必须的。如果出现所需的对象不在第一步中标识出的对象中,则需要重返第一步。标识完所有Agent的相关对象之后,如果存在这样的对象,它不与任何一个功能相关,则可以考虑去掉该对象。第六步,标识每个功能的工作序列。对于每一个Agent,考虑为了完成功能所要进行的步骤。这通常要从用户那里得到相关的知识。同时,要考虑完成该步骤所必须的资源,必要时返回第五步。第七步,标识对象属性。检查问题空间,将现实中的对象与实际表述该对象的属性联系起来。在分类结构中,公共的属性放在结构的高层,特殊的放在低层。标识和定义实例连接。增加实例连接线;反映问题空间的对应关系;努力获得最少的必要的连接集合。考察与该纯ent相关的功能,根据对象在功能中的作用筛选对象的属性。第八步,标识对象服务。首先表示基本服务—发生(增加、修改、删除和选择)、计一算和监视服务。然后标识附加服务,使用两种方法:1、对象生命历程—定义基本序列,检查每一步的演变,增加服务;2、状态一事件一响应—定义主要的系统状态,列出外界事件及所需要的响应,扩充服务和消息连接。标识消息连接。对己经存在实例连接的实例增加消息连接,然后,检查一个实例需要另一个实例所做的处理,寻找额外的消息连接。考察与该对象相关的gAent,根据对象在其功能中的作用筛选对象的服务。应当注意到,AOA的方法是在OOA的基础上改进得到的,而其产生的模型也不是与OOA的分析模型完全不同的模型。它是对00A的模型的一种扩展。