《软件方法(下)》8.2.4 类和属性的命名

DDD领域驱动设计批评文集

做强化自测题获得“软件方法建模师”称号

《软件方法》各章合集


8.2 建模步骤C-1 识别类和属性

8.2.4 类和属性的命名

8.2.4.2 关于DDD话语中的“通用语言”

DDD(领域驱动设计)话语中有“通用语言(Ubiquitous Language)”的用语,这是一个伪创新。

(1)类似“通用语言”的概念早已有之。

“术语表(Glossary)”或“数据字典(Data Dictionary)”等内容,几十年前的开发规范中应该就已经有了。

下面是出版日期在Eric Evans的《领域驱动设计》之前的几本书的截图。 

图片

图片

图8-35 摘自《软件复用:结构、过程和组织》(Ivar Jacobson等,英文原版出版于1997年)

图片

图8-36 摘自《UML对象、组件和框架——Catalysis方法》(Desmond Francis D’Souza 等,英文原版出版于1998年)

图片

图片

图8-37 摘自《程序员修炼之道——从小工到专家》(Andrew Hunt 等,英文原版出版于1999年)

(2)“通用语言”迎合了呆在舒适区的需要

那么,DDD圈子为什么要重新发明“通用语言”,并强力吹捧呢?

原因就是第1章关于伪创新的内容中阐述的:它迎合了“广大开发人员”呆在舒适区的需要。

我们在上文强调,建模人员要虚心学习领域知识,而这是很辛苦的事情,很多人是不愿意吃这个苦的。

“通用语言”妙就妙在它告诉你,可以不用吃苦不用走出舒适区!

我们先来看一下Eric Evans在《领域驱动设计》中对“通用语言”的陈述,如图8-38。

图片

图8-38 摘自《领域驱动设计》(Eric Evans,英文原版出版于2003年)

从图8-38我们可以看到,“通用语言”是“技术术语”和“业务术语”的交集,用本书的话来说,就是“非核心域术语”和“核心域术语”的交集。

问题是,有交集吗? 

技术术语(非核心域术语),例如浏览器相关的术语:请求、回应、渲染、DOM、序列化、反序列化……。

业务术语(核心域术语),例如商场相关的术语:商品、顾客、订单、库存、收银、盘点……。

“技术术语”和“业务术语”哪里有交集?莫非是把这些正交的术语随意组合,以达到废话刷工作量的效果?此处可以回顾我们在8.1.3 域之间的映射和协作的套路中关于a×b×c的陈述。

DDD话语中所谓的“技术术语”,根本和“技术”无关,其实只是“技术人员”在没有虚心学习领域知识的情况下编造的“业务术语”——“技术人员编造的业务术语”。

而“通用语言”使得“技术人员”编造“业务术语”变得理直气壮,这是一个大倒退。

现实中,难免会有“技术人员”懒得去调研涉众,懒得去学习领域知识,乱做一通了事的现象。这是人性使然,很难杜绝,但至少我们还知道这样做是不好的,如果要做更好,应该怎么做。

如果把偷懒变成理直气壮,味道就变了。

就像我们说“人是自私的”,这是低调描述一个事实,但如果理直气壮地说“人不为己,天诛地灭”,味道就不一样了。

图8-39是Vaughn Vernon在《实现领域驱动设计》中的陈述:

图片

图8-39 摘自《实现领域驱动设计》(Vaughn Vernon,英文原版出版于2013年)

看,不是业务语言,不是工业标准(Industry Standard,译为行业标准更好)术语,是团队自己创建的。也就是说,同一个领域,开发团队不同,团队里的人不同,所得到的“通用语言”可能就不一样。

观测会影响结果,这莫非是软件开发的“薛定谔的猫”?你有你的物理学,我有我的物理学,本开发团队自有“队情”在,“技术人员”这小日子过得可真是舒坦啊!

更妙的是,“技术人员”还会自我感动。本来我是高大上的“技术”,现在向你“业务”开了个口子,让你也参与进来,你“业务”应该感恩戴德了!

这是一种智力上的优越感所带来的傲慢(当然还有金钱、Quan力,不便展开,就不提了)。

如果某个领域的从业人员的平均智力水平(学历、学校、智商等)不如软件开发行业,那么软件开发人员,即所谓的“技术人员”在面对该领域的“业务人员”时,是有一种优越感的。

这种优越感让“技术人员”在做供应链系统、商场系统时有足够的底气来编造“通用语言”,因为他觉得货车司机、仓管、外卖小哥、商场经理的智力水平不如他。

