关于UML 2.5.1中Classifier::directlyUsedInterfaces()的OCL实现疑问
UML 2.5.1中Classifier::directlyUsedInterfaces()的实现修正方案
问题背景
在UML 2.5.1规范第177页的Classifier类9.9.47“Operations”章节中,directlyRealizedInterfaces()操作的定义和实现是有效的:
directlyRealizedInterfaces() : Interface [0..*] The Interfaces directly realized by this Classifier body: (clientDependency->select( oclIsKindOf(Realization) and supplier->forAll(oclIsKindOf(Interface))))-> collect(supplier.oclAsType(Interface))->asSet()
该操作可以正常实现(比如在C++中),因为Classifier的基类NamedElement定义了clientDependency属性,能直接获取以当前Classifier为client的依赖关系。
但同章节的directlyUsedInterfaces()操作存在实现问题:
directlyUsedInterfaces() : Interface [0..*] The Interfaces directly used by this Classifier body: (supplierDependency->select( oclIsKindOf(Usage) and client->forAll(oclIsKindOf(Interface))))-> collect(client.oclAsType(Interface))->asSet()
问题在于NamedElement中并不存在supplierDependency属性,推测这是规范旧版本遗留的定义。
可行的修正方案
完全可以仿照NamedElement::clientDependency()的实现逻辑,将其中的client替换为supplier来实现directlyUsedInterfaces()。
修正后的OCL实现如下:
directlyUsedInterfaces() : Interface [0..*] The Interfaces directly used by this Classifier body: (Dependency.allInstances()->select(d | d.supplier->includes(self) and d.oclIsKindOf(Usage) and d.client->forAll(oclIsKindOf(Interface))))-> collect(client.oclAsType(Interface))->asSet()
这个实现的逻辑是:遍历所有Dependency实例,筛选出以当前Classifier为supplier、类型为Usage,且所有client都是Interface的依赖,最后收集这些依赖中的Interface并去重,完全符合directlyUsedInterfaces()的语义。
内容的提问来源于stack exchange,提问作者Robert Hairgrove
相关产品推荐
相关产品推荐

