软件工程之路(9)

您所在的位置:网站首页 构件组件模块有哪些类型 软件工程之路(9)

软件工程之路(9)

2024-07-10 06:32| 来源: 网络整理| 查看: 265

构件级设计定义了数据结构,算法,接口特征和分配给每个软件构件的通信机制。

体系结构的第一次迭代完成后,就该开始构件级设计。在这个阶段,全部的数据和软件的程序结构都已经建立起来。其目的就是把设计模型转化为运行软件。

构件的概念

系统中某一定型化的,可配置的,可替换的部件,该部件封装了实现并暴露一系列接口。

(1)面向对象的观点

在面向对象软件工程环境中,构件包括一个协作类集合。从分析模型开始,详细描述分析类和基础类。

(2)传统观点

在传统软件工程环境中,一个构件就是程序的一个功能要素,程序由处理逻辑及实现处理逻辑所需的内部数据结构以及能够保证构件被调用和实现数据传递的接口构成。传统构件也称为模块。做为软件体系结构的一部分,它承担三个重要角色之一:

控制构件:协调问题域中所有其他构件的调用;问题域构件:完成部分或全部用户需求;基础设施构件:负责完成问题域中所需相关处理的功能。

传统的软件构件也来自于分析模型。以数据流图做为导出构件的基础。

(3)过程相关的观点

在设计过程中,可以使用已经过验证的设计或代码级构件的目录。当软件体系结构设计完后,可以从目录中选出构件或者设计模式,并用于组装体系结构。这些构件是根据复用思想来创建的,所以其接口的完整描述,要实现的功能和需要的通信与协作等对于设计者来说都是可以得到的。

 

设计基于类的构件

(1)基本设计原则

开关原则:The Open-Closed Principle,OCP,开放封闭原则,模块应该对外延具有开放性,对修改具有封闭性。采用一种无需对构件自身内部(代码或内部逻辑)做修改,就可以进行扩展(在构件所确定的功能域内)的方式来说明构件。

以SafeHome的对各种安全传感器进行状态检查的Detector类。如果内部采用分支结构来控制,那随着时间的推移,安全传感器的类型和数量不断增长,那需要对Detector类内部进行修改,增加内部逻辑以适应变化。这违背OCP原则。另一种设计为,各种传感器实现统一的接口,这个接口向Detector构件呈现一致的视图。那么如果添加新的传感器,那么因为Detector使用的传感器接口,则无需要任何改变。

Liskov替换原则:Liskov Substitution Principle,LSP,里氏替换原则。子类可以替换它们的基类。如果将子类传递给构件来代替基类时,使用基类的构件应该仍然能够正确完成其功能。LSP原则要求源自基类的任何子类必须遵守基类与使用该基类的构件之是的隐含约定。前置条件:构件使用基类前必须为真;后置条件:构件使用基类后必须为真。创建了子类时,这些子类须遵守前置条件和后置条件。

依赖倒置原则:Dependency Inversion Principle,DIP。依赖于抽象,而不依赖于具体实现。

接口分离原则:Interface Segregation Principle,ISP。多个用户专业接口比一个通用接口好。

另一些原则:

发布复用等价性原则:Release Reuse Equivalency Principle,REP。复用的粒度就是发布的粒度。

共同封装原则:Common Closure Principle,CCP。一同变更的类应该合在一起。

共同复用原则:Common Resue Principle,CRP。不能一起复用的类不能被分到一组。

(2)构件级设计指导方针

构件:对已经被确定为体系结构模型一部分的构件应该建立命名约定,并对其做进一步的细化和精化。

接口:提供关于通信和协作的重要信息。

依赖和继承。

(3)内聚性

内聚性描述为构件的专诚性,single-mindedness。在面向对象系统进行构件设计中,内聚性,cohesion,意味着构件或类只封装那些相互关联密切,以及与构件或类身身有密切关系的属性和操作。以下按内聚性级别排序

功能内聚:主要通过操作来表现,当一个模块完成一种只一种运算并返回结果时发生这个级别上的内聚。

分层内聚:由包,构件和类来表现,高层能够访问低层的服务,但低层不能访问高层的服务。

通信内聚:访问相同数据的所有操作被定义在一个类中,一般说来,这些类只着眼于数据的查询,访问和存储。