如果所开发系统的核心域是凝聚态物理、非线性分析之类的,“技术人员”面对智力水平超过他的“业务人员”,这份优越感就不会有了。这时,“技术人员”可能就会虚心去学习相关领域知识,因为他觉得这是一件高大上的事情,有面子!

(3)不要让利益博弈压倒“客观规律”。

有一种论调值得警惕。该论调认为“通用语言”让“技术人员”一方有了话语权,不用受“业务人员”一方主导,不用低三下四地去学习领域知识,这对“技术人员”一方有好处。

这样的论调是利益博弈压倒了领域的“客观规律”,不可取。

如果系统的核心域模型没有准确体现领域的“客观规律”,而是发生较大的偏离,那么最终的结果必然是该系统容易出错或者应变成本很高。这种情况也许对某些摸鱼的开发人员有“多劳多得”的好处,但对于整个开发团队以及涉众来说,肯定是有害的。

注意,上面说的“客观规律”加了引号,意思只是说,这些规律不会受开发团队、实现技术等变化的影响,不代表这些规律符合科学。

最常见的,游戏中的知识体系和各种规律,像王者荣耀中的攻击、防御、移动,是魔法不是科学,但建模人员依然要认真去学习和体会这一套体系中的各种“学问”。

同理,上文提到,建模技能可以帮助清理术语中的冗余和矛盾,但仅止于此,建模技能并不能帮助判断该领域的知识是否科学。

(4)“语言”过于宏大

“通用语言”的“语言(Language)”这个词太大。语言要有自己的语法,汉语算,C算,UML也算,“通用语言”哪里有?术语集或术语表的称呼更合适。

8.2.4.3 核心域透镜

在为了软件开发而建模时,建模人员可能会用自己熟悉的非核心域术语来代替不那么熟悉的核心域术语,还引以为豪。例如,面对一段集装箱领域装箱规则的描述,建模人员立即在大脑中把它转换成自己熟悉的概念:栈、链表、树……而且认为这是“透过现象看本质”,甚至宣称“我就是程序,程序就是我”! 

Fred Brooks在《人月神话》中引用了James Coggins的一段话:

The problem is that programmers in O-O have been experimenting in incestuous applications and aiming low in abstraction, instead of high. For example, they have been building classes such as linked-list or set instead of classes such as user-interface or radiation beam or finite-element model. 

问题是面向对象程序员在开发错综复杂的应用时,关注的是低层次,而不是高层次的抽象。例如,他们开发了很多像链表或集合这样的类,而不是用户界面、射线束或者有限元模型。

不同领域有不同的难题,因为觉得困难,所以对真正要解决的核心域问题视而不见,却花精力去做那些自己熟悉的、他人已解决的非核心域问题,是一种逃避。

为了避免核心域概念被非核心域概念掩盖,我们可以采用一种如图8-40所示的“核心域透镜”的思考方式:如果从核心域的视角去看这个概念,或者说把这个概念映射到核心域,我们应该得到什么概念?

图片

图8-40 用核心域透镜映射各种概念

例如,以“学习和考试”作为核心域,经过透镜前后的概念对比如图8-41。

图片

图8-41 经过透镜前后的概念对比

对每一个用语我们都可以这样过一下:这个用语属于核心域概念吗?如果不属于,映射到核心域概念意味着什么?

例如,图8-42左侧,“商品”有一个“加粗显示”的属性来标记它是否加粗显示。如果核心域是“商品”相关的领域,那么“加粗显示”不属于核心域的概念。我们可以追问:为什么要“加粗显示”,能在核心域找到原因吗?回答可能是:因为该“商品”是“热销商品”。“热销”才是核心域概念,可以改成图8-42右侧。

图片

图8-42 “加粗显示”的映射

这里面涉及到两个知识:

知识一:某商品是热销商品。这是商品领域的知识,已经存在很多年。

知识二:如何表示“热销”的概念。这和表示方式、时代审美、展示的目标人群等有关。图形接口的表示和文本接口、语音接口不同,十年前的图形接口和现在的图形接口不同,面向年轻人的图形接口和面向老年人的图形接口不同……

8.2.4.4 命名中不带冗余内容

如果把模型元素命名中的某个部分删去,不影响建模人员对该模型元素的认识,那么这个部分没有必要存在。

如图8-43中,在“人员”后加一个“类”字,实际上也是把两个不同领域的知识叠加在一起。

知识一:人员是一个类。

知识二:用UML表示法的图形表示,类是一个方框。

