如何在类图中标注设计模式(二)

194 篇文章 12 订阅
189 篇文章 394 订阅

接文章《如何在类图中标注设计模式(一)》。

本文姗姗来迟,见谅!吐舌头 

 

       5.  基于标记的模式标注

       美国德克萨斯大学达拉斯分校的Jing Dong等人提出了一种基于标记的模式标注方法(Tagged Pattern Notation)。该方法通过向原有结构图中附加标记值(Tagged Value)的方式来对模式信息进行标注,每一个类可使用“{pattern[instance]:role}”的方式来描述,例如“{Adapter[1]:Target}”表示该类在第一个适配器模式实例中充当抽象目标类角色。如果不存在模棱两可的情况,可以对描述方式进行简化,例如某个类只出现在某个模式的唯一实例中,则可简化为“{pattern:role}”,如果某个类只与一个模式的一个实例相关,则可进一步简化为“{role}”。在这种标注方法中,可以加入多个标记值来对同时充当多种模式的某一角色的类进行标注;在标注时没有增加一些额外的符号和线段,因此没有给结构图的复杂度带来太多影响;此外,该方法还可以标注属性、方法等细节信息,这是目前最好的模式标注方法之一,如图6所示。但是该方法也存在一些问题,很多已有的CASE工具不能够方便地增加标记值,需要通过编程来扩展它们的功能,加大使用的难度;此外,它没有提供一种在源代码中标注模式信息的方式,如果开发人员希望在实现过程中记录模式信息,该方法尚未提供相应的标注方案。

 

 

 (偶不知道Jing Dong同志用啥工具画的此图,我用Visio画的,画得好辛苦,哭,找了好几个工具,发现都没有办法增加Tagged Value,郁闷啊!大哭

个人观点:该方法不太复杂,但是貌似很多CASE工具增加标记值都不是特别方便!

 

       6.  基于UML Profile的模式标注

       基于UML Profile的模式标注方法(A UML Profile for Design Patterns Notation)也是由Jing Dong(真是牛人啊,弄出这么多方法,据此还发了几篇不错的文章,有TSE哦,微笑等人提出来的,该方法结合了UML的两种扩展机制:衍型(Stereotype)和标记值(Tagged  Value),在该方法中,使用衍型<<PatternClass>>来标注某个类是设计模式的一部分,使用衍型<<PatternAttribute>>来标注某个属性是设计模式的一部分,使用衍型<<PatternOperation>>来标注某个方法是设计模式的一部分;然后再使用标记值对上述三种衍型进行详细的描述,对于类而言,标记值的格式为{role@pattern[instance]}[1..*],role表示模式角色名,pattern表示设计模式名,instance表示实例编号,[1..*]表示这种标注格式对于一个类来说可以重复1次或多次(一个类可以在多个模式实例中充当相应的角色),对于方法和属性而言,标注方法与类的标注方法相似。使用基于UMLProfile的模式标注方法的标注实例如图7所示。

 

(偶一直未能找到一个UML Profile的最恰当的翻译)

个人观点:该方法还是略为有点复杂,包含了一些重复信息,图会变得有点大!

 

       7.  基于衍型的设计模式标注方法

    Stefan Berner等最早将衍型用于标注模式信息,他们将衍型分为四类,分别是装饰衍型(Decorative Stereotype)、描述衍型(Descriptive Stereotype)、限制衍型(Restrictive Stereotype)和重定义衍型(Redefining Stereotype)。通过衍型可以给UML模型元素增加一些属性或者描述信息,但是Berner的衍型标注并不完备,没有提供一套完整的衍型标注方式,缺乏对属性和方法等的描述,也未提供源代码中模式信息的标注方案。之后,Jing Dong等人提出了一些通过扩展UML来对设计模式进行可视化的方法,其中就包括使用衍型来描述类图中的模式信息,但是其标注形式较为复杂,需要同时通过衍型和标记值来表示与模式相关的信息,由于标注语句太长,该方法的使用受到一定的局限;与其他方法类似,Jing Dong等人提出的模式信息标注方法也未提供源代码标注方案。

    基于BernerJing Dong等人的工作,我们提出了一套完整、简单、且容易通过现有CASE工具实现的设计模式标注方法——基于衍型的模式标注(Stereotype Based Pattern Notation, SBPN),该方法结合了现有模式标注方法的优点,既可以对结构图中的模式信息进行标注,还可以用于对源代码中的模式信息进行标注。SBPN没有给原有图形增加任何额外的图形元素,标注方式简单易学,可以容易在学术界和工业界推广。SBPN既可以用于标注类图,还可以用于标注交互图和源代码。

    在SBPN方法中,可以通过在结构图(类图)中直接增加衍型来标注模式信息,标注规则如下:

       【规则一】如果某个类只与某个设计模式的一个实例相关,则通过<<PatternName:RoleName>>的形式标注,其中PatternName表示模式名,RoleName表示对应的模式角色名,如<<Composite:Leaf>>

       【规则二】如果某个类涉及某个设计模式的多个实例,为了不引起歧义,更好地理解该类在各个实例中扮演的角色,通过<<PatternName[InstanceNo.]:RoleName>>的形式标注,其中PatternNameRoleName含义与【规则一】相同,InstanceNo.表示实例编号,对于同一种模式,从1开始进行编号,如<<Composite[1]:Composite>>

    【规则三】如果某个类涉及多个设计模式的一个或多个实例,则可以多次重复PatternName[InstanceNo.]:RoleName,两两之间通过分号(“;”)隔开,如<<Composite:Composite;Command:ConcreteCommand>><<Composite[1]:Composite;Command[1]:ConcreteCommand>>

    【规则四】如果需要标注某个方法/属性,如果所在的类使用【规则一】进行标注,则直接对方法/属性所扮演的角色进行标注即可,即标注该方法/属性对应于相应模式角色类中的哪个方法/属性,如<<execute>>;如果所在类使用【规则二】进行标注,为了不引起歧义,在进行方法/属性标注时也需要加上模式名称和编号,如<<Command[1]:execute>>;如果所在类使用【规则三】进行标注,为了不引起歧义,在进行方法/属性标注时也需要同时出现多个模式相关信息,如<<Command:execute;Composite:operation>><< Command[1]:execute;Composite[1]:operation >>

       对于前面所述的图表显示系统,采用SBPN方法对其结构图进行标注后如图8所示:

    除了对UML图形的标注外,SBPN方法还支持对源代码的标注,通过正向工程可以将结构图中的模式标注信息记录在源代码中,也可以通过逆向工程从源代码中获取模式相关信息,一方面便于对代码的阅读和理解,另一方面还有利于系统的扩展和维护。如图9所示某策略模式实例的结构图:

       9对应的Java代码片段如下所示,在源代码中,通过增加“@Stereoptype PatternName:RoleName”形式的注释来对类进行标注,源代码的标注方式和结构图的标注方式类似,区别在于在源代码中使用“@Stereoptype”来取代UML图形中的双尖括号(“<<”和“>>”),同时还可以对源代码中的方法和属性进行标注。

/**
 *@Stereotype Strategy:Context
 */
public class ArrayHandler {
    /**
      *@Stereotype strategy
      */
    private Sort sortObj;

    /**
      *@Stereotype ContextInterface
      */
    public int[] sort(int arr[]) {
	sortObj.sort(arr);
	return arr;
    }
    
    ……
}

/**
 *@Stereotype Strategy:Strategy
 */
public interface Sort {
    /**
     *@Stereotype AlgorithmInterface
     */
    public int[] sort(int arr[]);
}

/**
 *@Stereotype Strategy:ConcreteStrategy
 */
public class BubbleSort implements Sort {
    /**
     *@Stereotype AlgorithmInterface
     */
    public int[] sort(int arr[]) {
        ……
    }
}

(SBPN方法已发表在2012年第11期的《计算机应用》中)

参考文献
[1] J.VLISSIDES. Notation, notation, notation[J]. C++ Report, April 1998.
[2] GERARDO CEPEDA PORRAS, YANN-GAËL GUÉHÉNEUC. An empirical study on the efficiency of different design pattern representations in UML class diagrams[J]. Empirical Software Engineering, 2010, 15(5): 493-522.
[3] TRESE T, TILLEY S. Documenting software systems with views V: towards visual documentation of design patterns as an aid to program understanding[C]. In: Proceedings of the 25th international  conference on design of communication. ACM, New York, 2007, 103-112.
[4] JING DONG, SHENG YANG AND KANG ZHANG. Visualizing design patterns in their applications and compositions[J]. IEEE Transactions on Software Engineering, 2007, 33(7): 433-453.
[5] JING DONG. Adding pattern related information in structural and behavioral diagrams[J]. Information and Software Technology, 2004, 46(5): 293-300.
[6] JING DONG. UML extensions for design pattern compositions[J]. Journal of Object Technology, 2002, 1(5): 149-161.
[7] MARTIN GOGOLLA, BRIAN HENDERSON-SELLERS. Analysis of UML stereotypes within the UML metamodel[C]. In: Proceedings of the 5th International Conference on the Unified Modeling Language(UML' 2002) , LNCS(Lecture Notes in Computer Science), 2002, 2460: 84-99.
[8] STEFAN BERNER, MARTIN GLINZ, STEFAN JOOS. A classification of stereotypes for object-oriented modeling languages[C]. In: Proceedings of the 2nd International Conference on the Unified Modeling Language(UML' 1999), LNCS(Lecture Notes in Computer Science), 1999, 1723: 249-264.
[9] 蒋严冰,邵维忠,张路,麻志毅. UML中衍型的精确定义与分析[J]. 电子学报, 2003, 31(12A): 2101-2105.
[10] 刘伟, 胡志刚. 基于衍型的模式标注方法[J]. 计算机应用, 2012, 32(11): 3062-3066.

【作者:刘伟  http://blog.csdn.net/lovelion

  • 3
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
众所周知,人工智能是当前最热门的话题之一, 计算机技术与互联网技术的快速发展更是将对人工智能的研究推向一个新的高潮。 人工智能是研究模拟和扩展人类智能的理论与方法及其应用的一门新兴技术科学。 作为人工智能核心研究领域之一的机器学习, 其研究动机是为了使计算机系统具有人的学习能力以实现人工智能。 那么, 什么是机器学习呢? 机器学习 (Machine Learning) 是对研究问题进行模型假设,利用计算机从训练数据中学习得到模型参数,并最终对数据进行预测和分析的一门学科。 机器学习的用途 机器学习是一种通用的数据处理技术,其包含了大量的学习算法。不同的学习算法在不同的行业及应用中能够表现出不同的性能和优势。目前,机器学习已成功地应用于下列领域: 互联网领域----语音识别、搜索引擎、语言翻译、垃圾邮件过滤、自然语言处理等 生物领域----基因序列分析、DNA 序列预测、蛋白质结构预测等 自动化领域----人脸识别、无人驾驶技术、图像处理、信号处理等 金融领域----证券市场分析、信用卡欺诈检测等 医学领域----疾病鉴别/诊断、流行病爆发预测等 刑侦领域----潜在犯罪识别与预测、模拟人工智能侦探等 新闻领域----新闻推荐系统等 游戏领域----游戏战略规划等 从上述所列举的应用可知,机器学习正在成为各行各业都会经常使用到的分析工具,尤其是在各领域数据量爆炸的今天,各行业都希望通过数据处理与分析手段,得到数据中有价值的信息,以便明确客户的需求和指引企业的发展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值