四、 示例4-添加继承
在最后的示例中,我从一个Node类继承了结点实例。以前,我们每次只分析一个结点并对其进行遍历。Node实例描述了存在于UML结点和硬件之间的关系。Nodes给了我们一种从实例中抽象出公共元素的方法。
为此,有两种不同的方法。第一种方法是使用Nodes来描述一个通用硬件平台。可以设想这样的情形:我为一家公司工作,该公司想针对它们所有的方法(多么奇怪!)订购相同的计算机配置。可以用一个结点来描述典型的计算机配置,然后该结点又会有多个结点实例。这将节省大量的输入时间!另外一种方法是在软件架构师通知基础构件小组怎样分发组件的情形。该结点用针对于每个层的本地名字来描述不同的层。至于这些如何映射到实际的硬件是由结点实例所决定的而且由基础构件小组所创建。
在该示例中(见图6),我展示了一个通用结点-"Fleet Management",它具有可以添加到它上面的组件。在一个多层系统中,Fleet Management是由软件架构师来定义成一个分离的层。为了说明问题,我可能还要应用"Purpose"标签。我有两个结点实例,"Trucks"和"Persons",它们由基础构件小组来定义以把该层分成两个方法。既然"Trucks"和"Persons"是完全不同的两个域,那么架构师介入其中并分解之是十分安全的。方法名字上还标记有":Fleet Management",以指明它们是在Fleet Management结点中实现的。
 图6.Trucks与Persons结点实例都继承自Fleet Management结点。 |
在这个示例中,没有用于继承的标签,但是可能在另外的图上存在一些其它关系-它们会连接到该结点实例上。
我又一次重构了main程序以打印出所有的,包括每一个结点实例派生的(tNode.classname)结点标签,还有结点的ID(tNode.classifier)。
public static void Main(string[] args) { Hashtable mainHash; IDictionaryEnumerator ienum; Node tNode; string name = ReadString("Please enter the XMI filename : "); NodeParse np = new NodeParse(name); mainHash = np.getNodes(); ienum = mainHash.GetEnumerator(); while (ienum.MoveNext()){ tNode = (Node)ienum.Value; System.Console.WriteLine("Node = " + tNode.name); //Add "if (tNode. != null)" for each Writeline() System.Console.WriteLine(" CPU = " + tNode.CPU); System.Console.WriteLine(" DiskSize = " + tNode.DiskSize); System.Console.WriteLine(" MemorySize = " + tNode.MemorySize); System.Console.WriteLine(" Purpose = " + tNode.Purpose); System.Console.WriteLine(" Notes = " + tNode.Notes); System.Console.WriteLine("Node refers to = " + tNode.classname); System.Console.WriteLine("Node addr is " + tNode.classifier); System.Console.WriteLine(); } System.Console.ReadLine(); } |
类名和类标志符指明该结点实例继承自哪些结点。在XMI中,这是被象一个模板(就象一个封装在结点元素中的元素)一样描述的。
现在我将使用一个开关语句来检查"ModelElement.taggedValue",而代之以ModelElement.Stereotype,查找"TaggedValue"元素(存在类名和类标志符上皆独立的元素),并把它们添加到结点对象上。在此,我再次使用了分析idiom。这些代码可以在列表3中找到。

图7.Trucks和Persons:示例4的最后输出,Trucks和Persons各有一个它们可以参考的结点并且每个结点都有一个唯一的ID。
图7显示示例4最后的输出。
五、 总结
在本文中,我讨论了可以从图中读取硬件资产的方法。还讨论了读取名字、模板、属性以及读取结点之间及结点实例(继承)之间的关系。尽管我没有给出把这种信息放入数据库中的显式代码,我将在后面的文章中讨论这些技术-当然不止是添加信息到数据库中。
查看本文来源