接上文腾讯篇第二部分,地址是:http://blog.csdn.net/qingrun/article/details/8552996
5.9 UML培训资料中的错误
几个月前在新浪微博中看到有人转发的这样一份据说是腾讯内部的培训资料,在《腾讯:从概念到产品-需求分析过程》的这份腾讯大学的培训资料中,笔者看到了很多错误,下面一一列举。
5.9.1 Actor的定义错误
第十八页的内容中提到了Actor的角色,这里的内容包含了一个错误。
系统之外的任何东西都是角色——Actor,这句话本身就是一种错误的表述。
在《UML参考手册》中文版中的Actor是这样定义的:actor参与者是直接与系统相互作用的系统、子系统或类的外部实体的抽象概念。参与者参与到用例或一组连贯的用例中以完成整个目标。
在这里Actor被翻译为参与者。
在《UML Concept》中Actor是这样定义的:与用例交互时,用例的使用者所充当的一系列相关角色。一个活动者对所通信的每个用例具有一个角色。更详细的解释就不张贴在这里了。
在这里Actor被翻译为活动者。
不管上面两篇文字中对Actor的翻译如何,其所强调的作用是相同的。
《UML参考手册》中强调与系统相互作用,这个词很关键。在《UML Concept》中强调使用者所充当的。
这两段话都强调了一个主动性,也就是Actor必须能够主动地发起触发。因此在很早以前笔者的博文里面就曾经提到了这一点:Actor必须是能够主动发起行为的,另外,Actor与用例的交互只是通信而不是互相操作,因此外部系统一般不能作为Actor来存在,因为系统之间的交互往往是通过接口实现的,发出信息并获取返回信息,获取的返回信息也必须有对返回信息进行处理的方法,也就是说,返回信息进入到这个外部系统的时候,会对外部系统内部的数据和操作产生影响。这时候就不符合Actor的主动要求了,否则,就会产生设计时的混乱,诸如时钟,定时器,数据库,一些触发类程序系统等等都可能因为这一点而被误判认定为Actor而不是外部Use Case或者外部系统。同样,大概在2004年曾经讨论过数据库是否可以作为Actor存在的问题,结论就是否定的。
再多说一句,对于系统和Actor之间的交互与系统和外部Use Case或者外部系统的交互是完全不同的。系统与Actor之间的交互,就是Actor进行操作和行为触发,然后系统执行并显示,并不存在对Actor直接的数据输入。而系统和外部Use Case或者外部系统的交互是会产生直接的数据输入的,至少返回值就是必须进行处理的。
5.9.2 Use Case到Actor的调用
在第20页出现了Use Case到Actor的调用。
根据前文中提到的Actor的定义可以看到,这个世界上不会发生Use Case调用Actor的事情,这样的事情是违背客观现实逻辑的。
而可能发生这种操作的应该是外部Use Case。
当然还有一种可能的错误分析情况,在笔者的blog中有这样一篇文字:http://blog.csdn.net/qingrun/article/details/6322312。其中有一副图,如下所示。
实际上在这里,不存在取款用例到顾客之间的关系,与系统操作相关的都是银行理财专员,银行理财专员最后把钱取到手,交给顾客的过程是不通过系统的,也就是说,顾客和系统之间并没有任何交互,不是系统的Actor之一。
5.9.3 外部系统不能用Actor来表示
外部系统也可以用Use Case来表述,只不过是外部Use Case,绝对不是Actor,Actor的创建必须是能够主动行为的对象,绝对不是一个只能被动响应,然后通过活动或者时间触发的对象。
上图中的银证转账系统应该是一个Use Case或者一个子系统,或者一个外部系统包,绝对不应该使用Actor来表示。
5.9.4 Use Case名称位置的问题
Use Case名称未必写在椭圆内,在最初也是影响力最大的Rational rose这个工具中就没有把名称写在椭圆内。
下面是几个常用UML工具的用例标示图。
Rose
EA
Trufun
StarUML
确实,在UML规范中是如此要求的,但是,实际实现中并没有都如此遵循,如果这里强调必须放在椭圆内,那Rose将被置于何地?毕竟Rose是Rational公司的产品,而Rational则是UML三巨头的公司。
5.9.5 扩展,也就是extend关系的错误绘制
扩展也就是extend关系的使用错误,这个在2002年我的文字中就写过,extend关系是从后向前绘制的,正好和include关系相反。
下面两幅图中的extend关系都错了。
Extend关系是后者对前者的扩展,或者说逻辑上表示后者对前者的扩展,而数据流向是从前者进入后者的,因此和Include关系的箭头方向正好相反。两者的差别表示是,Include表示前者执行完,必然执行后者,而Extend则表示前者执行完未必执行后者。
更典型的错误例子图如下。
注:从实际的业务逻辑上,这张图也绘制错了,存钱和取钱都不代表必须打印单据,因此,下面的两个包含关系也应该是扩展关系,即extend关系。如果不相信,就自己去银行ATM上操作几次就知道了。
举一个国外99年的资料中的例子:
这是为了说明一个问题,大家在面对资料的时候,至少要学好基本的概念和知识,否则会出现很多错误和不必要的混乱。
注意:虽然笔者曾经说过,只要团队内保持一致,如何使用UML都没有关系,但是,当你的团队需要学习很多外部资源来熟悉一个标准的时候,还是应该尽量把标准的基础知识学准确了,否则,当他们看到你的团队资料和外部资料不同的时候,就会无法理解,甚至产生怀疑和冲突,毕竟不是每一个成员都可以达到对知识灵活运用而不僵化教条的水平的。
5.9.6 从Use Case指向Actor的箭头
关于这页中提到的include和extend关系的区别,请看下面的链接http://blog.csdn.net/qingrun/article/details/6026717,http://blog.csdn.net/qingrun/article/details/5799615。
但是,关于Use Case指向Actor的箭头错误,在前面5.9.2中已经解释过了。
5.9.7 与外部系统互动的错误绘制
既有extend关系错误,也有从Use Case指向Actor的错误。
5.9.8 Sequence Diagram在需求阶段的错误使用
这是一个可能有争议的话题,不过,考虑了很久后还是决定放在这里。
Use Case的阐述中使用Sequence Diagram,把设计模型中的常用表示图用在了需求分析阶段!这样的跨阶段使用完全是违背了时序图创建的本意和用途的,一般而言,需求阶段只需要使用状态活动图或者泳道图,这不是时序图来进行这样的细节描述。
另外,需求阶段的产物一般而言会要求用户可以看懂,而用户一般不会看懂比较专业的时序图或者协作图(时序图和协作图是可以1v1直接转换的)的表达方式,只有状态/活动图或者泳道图才适合在需求阶段使用。
即使在2008年笔者曾经提供给西安楚凡使用的Use Case阐述模型化的表示方法中,也只是用到了泳道图就解决了这个问题,而不需要使用时序图来表达。
另外,现在确实有很多书籍资料中把时序图用在需求阶段进行需求细化的表示,可是他们确实忘记了,在UML的表述中,时序图是和协作图1v1转换的,如果你使用了时序图在需求阶段,那么协作图用于需求阶段也应该是可以的,但是,却几乎没有看到过协作图用于需求阶段的例子。
最后,即使是用例细化的过程中,涉及到用例大小度量和数量计算的时候,这个时候往往是需要考虑项目规模的,也就是需要度量开发周期的时候,用例的大小度量和数量的基础,用状态/活动图以及泳道图中的元用例/活动/状态作为基础进行计算是一个非常方便的方法,而在时序图中则很难找到合适的对应关系。
另外, Sequence diagram应该是来源于Rumbaugh的OMT方法中的动态模型和Jacobson的OOSE方法的时序图,在 OOSE方法中时序图是设计模型阶段的组成部分,并不是需求阶段使用的。在OMT方法中的动态模型中强调:“动态模型描述与时间和操作顺序有关的系统特征——激发事件、事件序列、确定事件先后关系的状态以及事件和状态的组织。”因此也是属于分析设计阶段的内容,不是需求阶段的表示方法。
虽然笔者有过一些关于用法上不拘一格的观点,但是,凡此种种,至少到目前为止,并没有必须把时序图用于需求阶段的铁证。因此,笔者还是建议在需求阶段或者说在任何阶段都不要信手拿来主义,把其他阶段的表示法拿来就用,这是不合适的。
5.9.9 其他错误
剩下的内容还有一些错误因为不是明显的或者不能用一些简短的文字证明,这里就不再列出来了。
下文继续腾讯篇第四部分。
分享到:
相关推荐
单项海洋环境影响评价等级表.docx
【作品名称】:基于AT89C51 单片机为核心器件,程序设计采用C 语言,Keil 软件编译程序,配以相关外围接口电路,实现了方波、锯齿波、正弦波、三角波、梯形波五种特定波形的产生【论文+源码】 【适用人群】:适用于希望学习不同技术领域的小白或进阶学习者。可作为毕设项目、课程设计、大作业、工程实训或初期项目立项。 【项目介绍】:本设计中的波形发生器系统要求基于51单片机,因此选用以AT89C51单片机作为整个系统的控制核心,应用其强大的接口功能,构成整个波形发生器的硬件系统。使用C 语言对单片机编程可产生相应的正弦波,方波,三角波,锯齿波梯形波波形信号。在程序运行时,当接收到按键信息后,需要输出某种波形时,调用相应的中断服务子程序和波形发生程序,经电路的数/模转换器和运算放大器处理后,从信号发生器的输出端口输出即可得到要求的波形。 当需要改变频率时只需要改变单片机的波形发生程序中的递增或者递减变量即可。 【资源声明】:本资源作为“参考资料”而不是“定制需求”,代码只能作为参考,不能完全复制照搬。需要有一定的基础看懂代码,自行调试代码并解决报错,能自行添加功能修改代码。
数学建模培训资料 数学建模实战题目真题答案解析解题过程&论文报告 完全多元图的最大匹配问题研究 共9页.pdf
本项目是基于Python Web的社区爱心养老管理系统,旨在为社区养老提供一个全面、高效的管理平台。系统集成了用户管理、老人信息管理、健康管理、活动管理、服务管理等多项功能,通过简洁明了的界面,让管理人员能够轻松地进行各项操作,从而更好地服务于社区老人。 在架构上,系统采用B/S模式,前端使用HTML、CSS、JavaScript等技术,搭配Vue.js框架,实现了用户友好的交互界面;后端则基于Python的Django框架,提供了稳定且高效的服务端逻辑处理能力。数据库选用MySQL,确保了数据的存储安全和高效访问。 开发此项目的目的,不仅是为了满足计算机相关专业学生的毕设需求,提供一个实战练习的平台,更是希望通过实际项目的开发,培养学生的专业技能和实践能力,同时,也希望能为社区养老服务贡献一份力量,通过科技手段,让老年人的生活更加美好、便捷。
教学版单体spring-petlinic,课程《Kubernetes微服务实践》
内容概要:本文介绍了16世纪法国外交家Blaise de Vigenère提出的一种多表密码算法,详细解释了Vigenère密码的加密解密机制及其历史应用背景。特别提到了当明文M的长度超过密钥K的情况下,密钥会被重复使用的技巧。 适合人群:对古典密码学感兴趣的初学者,以及希望深入理解密码编码基本原理的学习者。 使用场景及目标:了解Vigenère密码的工作原理,掌握简单的加解密技术,增强信息安全意识。能够自行实施加解密操作,理解经典密码学的基本概念和技术。 其他说明:本文不仅提供了理论讲解,还给出了具体的例子帮助理解和实操练习。
STM32-EMBPI : Embedded Pi, triple-play platform for STM32, Raspberry Pi and Arduino
内容概要:本文主要探讨了电子电气架构中的网络管理策略,尤其是针对汽车中多个ECU(Electronic Control Unit)的协同管理和低功耗设计。通过引入网络管理状态机的概念,详细介绍了各状态(如常规运行状态、重复报文状态、准备睡眠模式、预睡眠模式、深度睡眠模式等)的具体运作机制及其在汽车电子系统中的重要性。文中还讨论了网络管理报文的设计与传输规则,特别是控制位向量CBV的定义,强调了网络管理在节能降耗方面的关键作用。 适用人群:具备一定汽车电子工程背景的专业人士或研究者,尤其对网络管理及低功耗设计感兴趣的工程师。 使用场景及目标:适用于汽车设计与制造企业的研发部门,帮助其优化电子控制系统,提升产品能效比,降低维护成本,提高用户体验。通过对网络管理策略的理解与应用,达到降低车载电子系统功耗的目的,进而延长电动车的续航能力和降低传统燃油车的油耗。 其他说明:文章不仅提供了理论上的阐述,还包括了具体的操作指南和技术细节,有助于从业者深入理解和实施网络管理方案。同时提醒在现代信息化社会中保持屏蔽力的重要性,鼓励读者专注于自己的发展目标,避免无效的精力分散。
英飞凌TC3XX_MCAL培训PPT
缴费综合服务系-JAVA-基于springBoot高校网上缴费综合服务系统设计与实现
Python与机器学习方向,《TensorFlow基础教程》课程仓库
【资源说明】 本科毕业设计 基于Python+Django教学资源管理系统网站详细文档+全部资料.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
内容概要:文章详细讨论了汽车行业正经历的重大变革,尤其是电动汽车(EV)和软件定义汽车(SDV)对行业的深远影响。随着技术的进步,汽车的差异化优势不再仅限于机械硬件,而是越来越多地取决于软件和服务。这一转型要求汽车制造商重新评估现有的解决方案堆栈,加大在电气化和连接性等领域的投资,以实现车型的电气化并支持可扩展性和全生命周期更新。同时,汽车的开发重点已经从机电领域转向了芯片和软件领域,强调基于云计算的协作开发方法。 适合人群:汽车行业专业人士、汽车电子工程师、技术研发人员及政策制定者。 使用场景及目标:帮助读者理解和把握汽车行业数字化转型的趋势,指导他们在电动汽车和软件定义汽车领域做出正确的技术投资和战略调整。 其他说明:本文不仅讨论了技术变革,还深入剖析了由此带来的商业和运营模式的变化,为汽车行业的未来发展方向提供了洞见。
微信课堂助手 微信小程序+PHP毕业设计 源码+数据库+论文+启动教程
新设博士后科研工作站备案申请表.xlsx
的玩具 Python 实现手套蟒蛇GloVe的玩具 Python 实现。Glove 产生单词的密集向量嵌入,其中一起出现的单词在生成的向量空间中靠得很近。虽然这会产生与word2vec (在gensim中有一个很棒的 python 实现)类似的嵌入,但方法不同GloVe 通过对语料库词共现矩阵的对数进行分解来产生嵌入。代码采用异步随机梯度下降,用Cython实现,很可能存在大量bug。安装使用 pip 从 pypi 安装pip install glove_python。OSX 用户请注意由于使用 OpenMP,glove-python 无法在 Clang 下编译。要安装它,您需要一个较新的版本gcc(例如来自 Homebrew)。应该由 接收setup.py如果没有,请打开一个问题。使用 OSX 中包含的默认 Python 发行版进行构建也不受支持请尝试 Homebrew 或 Anaconda 中的版本。用法生成嵌入分为两个步骤从语料库中创建共现矩阵,然后使用它生成嵌入。该类Corpus有助于从可交互的标记构建语料库该类Glove训练嵌入(使
消息中间件rabbitmq学习的一些代码、笔记
环境说明:开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 5.7 数据库工具:Navicat 开发软件:eclipse/myeclipse/idea Maven包:Maven 浏览器:谷歌浏览器。 项目均可完美运行
空气质量现状评价表.docx
建设工程施工现场消防安全检查表.docx