级别: 中级 Steve Arnold, 技术顾问, IBM
2008 年 1 月 03 日 大型模型,就像代码的主体,会随着时间而恶化。对模型做出大量的变更,最终将会影响其自身,使变更和理解变得更加困难。通过有规律地分析模型矩阵,可以很好地维持模型良好的状态,并确保模型坚固而成型完美的结构。这篇文章描述了如何在 IBM® Rational® Software Modeler, IBM® Rational® Software Architect, 或者 IBM® Rational® Systems Developer 中利用 Model Metrics Analysis 视图来分析模型并发现潜在的问题区域,比如带有很多从属或者依赖的类。
Model Metric Analysis Plug-in 概述
IBM® Rational® 软件的 Model Metric Analysis Plug-in 能够让你快速 获得模型的略图,并查明模型中可能发现问题的区域。通过快速并将它们在报告视图和分配视图中展示,你可以在很短的时间内查出模型中有疑问的区域。图 1图解了这个矩阵信息显示的清晰内容。
图 1. Distribution 和 Details 视图
这些视图能够让任何人只需看一眼就可以明白潜在的问题区域。每个项目或者企业的全体职员都可以利用参数选择的显示屏来为任何一个矩阵的错误阈值提出警告,然后这些阈值就可以在小组成员中进行共享。
模拟分析法还会为绝大多数模型元素产生 Kiviat 图,如图 1 中所显示的那样。这样还允许模型构建者为这个元素查看搜集的所有矩阵,从而确定它仅仅是一个有问题的矩阵或者这个元素是否在几个方面得分都很不理想。
 |