知识一和知识二是正交的。在对知识二已经有了共识的情况下,再加上一个“类”字是冗余的。

图片

图8-43 删除命名中的冗余部分

关于类和属性的命名,常犯的冗余错误有:

(1)在类名的最后加"类"字;

(2)在类名的前面加"Class"或"C";

(3)在类名的最后加"情况"、"信息"、"记录"、"数据"、"表"、"库"、"单"等;

(4)在属性名前加类名

如图8-44,按"类的属性"念出来,"人员的姓名"很好,"人员的人员姓名"就冗余了。

图片

图8-44 属性名称前不需要加类名

(5)给类加上标识属性

对象有标识,这是一个共识,不需要为类专门加一个如“**ID”之类的标识属性。

如何表达对象的标识,这是另一个领域的知识,其实现规律和当前所研究领域的知识无关(除非当前所研究领域就是“如何实现对象标识”的领域)。一旦确定实现的套路,在设计工作流通过人工或工具按照套路加上即可。

此处说的标识是为了区分对象而添加的标识,在设计工作流中可以以整数、GUID等各种方式实现。它应该不带任何领域知识,因为一旦带有领域知识,就意味着一旦领域知识发生变化,它也要跟着变化。

除了标识之外,可能还有其他在类的对象集合内值唯一的“编号”属性,如订单编号、人员身份证号、房间号等。这些“编号”属性往往带有领域知识,例如房间号“203”会暗示这个房间是2楼第3个房间,这样的暗示,是为了让人方便记忆和识别,计算机并不需要标识中含有领域知识,除非对象没有其他属性,把各种领域知识都凝结在标识中,需要计算机来解析。

在设计工作流,虽然这样的属性也可以作为标识使用,但尽量不要这样做,因为其中的领域知识一旦发生变化,就会带来风险。

本书作者的身份证号,最开始是15位的“3401**74******1”,1999年升位,变成了18位的“3401**1974******19”。身份证号中暗示了许多知识:3401**→安徽省合肥市蜀山区,1974****→1974年**月**日生,**1→当日出生的男性顺序号,9→校验码。这些信息发生变化时,原有的暗示就失效了。

对象标识仅在内部用于表示对象,不需要在人机交互的界面上出现,也就是说,不需要人类执行者输入对象标识,也不需要向人类执行者展示对象标识。如果需要,在人机交互的界面上出现的应该是“编号”属性。

*********

如果犯了以上所列举的错误,相当于强行把正交的知识叠加在一起,往往就会得到“废话刷工作量”的结果——记住这个要诀,如果有一天读者想要故意“废话刷工作量”,就把它用上。

举个“废话刷工作量”的例子以加深印象,如图8-45,如何“废话刷工作量”?

图片

图8-45 无冗余的类图,等待“废话刷工作量”

按照上面提到的冗余错误,一个个用上去,可以得到“废话刷工作量”的步骤如下:

(1)因为方框上部是类名,下部是属性,连线是关联,所以,给类和关联的名称加上“类”、“属性”、“关联”。

(2)可以看出,这些类是领域类或分析类,所以,把“领域”加到类名称后面。

(3)因为这些类都代表了一些信息,所以,把“信息”加到类和属性名中。

(4)因为类的属性是“类的”属性,所以,给属性前面加上类的名称。

(5)因为关联也是属性的一种,只不过类型是另一个类,所以,每个类为关联加一个属性。

(6)因为每个对象都有标识,每个对象都有状态,所以,给每个类加上ID和状态属性。

(关联、状态等相关知识,后文讲述。)

演变过程如图8-46。

图片

图8-46 废话刷工作量的过程

类图上的字从最开始图8-46顶部图形的28字增加到底部图形的135字,但没有增加任何有价值的信息。

********************

“信息”、“数据”等也不是不可以作为类的名称。如果系统关注的焦点是"信息处理",处理的信息是什么内容无所谓,"信息"、"数据"也可以作为类的名称,但这个时候就不再有"人员"了,它们不在一个抽象级别。类图可能如图8-47。

图片

图8-47 "信息"作为一个类的名称

8.2.4.5 命名的词性

类和属性应该用名词命名。上文出现的类“人员”、“商品”、“姓名”等就是名词。

在汉语中,动词可以不做任何变化,直接作为名词使用。例如,“我的奋斗”、“嫌疑人X的献身”以及“面向对象设计”,其中的“奋斗”、“献身”和“设计”就是动词的名词化。

