构件
Aaron · 2010-08-06 19:38 · 35297 次点击
构件是系统中实际存在的可更换部分,它实现特定的功能,符合一套接口标准并实现一组接口。构件代表系统中的一部分物理实施,包括软件代码(源代码、二进制代码或可执行代码)或其等价物(如脚本或命令文件)。在图中,构件表示为一个带有标签的矩形。
使用
设计中的类和对象被作为部署构件进行实施。您需要确定如何将设计类映射为代码;这应该在项目专用的设计指南中有所说明。
有关如何将设计类映射为代码的详细信息,请参见活动:实施构件。另请参见指南:类。
实施构件与修改构件在项目的配置管理环境中进行。实施员在为他们提供的专用开发工作区(请参见活动:创建开发工作区)中,按照工件:工作单所指定的内容开展工作。在该工作区中,创建源元素并将其置于配置管理之下,或者在通常的检%8D%95%E5%85%83%E6%B5%8B%E8%AF%95"target="_new"class=innerlink>单元测试、检入周期中进行修改(请参见活动:进行变更)。完成某个构件集(根据一个或多个工作单的定义以及即将生成的工作版本要求)后,实施员将把有关新的和修改过的构件交付(请参见活动:交付变更内容)到子系统集成工作区,以便与其他实施员的工作进行集成。最后,实施员可以在方便的时候对专用开发工作区进行更新(或者重新调整基线),使该工作区与子系统集成工作区保持一致(请参见活动:更新工作区)。
当实施类时,应遵循编程指南。
实施的主要基础是具有公有操作、属性与关联关系的类。务必要注意,并不是所有公有操作、属性与关联关系都在设计过程中定义。
实施的辅助基础是用例实现,用例实现显示了类和对象如何通过交互来执行用例。
最好以递增的方式实施类;编译、链接和运行一些回归测试,每天进行三两次。
在从零开始实施一个类之前,可考虑修改现有的实施类(一般可通过建立子类或进行实例化来修改)。
实施操作
要实施操作,请执行以下步骤:
选择算法
选择适合算法的数据结构
根据需要定义新的类和操作
编写操作代码
选择算法
许多操作都十分简单,可以从该操作及其规约中立即实施。
之所以需要特殊算法,主要是为了实施定义了规约的复杂操作,并优化那些以简单但却低效的算法为定义的操作。
选择适合算法的数据结构
选择算法包括选择算法所基于的数据结构。许多实施数据结构是容器类,例如数组、列表、队列、栈、集合、无序单位组,以及这些类的各种不同形式。许多面向对象的语言和编程环境都提供了具有这些可复用构件的类库。
根据需要定义新的类和操作
比如,可以使用新类来保存中间结果,也可对类添加新的低级操作来分解复杂操作。通常,这些操作是类的私有操作,所以在类之外看不见这些操作。
编写操作代码
要编写操作的代码,可从接口语句开始,例如C++中的成员函数声明、Ada中的子程序规约或VisualBasic中的方法。请遵循编程指南。
实施构件工作流程明细
data/attachment/portal/201111/06/151720k303h0qkpjjg2kzk.gif
实施状态
对象的状态可通过引用其属性值来实施,而不必作特殊说明。这种对象的状态转移将隐含于变化的属性值中,而变化的行为通过条件语句来编程。但对于复杂行为,该方法不能令人满意,因为它往往会导致复杂的结构;而当添加更多状态或当行为发生变化时,将很难更改这些结构。
如果构件(或其组成部分)的行为随状态而定,则通常会有一个或多个状态图来说明组成该构件的模型元素的行为。这些状态图可用作实施过程中的重要输入。有关详细信息,请参见指南:状态图。
状态图中所示的状态机将表现对象的状态,并详尽说明状态转移及所需的行为。可以通过以下几种方法来实施状态机:
对于简单的状态机,定义一项列举可能状态的属性,然后使用该属性在Java或C++中的switch语句中选择进入消息的行为。但这种方法不太适用于复杂的状态机,它可能会导致运行时性能降低。如需此方法的示例,请参见【DOUG98】,第4章4.4.3
对于较复杂的状态机,可使用状态模式。有关状态模式的说明,请参见【GAM94】。【DOUG98】,第6章6.2.3状态模式也说明了这种方法
表驱动法对于极复杂的状态机十分有效,其特点是易于变更。当使用这种方法时,各个状态在表中都有相应的条目,这些条目将输入映射到后继状态和相关的转移动作。如需此方法的示例,请参见【DOUG98】,第6章6.2.3状态表模式。
要实施具有并行子状态的状态机,可以将状态管理委派给主动对象(每个对象都被委派一个并行子状态),因为并行子状态代表了独立的计算(但仍可能进行交互)。每个子状态均可通过上述方法之一来进行管理。
通过委托关系复用实施
如果一个类或一个类的某些部分可通过复用现有类来实施,则应通过委托关系(而不要继承)来实现。
委托表示一个类借助于其他类来得以实施。该类通过使用变量来引用其他类的对象。当调用某操作时,该操作将调用被引用对象(属于被复用的类)中的操作,以实际执行该操作。这样,它就将职责委派给了其他类。
实施关联关系
单向关联关系将作为指针(包含对象引用的属性)来进行实施。如果多重性为一,则将单向关联关系当作简单指针来实施。如果多重性为多个,则将其当作指针集来实施。但如果“多”端是有序排列的,则可以使用列表,而不使用集合。
双向关联关系将作为属性,使用单向关联关系的技术在两个方向上实施。
限定关联关系将作为限定对象中的查询表(如一个SmalltalkDictionary类)来实施。查询表中的选择器值是限定词,而目标值是另一个类的对象。
如果必须按顺序访问限定词的值,就应将限定词组织成经过排序的数组或树。在这种情况下,访问时间将与logN成比例,其中N为限定词值的数目。
如果限定词取自于一个紧凑的有限集,就可以将限定词的值映射到一个整数范围,并将关联关系当作数组来有效地进行实施。如果关联关系已基本上填满(而不是稀疏填充),此方法会更加有效;而对于完全填满的有限集,它可以算是理想的方法。
许多面向对象的语言和编程环境都提供了具有可复用构件的类库,可用于实施不同种类的关联关系。
实施属性
可以作为内置基本变量、可复用的构件类或定义一个新类来实现属性。定义新类通常是较为灵活的方法,但它却会带来不必要的间接性。例如,实施雇员的社会保障号时,既可将它作为类型“字符串”的属性,也可将它作为一个新类。
data/attachment/portal/201111/06/151721ftc8fj9l0ccwnhfh.gif
属性的备选实施。
另一种可能的情况是:属性组组成了新类,如下例所示。这两种实施都是正确的。
data/attachment/portal/201111/06/151721efbw5embbwbooobb.gif
将Line中的属性当作Point类的关联关系来实施。
向设计提供反馈
在以上任何步骤中,如果发现了设计错误,都必须向设计提供返工反馈。如果所需的变更较小,就可以由同一个人来设计并实施类,而无需提出正式的变更请求。他可在设计中进行变更。
如果所需的变更影响到几个类(例如在公有操作中的变更),则应向CCB(变更控制委员会)提交正式的变更请求。请参见活动:修复缺陷。
评估代码
在开始单元测试之前,可以先作一些检查。测试是一项花费较多的工作,因此最好先执行以下几项检查:
始终对代码进行编译。将编译器的警告等级设置到最详细的程度。
通过想像对操作进行检查。通读代码,尽可能考虑到所有情况,发现各种异常情况。一旦进行了新的实施活动,就需进行此项工作。
使用工具检查代码中是否存在错误。例如,使用静态代码规则检查程序。