关于 Kiviat 图
一个 Kiviat 图会因为一个元素呈现几个不同的值或者矩阵,并将它们显示在一个单独的图中。
每个矩阵都会标上它自己的轴,这些点汇聚起来组成一个图形。在这个图形中这些值会超出它们的公差或者起点,这些点也会被标注或者着色来突出它们的差异。
这图的形式可以使一个元素的多个值或者多个矩阵一眼扫尽,它为这个元素的当前状态提供了一个整体的观点。例如,你可能对一个元素属性的数量,操作的数量,以及从属的数量比较感兴趣。查看一个图的所有信息可以帮助你确定一个能够考虑多方面的决定,看是否有问题存在。
|
|
图 2. Kiviat 图
这个 Model Metric Analysis Plug-in 有助于自动发现尽可能多的问题。绝大多数提供的矩阵都已经钩入 IBM® Rational® Software Delivery Platform 确认框架。这意味着无论模型是否已经生效,都会对这个矩阵进行求值,同时为任何一个元素产生一个模型警告,并且超越特殊矩阵当前的警告水平。最后,这个 Model Metric Analysis Plug-in 可以产生一个脱机的 HTML 报告,它可以用在模型核查中,或者高级构架师用它核查以确保当前设计中没有任何问题。
插件程序的安装
直接安装 Model Metric Analysis Plug-in。
- 下载这篇文章中的可靠性,有效性以及适用性 (RAS) 文件(请看Downloads) 在你的硬件驱动上进行定位。
- Start Rational Software Modeler (或者 IBM® Rational® Software Architect 或者 IBM® Rational® Systems Developer),选择File > Import。
- 选择RAS > RAS Asset,并点击Next
- 浏览下载的 RAS 文件并接受关于可配置插件程序的警告。
- 点击Next。
- 选择这个特性,接受许可协议,然后点击Finish。
- 当出现提示时,重新启动使这个插件程序生效。
现在切换到Modeling透视图,你应该看到这个 Model Metric Analysis 视图 (图 3)。如果它是不可见的,你可以从列表中选择Window > Show View > Other并选择Modeling > Model Metric Analysis从而打开它。
图 3. Model Analysis 视图
插件的使用
你可以利用 Model Analysis 视图对你的模型进行交互式分析。
交互式分析
Model Analysis 视图能够为你的每一个模型产生矩阵,然后要么在详细的报告中要么在分配图中对它们进行查看。这个视图还为观察模型中特殊元素的多种矩阵提供了 Kiviat 图。你还可以产生一个矩阵报告,报告中包括所有不同矩阵的页面,还包括所有适当元素的 Kiviat 图。
让我们浏览一下分析一个模型所需要的步骤。
- 第一步是产生一些矩阵。
- 确保你想要分析的模型已经打开,然后在 Model Analysis 视图顶部的下拉框中选择它。
- 你要么只选择你想要搜集的矩阵,要么在需要选择所有时右键点击这个矩阵列表然后选择Select All。
- 按住这个搜集矩阵按扭
或者右键点击并选择Gather Metrics。
你可以在每个矩阵的右侧看到更新的值,标志着矩阵的总数和平均数,如图 4所示。
图 4.分析一个模型
- 接下来,你需要分析这个矩阵。你可以从这三个视图中挑选:详细资料,一个分布曲线,以及一个 Kiviat 图。下面的小单位对他们单独进行了描述,附带有其它选项。
Distribution Graph 视图
当你要在这个矩阵列表中选择一个单独的矩阵时,这个分布曲线将显示有一个特殊矩阵值元素的数量。你可以用这个曲线很快明了任何一个矩阵是否存在一定的问题。色彩标记的工具条是用来突出有警告或者错误水平值的,如图 5所示。
图 5. Distribution Graph 视图
Details 视图
此外,当你在这个矩阵列表中挑选一个单独的矩阵时,这个视图将为这个被选择的矩阵列出所有的元素以及它们的值。色彩标记的列表是用来突出警告和错误的。你可以通过点击标题来进行挑选,你还可以中通过右键点击并选择Open in Model Explorer(请看图 6)从列表导航到这个项目浏览器中的元素。
图 6. Details 视图
Kiviat 图视图
Kiviat 图为这个特殊的元素显示了很多矩阵。这是了解你所关注的这个特殊元素详细资料的最好方法。
- 首先,在这个矩阵列表中,你选择了你想看到的这个矩阵(你必须至少选择三个)。
- 然后,在 Kiviat 图视图 (图 7) 中,你要从这个下拉框列表中选择你所感兴趣的这个元素,这时 Kiviat 图也会被绘出。
如果这个矩阵中的任何一个出现了警告或者错误,Kiviat 图都会显示适当的颜色。
图 7. Kiviat Diagram 视图
Metric 参数
每个矩阵的阈值都是通过 Preferences 对话框来控制的。这样允许你跨越项目强制执行标准,并且快速确定一个模型是否与那些标准相符合。这个参数允许使用色彩配置来突出不同的水平,同时还能标明每个矩阵中警告或者错误的阈值。你可以在Window > Preferences > Modeling > Model Metric Preferences(图 8)中找到这些参数。
图 8. Metric 参数
确认规则
这样可以更容易地鉴定模型中的问题,矩阵和简名规则会构建在这个确认框架中。这意味着一旦模型没确认,任何超过警告阈值的矩阵都会被报告出来。你可以通过修改Window > Preferences > Modeling Validation > Constraints(图 9)中的确认参数对包含于这个确认中的矩阵进行控制。
图 9. 确认规则
报告
这个插件程序提供了一个报告机制,你可以在脱机时用它来分析结果或者将矩阵发表为 HTML 格式。根据这些步骤产生一个报告:
- 首先,为你所感兴趣的模型产生一个矩阵。
- 在Model Analysis视图的工具条上,点击 Reporting 按扭
。
- 你将看到一个提供位置的提示,在短暂的延迟之后,这个报告将会打开,上面显示着每个矩阵的页面以及每个元素 Kiviat 图的单独页面 (图 10)。
图 10. 报告案例
扩展的插件程序
Model Metric Analysis Plug-in 利用 Eclipse 扩展点机制来提供每个矩阵。因此,如果你愿意可以很容易地添加你自己的模型。
扩展点计划和案例
列表 1. 扩展点计划
<element name="extension">
<complexType>
<sequence>
<element ref="metric"/>
</sequence>
<attribute name="point" type="string" use="required">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="id" type="string">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
<attribute name="name" type="string">
<annotation>
<documentation>
</documentation>
</annotation>
</attribute>
</complexType>
</element>
<element name="metric">
<complexType>
<attribute name="class" type="string" use="required">
<annotation>
<documentation>
</documentation>
<appInfo>
<meta.attribute kind="java"
basedOn="com.rsxplugins.views.modelanalysis.core.IMetric"/>
</appInfo>
</annotation>
</attribute>
</complexType>
</element>
|
列表 2 是一个探究这个插件程序文件的矩阵扩展点宣言的案例。
列表 2. 一个矩阵扩展点声明的例子
<extension
id="com.ibm.uk.views.metrics.NumberOfClassAttributes"
name="com.ibm.uk.views.metrics.NumberOfClassOAttributes"
point="com.ibm.uk.views.modelanalysis.MetricProvider">
<metric
class="com.ibm.uk.views.modelanalysis.metrics.ClassAttributesMetric">
</metric>
</extension>
|
IMetric 界面
显示在列表 3中的 IMetric 界面必须被执行并且在这个扩展点宣言中被引用。
列表 3. IMetric 界面
public interface IMetric {
public String getName();
public String getShortName();
public String getHtmlReportName();
public boolean isApplicable(NamedElement element);
public MetricResult[] getMetrics(NamedElement element);
// threshold methods
public void setDefaultPreferences();
public int getWarningThreshold();
public int getErrorThreshold();
public void setWarningThreshold(int value);
public void setErrorThreshold(int value);
}
|
列表 4. 执行 Number of Class Attributes 矩阵的代码案例
public class ClassAttributesMetric extends AbstractMetricAndModelConstraint{
public ClassAttributesMetric() {
super();
}
public String getName() {
return "Attributes per Class";
}
public boolean isApplicable(NamedElement element) {
boolean ok = false;
if ( element instanceof Class)
{
ok = true;
}
return ok;
}
public MetricResult[] getMetrics(NamedElement element) {
ArrayList results = new ArrayList();
if (isApplicable(element))
{
if (element instanceof Class)
{
Class theClass = (Class)element;
int attrCount = theClass.getOwnedAttributes().size();
results.add(new MetricIntResult(this,theClass,attrCount));
}
}
return (MetricResult[]) results.toArray(new MetricResult[results.size()]);
}
//
// Preferences API's
//
public void setDefaultPreferences()
{
IPreferenceStore prefs = ModelAnalysisPlugin.getDefault().getPreferenceStore();
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
prefs.setDefault(MetricPreferences.CLASS_ATTRIBUTE_METRIC_WARNING_THRESHOLD,10);
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
prefs.setDefault(MetricPreferences.CLASS_ATTRIBUTE_METRIC_ERROR_THRESHOLD,20);
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
}
public int getWarningThreshold()
{
IPreferenceStore prefs = ModelAnalysisPlugin.getDefault().getPreferenceStore();
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
return prefs.getInt(MetricPreferences.CLASS_ATTRIBUTE_METRIC_WARNING_THRESHOLD);
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
}
public int getErrorThreshold()
{
IPreferenceStore prefs = ModelAnalysisPlugin.getDefault().getPreferenceStore();
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
return prefs.getInt(MetricPreferences.CLASS_ATTRIBUTE_METRIC_ERROR_THRESHOLD);
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
}
public void setWarningThreshold(int value)
{
IPreferenceStore prefs = ModelAnalysisPlugin.getDefault().getPreferenceStore();
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
prefs.setValue(MetricPreferences.CLASS_ATTRIBUTE_METRIC_WARNING_THRESHOLD,value);
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
}
public void setErrorThreshold(int value)
{
IPreferenceStore prefs = ModelAnalysisPlugin.getDefault().getPreferenceStore();
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
prefs.setValue(MetricPreferences.CLASS_ATTRIBUTE_METRIC_ERROR_THRESHOLD,value);
|-------10--------20--------30--------40--------50--------60--------70--------80--------9|
|-------- XML error: The previous line is longer than the max of 90 characters ---------|
}
// validation methods
public IStatus validate(IValidationContext context) {
return super.validate(context);
}
public String getHtmlReportName() {
return "AttributesPerClass.html";
}
public String getShortName() {
return "APC";
}
}
|
总结
Model Metric Analysis Plug-in 通过给你这些额外的性能帮助你维护和管理高质量模型:
- 模型的交互式分析和问题的确认
- 通过对模型确认框架额外添加40多个矩阵和规则可以自动发现存在的问题
- 通过发表的模型矩阵报告可以脱机审核模型
下载 | 描述 | 名字 | 大小 | 下载方法 |
|---|
| Deployable RAS file | model_analysis_v2.0.1.ras | 1624KB | HTTP |
|---|
参考资料 学习
获得产品和技术
讨论
关于作者  | |  | Steve 是在英国 IBM Rational 工作的一位高级技术顾问,他已经在那工作了六年。他的专业领域是 UML 设计和驱动模型构架,另外他对 Eclipse and Rational 产品扩展有很浓厚的兴趣。 |
对本文的评价
|