因此,“申请”、“审批”、“入库”、“出库”等同样可以作为类的名称。虽然它们看起来是动词,但在作为类的名称的时候,已经被当作名词了。

有的建模人员不理解这一点,总觉得看着不舒服,非得在后面加一个“单”、“记录”、“信息”、“事件”之类,变成“申请单”、“申请记录”、“申请信息”、“申请事件”。

其实并不需要,否则每个动词刷一个后缀,又变成废话刷工作量了。“事件”还说得过去,像“单”、“记录”、“信息”等后缀已经假设了其具体形态,就更不可取了。即使建模时面对的素材是一张纸质的申请单,类的名字也应该写“申请”,因为这才是本质的概念。

图片

图8-48 “动词”直接作为类的名字,不用加后缀

如果一个用语在某个领域中已经存在很久,成为了该领域的术语,即使它看起来犯了以上提到的冗余错误,用来作为模型元素的命名也无妨。例如"订单"带有"单"字,实际上描述的是一次"购买"或“交易”,不过"订单"已经在领域中广泛使用,而且把“单”去掉留下“订”也不合适,所以“订单”可以作为类名。

在其他语言中,动词不一定能直接用作名词,可能要做一些变化。

在英语中,像“设计”是可以直接使用的:design→design,但像“献身”可能就要加一个词缀:devote→devotion。其他词缀可能还有ment、ance、ing、ness等。

★领域驱动设计话语中的“领域事件(Domain Event)”采用了动词的过去式来命名,例如OrderShipped,这是错误的。应该用名词命名,关于这方面的阐述,可参见我写的这篇文章《DDD话语批评之一:评“状态和事件本质相同”》,https://mp.weixin.qq.com/s/QhAhSdET5psZQEEW6f9KoA

因此,在汉语中,“支付”可以作为类的名称(名词),也可以作为操作的名称(动词),而在英语中,类的名称可能叫Payment,操作的名称叫Pay,如图8-49。

图片

图8-49 汉语和英语的类名和操作名

还可以看出,由于英语名词后面加了词缀,像在汉语中忍不住加一个“记录”变成“支付记录”那样,在后面再加一个“Records”之类的概率小了很多。

但也不是所有时候都忍得住,例如,图8-50是“Domain-Driven Design: Tackling Complexity in the Heart of Software”中的一张类图,其中,Delivery和Handling已经是名词,History和Event没有带来有价值的额外信息,可以删掉。

图片

图8-50 摘自“Domain-Driven Design: Tackling Complexity in the Heart of Software”

以上说的是动词的名词化

形容词也可以名词化,例如,“沉默是金”、“把悲伤留给自己”。

不过,在用作类和属性的名称时,形容词和动词不同。首先,形容词不会用作类的名称;其次,形容词用作属性名称时,也不会像动词一样直接把该形容词作为属性名称。

如果需要把一个形容词作为属性,目的必然是测量它的值。这种情况下,领域中往往已经有了另一个术语来专门描述测量值,例如:测量“重”,有“重量”,测量“浓”,有“浓度”。我们应该使用领域中已有的术语。

那如果领域知识中没有这个术语呢,需不需要软件开发人员造一个?例如,在形容词后面加个“值”、“度”、“指数”之类,“美”→“美丽度”或“颜值”,“高尚”→“高尚指数”?

不需要,也没资格。

如果领域知识中没有测量“美”的术语,说明这方面的领域知识可能还不存在,怎么可能会让软件开发人员在软件中封装这些知识呢?

如果涉众硬是需要软件开发人员在软件中封装这些知识,那么此时软件开发人员就不只是软件开发人员了,他要扮演两个角色:首先,他是一名研究“美”的学问的领域专家;其次,他是一名把某个领域专家的研究结果封装到软件中的软件开发人员。这两个角色可以由同一个人担任,也可以分开。

★同前文所述,此处的研究不一定是科学研究,也可以是修仙、漫威、哈利波特、王者荣耀。

当形容词原样出现在类的属性中时,它是作为“状态属性”出现的。严格来说,“状态属性”并不是属性,要注意“状态属性”和上面提到的形容词测量值的区别。

如图8-51,“人”的“重”和“重量”不是一个概念。“重量”是属性,“重”是状态。状态应该用状态机描述,在领域逻辑上,状态“重”也许会仅由“重量”的属性值区间决定,也许会由更多属性的属性值区间决定,在实现上,状态“重”也许会如图8-51左侧实现为一个“重”的布尔类型“状态属性”,也许不会。

关于状态和状态机建模,后文再详述。

图片

图8-51 状态属性和测量值

