摘要
      本文通过对一个“学生选课系统”示例的简要分析与设计,说明UML图之一类图的两种作用及存在形式,以期借此澄清有些朋友可能对类图存在的误解与困惑。

前言
      在OOA与OOD大行其道的今天,UML在系统分析与设计中得到了广泛的采用。而在UML的9种图中,类图是最重要也是使用最普遍的图之一。但是,在与一些朋友,特别是初学者的聊天当中,我发现很多朋友对类图的作用及使用方法存在一定的误解和困惑。于是我写下这篇文章,希望本文能在一定程度上帮助这些朋友更好的认识和使用类图。当然,由于我对UML的认识并不很深刻,所以在文章中有错误和疏漏之处,恳请大家批评指正。

A vs D
      要想正确认识与使用类图,我们首先要正确认识两个概念——“A”和“D”。
      A是Analyse的缩写,即我们所说的“分析”;而D是Design的缩写,即“设计”。一般来说,一个系统在编码前,都要经过分析与设计两个步骤。而对这两个概念认识的模糊不清,正是导致很多朋友无法正确使用类图的原因。
      分析,我对其的解释是:根据用户的需求,做出一系列与业务领域相关而和计算机技术无关的整理与识别。
      
很多朋友有个错误的认识,认为软件开发工作一定要由懂计算机的人完成,不懂计算机的人怎么能进行软件开发呢?当然,对于设计和编码等工作,当然是这样,但是唯有“分析”这一工作,可以由完全不懂计算机的人来进行,甚至从某种程度上说,不懂计算机的人更适合做软件分析师的工作。因为想要把分析做好,一定要仅与业务相关,而抛开具体技术。一个满脑子计算机技术的程序员去做分析时,很容易想到编码、实现、平台、数据库设计等具体细节,这种思维形式恰恰成为做好分析的最大障碍。此为误解一:只有懂计算机技术的人才能做系统分析师。我现在所在的研究所(北京航空航天大学计算机学院软件工程研究所)曾经接过一个日本项目,当时日方那边派来一个系统分析师对计算机就完全是外行,而是一个领域专家,但是他很好的完成了系统分析的工作。
      另外一个误解就是UML图,特别是类图,就是给开发人员用的。很多人觉得UML是计算机业内专业语言,不懂计算机的怎么能用它呢?用了做什么呢?但是很多不懂计算机的系统分析师在进行分析工作时,也在使用UML图,而类图就是其中一种。一般情况下,分析师在进行分析时,确实会绘制一套类图。但是,它所画的类图不管是从视角还是作用,与设计师所做的类图是不同的,具体将在下面介绍。此为误解二:只有计算机人士才使用UML图。
      分析说完了,下面说设计。与分析不同,我对设计的解释是:根据分析材料与技术平台,确定软件系统的架构结构、编码方式及一切与具体技术有关的宏观问题。
      这里可以看到,设计与分析不同,它必须由计算机方面的人来完成,因为它和具体技术是息息相关的。而且,设计师在进行设计时,也会绘制一套类图。
      到这里,我们明确了,原来软件在分析与设计两个阶段各自会绘制一套类图,而且是由分析师和设计师两个不同的角色绘制的。那么这两套类图有什么异同呢?下面将解释这个问题。

领域类图 vs 实现类图
      上文提到,在软件分析与设计过程中,会由两种角色产生两套类图。一般情况下,分析师绘制的类图叫做“领域类图”,而设计师绘制的类图叫做“实现类图”。这里要声明,这两个名词是我的习惯性叫法,并不是大家都认同的通用叫法。下面,我对这两种类图给出我的定义:
      领域类图:产生于分析阶段,由系统分析师绘制,主要作用是描述业务实体的静态结构,包括业务实体、各个业务实体所具有的业务属性及业务操作、业务实体之间具有的关系。
      虽然这个类图也叫“类图”,但是说实话,它和编程中的“类”实在是没啥关系,因为最后的系统中可能根本没有类和它们对应,而且很多最后系统中的类如控制类和界面类这套类图中也没有。也就是说这套图和具体技术无关,也不是画给程序员看的,它只是表达业务领域中的一个静态结构。下面给个例子:

这是一个选课系统的简单领域分析类图。可以看到,主要实体有教师、学生、课程和开课安排。每个实体标注了其在业务上具有的属性和方法。而且图中还标明了实体间的关系。
      但是,最终系统中可能没有一个学生类和其对应。因为最终系统中有哪些类、各个类有什么属性、方法依赖于所选择的平台和架构。例如,如果使用了Struts2,则会存在很多Action类,而使用了ASP.NET MVC,则会有很多Controller类等,所以,领域类图只于业务有关,和具体实现及编码等计算机技术无关。
      下面该说说实现类图了:
      实现类图:产生于设计阶段,由系统设计师绘制,其作用是描述系统的架构结构、指导程序员编码。它包括系统中所有有必要指明的实体类、控制类、界面类及与具体平台有关的所有技术性信息。
      就像上面的领域类图,如果你把它交给程序员编码,我想程序员会疯掉,因为它没有提供任何编码的依据。假如我们使用的是.NET平台分层架构,并使用ASP.NET MVC,则设计师应该在实现类图中绘制出所有的实体类、数据访问类、业务逻辑类和界面类,界面类又分为视图类、控制器类等等,还要表示出IoC和Aop等信息,并明确指出各个类的属性、方法,不能有遗漏,因为最终程序员实现程序的依据就是实现类图。

总结
      最后,我们总结一下本文的要点:
      1.软件分析与设计是编码前的两个阶段,其中分析仅与业务有关,而与技术无关。设计以分析为基础,主要与具体技术有关。
      2.分析阶段由分析师绘制领域类图,设计阶段由设计师绘制实现类图。
      3.领域类图表示系统的静态领域结构,其中的类不与最终程序中的类对应;设计类图表示系统的技术架构,是程序员的编码依据,其中的类与系统中的类对应。
      4.领域类图中类的属性与操作仅关注与业务相关的部分,实现类图中的属性与操作要包括最终需要实现的全部方法与操作。