顺序内聚:将构件或操作按前者为后者提供输入的方式组合,目的在于实现一个操作的序列。

过程内聚:构件或操作的组合方式是,允许在调用前面的构件或操作之后,马上调用后面的构件或操作,即使两者之间没有数据进行传递。

暂时内聚:操作的执行是为了反映某一指定的行为或状态。

实用内聚:在一类里,但在其他方面不相关的构件,类或操作被分为一组。

(4)耦合性

耦合是类之间彼此联系程度的一种定性度量。在构件级设计中,一个重要的目标就是尽可能保持低耦合。

内容耦合:当一个构件暗中修改其他构件的内部数据,就会发生此种类型的耦合。

共用耦合:当大量构件都要使用一个全局变量时发生此种耦合。

控制耦合:当操作A调用操作B,并且向B传递了一个控制标记时,就会发生这种耦合。

印记耦合:当类B被声明为类A某一操作中的一个参数类型时会发生这种耦合。

数据耦合:当操作需要传递较长的数据参数时就会发生这种耦合。

例程调用耦合:当一个操作调用另一个操作时会发生这种耦合。

类型使用耦合:当构件A使用了在构件B中定义的一个数据类型时,会发生这种耦合。

包含或导入耦合:当构件A引入或包含一个构件B的包或内容时,发生这种耦合。

外部耦合:当一个构件和基础设施构件进行通信和协作时会发生这种耦合。

 

实施构件级设计

构件级设计的任务集:

(1)标识出所有与问题域相对应的设计类;

(2)确定所有与基础设施域相对应的设计类

在分析模型中没有描述这些类,在体系结构设计中也经常忽略这些类,但此时必须对它们进行描述。

(3)细化所有不能作为复用构件的设计类

详细描述实现类需要的所有接口,属性和操作。

在类或构件的协作时说明消息的细节;为每一个构件确定适当的接口;细化属性并且定义相应的数据类型和数据结构;详细描述每个操作中的处理流。

(4)说明持久数据源

(5)开发并且细化类或构件的行为表示

(6)细化部署图以提供额外的实现细节

(7)考虑每一个构件级设计表示

 

对象约束语言

对象约束语言,Object Constraint Language,OCL,通过允许软件工程师使用形式化的语法和文法构建各种设计模型元素,利用这些无歧义描述语句作为UML的补充。

最简单的OCL语言语句由四部分组成:

(1)语境:context,上下文。定义了哪些情况语句是正确的

(2)特性:property,描述语境的一些特征,如,语境是个类,那特征可能是一个属性

(3)操作:operation,用来操纵和限定一个特性,如算术运算

(4)关键字:keyword,用于说明条件表达式,如if

例如:

customer

       self.authorizationAuthority=’yes’

 

设计传统构件

所有程序都可以建立在一组限定好的逻辑构造之上,这一组逻辑构造强调了对功能域的支持,其中每一个逻辑结构有可预测的逻辑结构,从顶端进入,从底端退出。这些逻辑构造包括顺序型,条件型,重复型。

(1)图形化设计表示

活动图可以让设计者表示顺序,条件和重复构造,它由流程图派生而来。

(2)表格式设计表示

决策表提供一种表示方法,可以将动作和条件翻译成表格,该表格很难被误解,且能作为某一个表驱动算法的机器可识别的输入。决策表分四部分,左上部列出所有条件,左下部列出所有可能的动作,右半部构成了一个矩阵,表示条件的组合以及特定条件组合对应的动作,因此矩阵的每一列可以解释成一条处理规则。

开发决策表的步骤:

列出特定过程或模块相关的所有活动;

列出执行该过程时的所有条件或所做的决策;

将特定的条件组合与特定的动作相关联,消除不可能的条件组合或找出所有可能的条件排列;

定义规则,指出一组条件应对应哪个或哪些动作。

(3)程序设计语言

程序设计语言:Program Design Language,PDL,也称结构化的英语或伪码,是一种混合语言,采用一种语言的词汇和另一种语言的语法。

PDL看起来像现代的编程语言,但PDL允许在自身的语句间嵌入叙述性的文字,由于在语法含义的结构中嵌入了叙述性文字,它不能被编译,但使用工具可以将PDL翻译成程序设计语言的骨架或设计图形表示,并生成嵌套图,设计操作索引,交叉引用表以及其他一些信息。 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3