8.2.4.6 命名所用的语言

这里说的不是编程语言,而是汉语、英语、日语……

给核心域元素命名,使用的语言应该首先考虑精确体现核心域内涵和方便开发团队思考和交流核心域知识。该用汉语就用汉语,该用英语就用英语,该用日语就用日语。

以前经常会考虑转换到编程语言时需要改名的问题。在设计工作流,如果我们使用的编程语言只能用英语命名类、属性、操作等——更严谨的说法应该是编译器广泛支持的字符集比较小,那么还需要一个对编程语言合法的名字。

建模工具例如EA,一般会提供别名(Alias),真实名称用编译器支持的字符集,再加一个别名用于显示。

随着时代的发展,编译器、DBMS等支持的字符集越来越大,上面提到的问题慢慢不再是问题。如果团队成员更熟悉汉语,那么在代码中使用汉语命名即可,省去蹩脚英语或者模糊的汉语拼音缩写(啥?你说“可以加注释嘛”?)给后续工作带来的麻烦。

其他如在文本编辑器中切换输入法太麻烦、版式不好看等问题,在图形建模时影响较小。

以上所说仅是针对目标系统的核心域元素的命名,不涉及非核心域部分。非核心域部分内容,和计算机和软件领域有关。这方面的“外语”,不管是计算机和软件专业的各个概念,还是编程语言的关键字,要求软件人员熟练掌握是理所应当的。

例如,浑元形意太极掌门马老师找我们为他的门派搞一套“修炼辅助系统”。作为软件开发人员,能认真去体会马老师说的“化劲”、“武德”、“真气”、“掌门”之类的概念就已经不易,还要把它们变成英语就更难为人了,估计马老师自己也不知道。

但是,作为软件开发人员,不知道什么叫DTO,什么叫Iterator就不应该了,因此,命名为“武德DTO”之类是没有问题的。

如果目标系统是面向国际的,那怎么办呢?还是前面说的,首先考虑精确体现核心域内涵和方便开发团队思考和交流核心域知识。该用汉语就用汉语,该用英语就用英语,该用日语就用日语。

8.2.4.7 类命名用单数

类的名称已经是一个抽象概念,既代表属于这个类的所有对象的集合,也指代集合中的任何一个对象。

例如,“人”这个概念既代表所有符合“人”的特征的对象的集合,我们可以说“人是一种动物”;同时,“人”可以代表“任何一个人的个体”,我们可以说“人有姓名、身高”。这两种用法,分别对应于后文要讲解的泛化和关联关系。

如果用复数表达,例如汉语“人们”,英语“people”,第二种用法就很别扭了,实例“某个人们”是什么?

图片

图8-52 类命名用单数

如果“某个人们”另有含义,那么应该有另外一个类。例如,社区团购系统中,“某个顾客们”另有含义“团”,那么应该添加一个类“团”。

有一些常见的开发习惯,如数据库表名用复数,甚至有的框架在类转换表时,直接就在名称后面加上s,理由是表里有很多行。其实"类"、"表"的概念已经隐含了"多个对象"、"多行"的意思,不用再加了。而且,如果英语不熟,还得费心思去想正确的复数形式,何必呢?

8.2.4.8 自测题

扫码或访问http://www.umlchina.com/book/quiz8_2_4.html完成在线测试,做到全对以获得答案。

图片

1. [单选]

针对下图,以下描述最正确的是:

图片

 A) 这是“打车”领域的分析类图。

 B) 这是“迪迪打车”系统的核心域类图。

 C) 这是“打车”领域的核心域类图。

 D) 这是“迪迪打车”系统的领域类图。

2. [多选]

给类命名时,要注意不要在类名的最后加"情况"、"信息"、"记录"、"数据"、"表"等。请问,针对以下哪些系统的核心域建模,类名中可以出现刚才提到的这些文字?

 A) 雨量数据信息监测系统

 B) DBMS(数据库管理系统)

 C) 疫情信息情况数据查询系统

 D) 搜索引擎

3. [单选]

关于“宝贝”和“商品”,经过讨论和思考,建模人员认为在目前所关注范围内这两个词可以认为相同,“商品”更适合作为分析模型中实体类的名字,那么,以下说法正确的是:

 A) 实体类起名“商品”,但如果某类涉众觉得“宝贝”更顺眼,和他交互的界面上依然可以写“宝贝”。

 B) 所开发系统的所有成分应一律使用“商品”,以建立“通用语言”。

 C) 实体类一律使用“商品”,和人交互的界面上一律使用“宝贝”。

 D) 应该以“宝贝”为抓手,将“商品”下沉到底层架构,击穿程序员心智,打出一套敏捷组合拳。