from: 张洋

正确认识使用UML中的类图——辨析类图的两种存在形式相关推荐

  1. 继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错? springboot 两种方式稳定解决跨域问题

    继承WebMvcConfigurer 和 WebMvcConfigurerAdapter类依然CORS报错???springboot 两种方式稳定解决跨域问题! 之前我写了一篇文章,来解决CORS报错 ...

  2. vue中基于echarts和基于高德地图的两种地图下钻与上浮方式

    ** vue中基于echarts和基于高德地图的两种地图下钻与上浮方式 ** 基于echarts的地图下钻与上浮(浙江省为例) 第一步:在<template>中构建承载echarts的do ...

  3. xlsx怎么设置行高列宽_Excel2016中调整行高和列宽的两种方法

    在报表的编辑过程中经常需要调整特定行的行高或列的列宽,例如当单元格中输入的数据超出该单元格宽度时,需要调整单元格的列宽.本文图文讲述了Excel2016中调整行高和列宽的两种方法. 方法一:使用命令调 ...

  4. 面试中的最常被问到的两种锁

    文章目录 面试中的最常被问到的两种锁 **锁的分类** **乐观锁** **悲观锁** 面试中的最常被问到的两种锁 公众号后台领取更多 面试必看资料 面试中经常被问到的锁到底是哪两种锁呢?接下来我们就 ...

  5. 在面向数据流的设计方法中,一般把数据流图中的数据流划分为 (16) 两种。 答案:C

    在面向数据流的设计方法中,一般把数据流图中的数据流划分为 (16) 两种. (16)A.数据流和事务流 B.变换流和数据流 C.变换流和事务流 D.控制流和事务流 数据流的类型决定映射的方法.数据流有 ...

  6. JUC里面的相关分类|| java并发编程中,关于锁的实现方式有两种synchronized ,Lock || Lock——ReentrantLock||AQS(抽象队列同步器)

    JUC分类 java并发编程中,关于锁的实现方式有两种synchronized ,Lock AQS--AbstractQueuedSynchronizer

  7. 多个html如何套用套一个头部,Vue.js项目中管理每个页面的头部标签的两种方法...

    在 Vue SPA 应用中,如果想要修改 HTML 的头部标签,如页面的 title ,我们只能去修改 index.html 模板文件,但是这个是全局的修改,如何为每个页面都设置不一样的 title ...

  8. java整型转换为数组_基于java中byte数组与int类型的转换(两种方法)

    java中byte数组与int类型的转换,在网络编程中这个算法是最基本的算法,我们都知道,在socket传输中,发送.者接收的数据都是 byte数组,但是int类型是4个byte组成的,如何把一个整形 ...

  9. 19、angular1之pass-word组件、input-select组件 、only-select组件(两种)、on-off组件、layui中的datetime示例、京东购物车、两种作用域绑定、

    19.angular1之pass-word组件.input-select组件 .only-select组件(两种).on-off组件.layui中的datetime示例.京东购物车.两种作用域绑定.两 ...

  10. 会员营销中,转化新用户为会员的两种手段

    就目前的用户运营而言,企业的首要任务就是选择合适的运营方式,为什么这么说呢?这是因为用户运营并不是一句话的问题,它需要企业去实打实的采用手段进行运营,不然是无法调动用户达成想要的效果的,所以企业面对用 ...

最新文章

  1. SAP RETAIL WB02 为门店激活物料分类账报错 - Distribution chain NMI1 00 not valid for retail price determination -
  2. 曲阜有学计算机的学校吗,曲阜职业中专计算机专业课程上几年
  3. 单例模式中的懒汉式以及线程安全性问题
  4. 张秋余---经典语录
  5. 在CDH上用外部Spark2.2.1安装和配置 CarbonData
  6. matlab激光散斑散射半径测量,激光散斑测量2011412225741
  7. Codeforces Round #112 (Div. 2)---A. Supercentral Point
  8. python 截取字符串6位,python按照指定字符或者长度 截取字符串
  9. mac下intellij idea 永久破解
  10. Javascript堆排序
  11. [数位DP]JZOJ 3363 Number
  12. 微处理器OpenRisc、SPARC、RISC-V架构
  13. 10分钟开始使用ICTCLAS Java版
  14. 3D Bounding Box Estimation Using Deep Learning and Geometry
  15. 自动驾驶 6-4 高级转向控制 - MPC Advanced Steering Control - MPC
  16. 全概率公式和贝叶斯公式的定义与说明
  17. 怎样才能叫高级程序员?
  18. js的数据类型,深拷贝和浅拷贝的原理,loda实现一个深拷贝
  19. 如何写一个好的缺陷(Defect)报告
  20. html怎么快捷审查源代码,怎样查看网页源代码和审查元素?

热门文章

  1. 深度 | 宽客玩转华尔街:谁才是新的“华尔街之王”?
  2. 人工智能终于能像人类一样学习,并通过了图灵测试
  3. Java Review - 并发编程_原子操作类LongAdder LongAccumulator剖析
  4. jvm性能调优实战 - 39一次大促导致的内存泄漏和Full GC优化
  5. c语言矩阵乘法优化,c语言矩阵相乘
  6. Error: vue-loader requires @vue/compiler-sfc to be
  7. utorrent设置上传速度_utorrent下载速度慢怎样设置 utorrent常用设置图文教程
  8. python协程实时输出_python协程
  9. 机器学习系列1:单变量线性回归
  10. Docker知识2:安装docker-desktop