4. [单选]

以下给类和属性命名,最合理的是:

 A)  

图片

 B) 

图片

 C) 

图片

 D)  

图片

5. [单选]

关于去除分析模型中不该有的内容,以下做法合适的是:

 A) 需求规约(用例规约)里没提到的内容要去除,提到的内容要保留。

 B) 观察模型中各元素的命名,是名词(包括名词化后的动词)的保留,其他去除。

 C) 观察模型中各元素的命名,涉及计算机、软件、网络术语的内容要去除。

 D) 逐个思考模型中的元素,如果去除它会不会影响到功能。

6. [多选]

以餐馆的取号机为目标系统。食客输入有几人就餐,请求取号,系统打印出排号单,上面的信息有餐台类型(大中小……),排队号码。

请问:如果对目标系统使用面向对象分析,根据以上信息判断,以下选项中,属于系统的分析类且命名合适的有:

 A) 食客

 B) 取号界面

 C) 取号控制

 D) 餐台类型

 E) 餐台

7. [多选]

软件开发人员和涉众交流某个问题时,涉众提到一个他工作中的专业术语“差动保护”,开发人员很难理解。对此,以下说法错误的有:

A) 开发人员应该认真去研究相关的领域知识。

B) 说明“差动保护”不是双方能用于沟通的“通用语言(Ubiquitous Language)”,开发人员应该带领相关涉众建立方便开发人员理解和沟通领域知识的“通用语言”。

C) 有的岗位的涉众学历较低、能力较差、知识面较窄,对领域的认识有时还不如开发人员,对这类涉众所说的,如果听不懂,可以先处理其他好理解的问题,然后有空再来处理该涉众的这个问题。

D) 开发人员应该用敏捷+DDD打法,给涉众赋能,连接涉众心智,通过通用语言(Ubiquitous Language)拉齐水位,形成闭环。

8. [单选]

产品经理王婉菲精读《软件方法》(上),做对书上所有题目以及所有强化自测题,所写的用例规约提交给潘老师评点也得到了好评。这天,王婉菲把一份用例规约交给架构师刘庚宏,刘庚宏做面向对象的分析时,发现得到的类图中,“人员”这个类没有“姓名”属性,以下描述最正确的可能是: 

A) 系统目前用不到“姓名”的信息。

B) 用例规约不能覆盖所有需求,需要补一份软件需求规约。

C) “人员”有“姓名”属性是缺省的,觉得哪里缺,自己加上就可以。

D) 王婉菲应该在用例规约中补充相应的内容再交给刘庚宏。

9. [多选]

A公司正在开发“新一代供应链系统”,目标组织定位为动力电池厂商B公司,以下可以算作领域专家的有:

A) A公司架构师张三,曾负责公司多个供应链系统的业务流程建模、实体-关系建模。

B) 著名教材《供应链管理》的作者、某高校教授李四。

C) B公司仓库助理王五,熟练使用公司当前的供应链系统的仓储相关功能。

D) B公司创始人、动力电池专家尼古拉斯·赵六。

10. [单选]

除了中国之外,世界上很多国家也有传统医学。例如,印国的阿育吠陀医学已经延续了五千年。阿育吠陀医学(以下简称印医)认为世界万物包括人类由土、水、火、气和空间五种元素组成,人体有中脉、左脉、右脉三条脉络,然后形成七个脉轮,一万两千个脉的支道。关于致病和治病,印医也有一套十分庞杂的知识体系,包括使用牛的粪尿、水蛭吸血以及念咒语等。

近年来,印医逐渐没落,印国的印医药管理局为了振兴印医,委托A公司开发一套名为“随身老印医”的系统推广全国。该系统打算封装印医知识体系和著名老印医的经验,让印国患者可随时享受正宗的印医服务。

针对“随身老印医”系统的分析工作流,以下说法正确的是:

A) 应该用现代医学知识建立该系统的分析模型,为患者提供更好的服务。

B) 印医的知识体系是否科学,不影响软件开发。

C) A公司开发人员可以和印医领域专家协作,用软件开发术语来帮助提升印医术语,得到通用语言。

D) 可以借此机会构建一套名为“印医驱动设计的敏锐建模方法”的全新软件开发方法学。

11. [多选]

以下文字中存在“形容词用作名词”的有: 

A) 假烟假酒假朋友,假情假意假温柔。

B) 我怕我的眼泪,我的白发,像羞耻的笑话。

C) 在华丽的城市,等待醒来。

D) 凋零下的无暇,是收获谜底的代价。

12. [单选]

核酸检测已经成为日常生活的一部分。假设某系统需要某个类来记住人们每一次核酸检测的时间、方式(咽拭子、鼻拭子、肛拭子)、结果等,以下选项中最适合作为这个类的名字的是:

A) 核酸检测

B) 核酸检测事件

C) 核酸检测记录

D) 核酸检测单

13. [多选]

关于任务和分派,以下类图中命名合适的有: 

A) 

图片

B) 

图片

C) 

图片

D) 

图片

14. [单选] 

以下类图,抛开其他方面的问题不谈,只谈类名和属性名。

如果在不修改类个数的情况下,删除冗余属性、类名和属性名中的冗余内容,大概有多少比例的内容可以删除?计算方法:(被删除的类名和属性名字数/图中原有的类名和属性名字数)×100%,2个英文字符算一个字。

图片

 A) 36%

 B) 46%

 C) 56%

 D) 66%

UMLChina公众号精选(20231208更新)按ABCD工作流分类

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/239928.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023-12-22 linux C语言pthread_kill函数,pthread_kill(tid, 0)可以用来判断线程是否存在

一、该函数其实不是kill线程,而是向线程发送一个signal,pthread_kill()函数的作用是向某个线程传递一个信号,创建的线程中signal(SIGKILL,sig_handler)函数去处理对应的信号,如果你给一个线程发送了SIGQUIT、SIGKILL,但…

Ubuntu20.04.2-mate上Lazarus安装与测试

简言 Lazarus采用RAD方式界面开发,一套代码可交差编译出windows、ios、android、solaris、BSD等 各平台运行的程序,在unbuntu的repo中有2.2.0版本可用,在sourceforge上有2.2.6版本和3.0.0的Rolling版可下载安装,但感觉上2.2.0和2…

跨境电商独立站深度分析演示网站

对于跨境电商卖家来说,多平台、多站点的布局是非常重要的战略。这样做可以规避”鸡蛋放在同一个篮子里”的风险也能够追求更高的销售额和利润。同时,市场的变化也带来了新的发展机会,因此很多出海企业都希望抓住独立站的新机遇,抢…

【优质】「web开发网页制作」html+css关于动漫主题海贼王网页制作(7页面附源码)

涉及知识 动漫主题网页制作,海贼王网站7页面,动漫divcss,动漫网站成品,CSSDIV布局,期末网页大作业,网页作业成品,web前端源码实例,如何制作网页,网页设计思路&#xff0…

SpringIOC之SimpleTimeZoneAwareLocaleContext

博主介绍:✌全网粉丝5W+,全栈开发工程师,从事多年软件开发,在大厂呆过。持有软件中级、六级等证书。可提供微服务项目搭建与毕业项目实战,博主也曾写过优秀论文,查重率极低,在这方面有丰富的经验✌ 博主作品:《Java项目案例》主要基于SpringBoot+MyBatis/MyBatis-plus+…

IntelliJ IDEA 2020将SpringMVC项目打成war包

一 、打开 Project Structure 进行配置 1. 打开方式 (1)CtrlAltShiftS (2)File->Project Structure (3)点击如下图标: 2. 进入 Project Structure,添加Artifacts Web Applica…

后台留言列表

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>后台管理系统</title> <meta http-equiv"X-UA-Compatible" content"IEedge,chrome1"> <meta http-equiv"Acc…

解决xcode 运行不老iPhone 15 iOS 17.1 设备的问题

问题 最近要查看一下ios 17.1的设备的性能&#xff0c;但是当前版本的Xcode运行不了 解决方法 1、更新Xcode版本到15.1以上 2、更新完成后&#xff0c;大概率出现这个情况 原因&#xff1a;在app Store中更新到Xcode15后,运行不了模拟器和真机.需要下载iOS 17对应的模拟器.&…

Linux 一键部署二进制Gitea

gitea 前言 Gitea 是一个轻量级的 DevOps 平台软件。从开发计划到产品成型的整个软件生命周期,他都能够高效而轻松的帮助团队和开发者。包括 Git 托管、代码审查、团队协作、软件包注册和 CI/CD。它与 GitHub、Bitbucket 和 GitLab 等比较类似。 Gitea 最初是从 Gogs 分支而来…

python报错A value is trying to be set on a copy of a slice

加入.copy()即可避免该报错提示 原代码&#xff1a; df5df4.drop_duplicates() print(df5.shape)df5[班型中文名称]df5[班型名称]-A print(df5.head()) 输出结果&#xff1a; 修改后代码&#xff1a; df5df4.drop_duplicates().copy() print(df5.shape)df5[班型中文名称]df…

通过 Higress Wasm 插件 3 倍性能实现 Spring-cloud-gateway 功能

作者&#xff1a;韦鑫&#xff0c;Higress Committer&#xff0c;来自南京航空航天大学分布式系统实验室 导读&#xff1a;本文将和大家一同回顾 Spring Cloud Gateway 是如何满足 HTTP 请求/响应转换需求场景的&#xff0c;并为大家介绍在这种场景下使用 Higress 云原生网关的…

一个屌丝程序员的分享

目录 闲扯 关于chatgpt的看法 关于学习工作之外的事情 关于提升自我&#xff0c;避免内耗的事情 写在最后 闲扯 现在是2023.11.8日晚上10.37分&#xff0c;刚结束完今天的任务&#xff0c;今天过的很累&#xff0c;今年过的很快&#xff0c;今年基本过的也很不如意&#x…

eventbus,在this.$on监听事件时无法在获取数据

问题&#xff1a;vue中eventbus被多次触发&#xff0c;在this.$on监听事件时&#xff0c;内部的this发生改变导致&#xff0c;无法在vue实例中添加数据。 项目场景 一开始的需求是这样的&#xff0c;为了实现两个组件(A.vue ,B.vue)之间的数据传递。 页面A&#xff0c;点击页面…

sql_lab之sqli中的宽字节注入(less32)

宽字节注入&#xff08;less-32&#xff09; 1.判断注入类型 http://127.0.0.3/less-32/?id1 http://127.0.0.3/less-32/?id1 出现 \’ 则证明是宽字节注入 2.构成闭环 http://127.0.0.3/less-32/?id1%df -- s 显示登录成功则构成闭环 3.查询字段数 http://127.0.0.3/…

7. 结构型模式 - 代理模式

亦称&#xff1a; Proxy 意图 代理模式是一种结构型设计模式&#xff0c; 让你能够提供对象的替代品或其占位符。 代理控制着对于原对象的访问&#xff0c; 并允许在将请求提交给对象前后进行一些处理。 问题 为什么要控制对于某个对象的访问呢&#xff1f; 举个例子&#xff…

Ubuntu 常用命令之 mkfs 命令用法介绍

&#x1f4d1;Linux/Ubuntu 常用命令归类整理 mkfs 是在 Linux 和其他 Unix-like 系统中用于创建文件系统的命令。在 Ubuntu 系统中&#xff0c;mkfs 命令也是用于创建文件系统的。mkfs 是一个包装器&#xff0c;它会根据用户指定的文件系统类型调用相应的程序。 mkfs 命令的…

Guava的TypeToken在泛型编程中的应用

第1章&#xff1a;引言 在Java世界里&#xff0c;泛型是个相当棒的概念&#xff0c;能让代码更加灵活和类型安全。但是&#xff0c;泛型也带来了一些挑战&#xff0c;特别是当涉及到类型擦除时。这就是TypeToken大显身手的时候&#xff01; 作为Java程序员的咱们&#xff0c;…

【ITK库学习】使用itk库进行图像配准:内插器(插值)

目录 1、itkNearestNeighborInterpolateImageFunction 最近点插值2、itkLinearInterpolateImageFunction 线性插值3、itkBSplineInterpolateImageFunction B样条插值4、itkWindowedSincInterpolateImageFunction 窗口化Sinc插值5、itkRayCastInterpolateImageFunction 投射插值…

Mac OS 13+,Apple Silicon,删除OBS虚拟摄像头(virtual camera),

原文链接: https://www.reddit.com/r/MacOS/comments/142cv OBS为了捕获摄像头视频,将虚拟摄像头插件内置为系统插件了.如下 直接删除没有权限的,要删除他,在mac os 13以后,需要关闭先关闭苹果系统的完整性保护(SIP) Apple 芯片(M1,....)的恢复模式分为两种,回退恢复模式,和…

MySQL数据库 视图

目录 视图概述 语法 检查选项 视图的更新 视图作用 案例 视图概述 视图(View)是一种虚拟存在的表。视图中的数据并不在数据库中实际存在&#xff0c;行和列数据来自定义视图的查询中使用的表&#xff0c;并且是在使用视图时动态生成的。 通俗的讲&#xff0c;视图只保存…