UML统一建模语言笔记

新生代码农如何在硝烟弥漫的商业丛林中生存和崛起? 洞见,让一部分先遇见未来。

最近公司技术部在组织架构师培训,有幸参与。导师老刘特别推荐了UML语言的学习。回想多年来,自己习惯做一些流程图,框图或者所谓的系统架构图也是有的,但是总觉得不太专业。

一方面,有些图是自己的发挥,没有固定的规则。

另一方面,没有使用"行话",不利于和需求方或者技术人员沟通。


Unified Modeling Language (UML)又称统一建模语言或标准建模语言,它早已经是软件行业被认可的统一建模语言。并且,UML为我们提供了用例图,对象图,顺序图,通信图,类图,状态图,活动图,包图,构件图,部署图等可以表示从需求到软件设计过程中的各种场景。掌握UML,可以更好的帮助技术开发人员提高软件架构设计能力。以下是其中一堂课的设计题目和自己的设计,没有标准答案。感兴趣的童鞋可以尝试画一画。


题目


alt text


设计


看了需求文档,对贪吃蛇游戏的需求理解可以大致如下流程:

alt text

UML静态类图以下类图基于代码文件renewofsnake.html

alt text


总结


逐渐对类图的组合和聚合关系有了更深理解。但每次画图总感觉,类图不能完全表达自己的意思,可能需要配合多种图才更全面。不知道理解的对不对。设计的事情仁者见仁智者见智,没有最好, 只有更好。坚持去做了,一定会有成长。


码农商业参谋.jpg

 

本文转载于网络 如有侵权请联系删除

相关文章

  • Java随机生成常用汉字验证码

    importjava.awt.Color; importjava.awt.Font; importjava.awt.Graphics; importjava.awt.Graphics2D; importjava.awt.image.BufferedImage; importjava.io.IOException; importjava.util.Random; importjavax.imageio.ImageIO; importjavax.servlet.ServletException; importjavax.servlet.http.HttpServlet; importjavax.servlet.http.HttpServletRequest; importjavax.servlet.http.HttpServletResponse; /** 生成随机汉字 */ publicclassDrawImageextendsHttpServlet{ publicstaticfinalintWIDTH=120; publicstaticfinalintHEIGHT=30; publ

  • 【NGINX入门】3.Nginx的缓存服务器proxy_cache配置

    1.摘要本文介绍NGINX缓存机制,配置和参数说明。2.内容2.1nginx缓存的优点如图所示,nginx缓存,可以在一定程度上,减少源服务器的处理请求压力。因为静态文件(比如css,js,图片)中,很多都是不经常更新的。nginx使用proxy_cache将用户的请求缓存到本地一个目录。下一个相同请求可以直接调取缓存文件,就不用去请求服务器了。毕竟,IO密集型服务的处理是nginx的强项。Nginx的缓存加速功能是由proxy_cache(用于反向代理和静态缓存)和fastcgi_cache(PHP动态缓存)两个功能模块完成。Nginx缓存特点:缓存稳定,运行速度与Squid相差无几(因为都使用硬盘缓存);对多核CPU的利用率比其他的开源软件好;支持高并发请求数,能同时承受更多的访问请求;2.2如何进行设置先上个例子:http{ proxy_connect_timeout10; proxy_read_timeout180; proxy_send_timeout5; proxy_buffer_size16k; proxy_buffers432k; proxy_busy_buffers_

  • 聊聊golang的zap的marshaler

    序本文主要研究一下golang的zap的marshalerObjectMarshalerzap@v1.16.0/zapcore/marshaler.gotypeObjectMarshalerinterface{ MarshalLogObject(ObjectEncoder)error } //ObjectMarshalerFuncisatypeadapterthatturnsafunctionintoan //ObjectMarshaler. typeObjectMarshalerFuncfunc(ObjectEncoder)error //MarshalLogObjectcallstheunderlyingfunction. func(fObjectMarshalerFunc)MarshalLogObject(encObjectEncoder)error{ returnf(enc) }复制ObjectMarshaler接口定义了MarshalLogObject方法;ObjectMarshalerFunc类型定义了MarshalLogObject方法,使得ObjectMarshale

  • 让我们挖吧——Logminer(3)Lo

    终于到了真正的操作篇,不过Logminer的操作真的是很简单,关键还是当中的一些原理和如何合理应用Logminer。再回顾一下之前的准备工作:ALTERDATABASEADDSUPPLEMENTALLOGDATA;附加日志功能开启ALTERDATABASEFORCELOGGING;(这个没说,不过防止nologging,这个o小白在之前的文章中提过)@$ORACLE_HOME/rdbms/admin/dbmslm.sql;@$ORACLE_HOME/rdbms/admin/dbmslmd.sql;运行这两个脚本,建立DBMS_LOGMNR和DBMS_LOGMNR_D这两个包,建立必要的存储过程和动态视图。altersystemsetutl_file_dir=’/home/oracle/logminer’scope=spfile;数据字典文件所在目录,需要注意的是只能修改参数文件的值,也就是修改后必须重启数据库。execute dbms_logmnr_d.build(dictionary_filename => 'logminer_dict.ora',dicti

  • [Go] golang定时器与redis结合

    golang定时器与redis结合,每隔1秒ping一下,每隔20秒llen一下队列的长度packagemain import( "fmt" "time" "github.com/go-redis/redis" ) var( client*redis.Client ) funcmain(){ client=redis.NewClient(&redis.Options{ Addr:"xxx:xxxx", Password:"", DB:0, }) t:=time.NewTicker(time.Second) t1:=time.NewTicker(time.Second*20) for{ select{ case<-t.C: pong,_:=client.Ping().Result() fmt.Println(pong) case<-t1.C: num,_:=client.LLen("ent_imap_lz").Result() fmt.P

  • Python 基于Python实现的ssh兼sftp客户端(上)

    实现功能实现ssh客户端兼ftp客户端:实现远程连接,执行linux命令,上传下载文件测试环境Win764位Python3.3.4paramiko1.15.2下载地址:https://pypi.python.org/pypi/paramiko/1.15.2https://pan.baidu.com/s/1i4SJ1CLcryptography-1.0-cp34-none-win_amd64.whl(如果paramiko可以正常安装完,则不需要安装该类库)下载地址:https://pypi.python.org/pypi/cryptography/1.0https://pan.baidu.com/s/1jIRBJvg安装好后,找到nt.py(本例中路径为:Lib\site-packages\pycrypto-2.6.1-py3.4-win-amd64.egg\Crypto\Random\OSRNG\nt.py),修改importwinrandom为fromCrypto.Random.OSRNGimportwinrandom如下#importwinrandomfromCrypto.Rand

  • 使用Git Bash上传文件及更新代码到GitHub教程

    使用GitBash上传文件及更新代码到GitHub教程,其实对于一个github来说已经给出了比较好的说明了。 基本步骤下面来实际操作下: 以D:\github文件夹为例。 首先启动gitbash$cdD:\github $gitinit复制第二步: 填写一些基本的信息。 第三步:建立git仓库gitinit复制第四步:将项目的所有文件添加到仓库中gitadd.复制第五步:gitaddREADME.md复制第六步:提交到仓库gitcommit-m"注释语句"复制 第七步:将本地的仓库关联到GitHub,后面的https改成刚刚自己的地址,上面的红框处gitremoteaddoriginhttps://github.com/h-WAVES/test0913复制第八步:上传github之前pull一下gitpulloriginmaster复制第九步:上传代码到GitHub远程仓库gitpush-uoriginmaster复制中间可能会让你输入Username和Password,你只要输入github的账号和密码就行了。执行完后,如果没有异常,等待执行完就上传成功了。

  • 怒肝 JavaScript 数据结构 — 树与二叉树

    大家好,我是杨成功。到本篇为止我们已经学习了大多数的顺序数据结构,而第一个非顺序数据结构是散列表。本篇我们学习第二种非顺序数据结构——树,是一个相对复杂的数据结构。生活中提到“树”,我们肯定会想到去公园遛弯时看到的树木。一棵树只有一个主干,但是主干上面会分出无数的树枝,树枝又各自分叉产生新的树枝,这样层层分叉最终变成了我们看到那棵枝繁叶茂的大树。其实数据结构中的树也是一样,最顶部只有一个元素,然后一个元素下包含多个子元素,子元素又包含子元素,层层包含下去,最终组成了一个庞大的数据体。生活中最常见的树的例子,就是公司的组织架构,如图:总裁是最高位置,下面划分了多个副总的岗位,副总下又划分经理,层层划分,形成了树状结构。现在你明白数据结构中的“树”是什么了吧?树的相关术语树的每个元素被称为节点,一个树结构包含了一系列父子关系的节点。最顶层的那个节点被称为根节点,其他节点全部是它的子节点。如图,节点分为内部节点和外部节点。只要有子节点的就是内部节点,最外层的没有子节点的节点,就是外部节点,也叫叶节点。一个节点的层级关系总体上分为三种:父节点兄弟节点子节点比如图中的节点5,父节点是7,兄弟节点

  • 有点纠结,何去何从

    现在真的有点纠结,公司貌似是开不下去了,老板要回国了,但是谈了个项目,把我安排到另外一家公司去了,老板说是跟那家公司合作,o(︶︿︶)o唉。 其实这不是真正纠结的东西。主要是我感觉我现在做的东西偏离了我原来的轨道了。最初我是做VC界面开发的,主要是VC上位机界面和下位机通过usb或串口通信这方面的,但是后来因为前个公司没这方面的需求了,所以换到现在的公司做界面开发。但是现在的公司是做外包的,老板是个做技术出身的,市场跑的不行,也没什么界面的东西要做,根据老板的要求,我学习了android应用的开发,也学习了点用asp.net做网页,只是简简单点的东西。 现在老板要撤了,把我安排到合作的公司去,但是要做的东西我之前没做过啊,要做网站,o(︶︿︶)o唉。做网站也就罢了吧,我这还没做过网站呢,他就要求做个通用的网站,做个框架,以后也可以卖给别的公司,我了个去,老大啊,我还不会走呢,你就让我跑啊,我连网页还没堆起来呢,你要我做网站,前台后台都要做,还要通用,哎吆我去了。 真不知道我该咋办了......

  • 答辩流程

    一、首先是开场白: 各位老师,上午好!我叫……,是……级……班的学生,我的论文题目是……。论文是在……导师的悉心指点下完成的,在这里我向我的导师表示深深的谢意,向各位老师不辞辛苦参加我的论文答辩表示衷心的感谢,并对三年来我有机会聆听教诲的各位老师表示由衷的敬意。下面我将本论文设计的目的和主要内容向各位老师作一汇报,恳请各位老师批评指导。 二、内容 首先,我想谈谈这个毕业论文设计的目的及意义。…… 其次,我想谈谈这篇论文的结构和主要内容。 本文分成……个部分. 第一部分是……。这部分主要论述…… 第二部分是……。这部分分析…… 第三部分是…… 三、结束语 最后,我想谈谈这篇论文和系统存在的不足。 这篇论文的写作以及修改的过程,也是我越来越认识到自己知识与经验缺乏的过程。虽然,我尽可能地收集材料,竭尽所能运用自己所学的知识进行论文写作,但论文还是存在许多不足之处,有待改进。请各位评委老师多批评指正,让我在今后的学习中学到更多。 谢谢! 四、老师提问 答辩的准备工作学生可以从下列问题(第410题)中,根据自己实际,选取二三个问题,作好汇报准备,(第13题必选)。时间一般不超过10分钟。内容最

  • 【转】html之file标签 --- 图片上传前预览 -- FileReader

      记得以前做网站时,曾经需要实现一个图片上传到服务器前,先预览的功能。当时用html的<inputtype="file"/>标签一直实现不了,最后舍弃了这个标签,使用了其他方式来实现了这个功能。   今天无意发现了一个知识点,用html的file标签就能实现图片上传前预览,感觉很棒,记录一下!就是通过file标签和js的FileReader接口,把选择的图片文件调用readAsDataURL方法,把图片数据转成base64字符串形式显示在页面上。 1、闲话少说,测试一下,图片上传前预览(选择图片):    实现代码: <divstyle="border:2pxdashedred;"> <p> 图片上传前预览:<inputtype="file"id="xdaTanFileImg"onchange="

  • Android热修复框架之优逆势分析(Hotfix)

    重新整理了一篇更详细的,请移步Android热修复技术原理 Android平台出现了一些优秀的热更新方案,主要可以分为4类: 基于InstantRun热插拔方案:美团的Robust(实时修复)   Robust插件对每个产品代码的每个函数都在编译打包阶段自动的插入了一段代码,对方法进行了Hook,类似AOP的方式。 基于multidex的热修复方案:代表有Qzone的超级补丁、大众点评的Nuwa、百度金融的RocooFix、饿了么的Amigo和微信的Tinker(也可以修复so和资源)等(重新冷启动修复)   需要反射更改DexElements,改变Dex的加载顺序,这使得patch需要在下次启动时才能生效,实时性就受到了影响,同时这种方案在androidN[speed-profile]编译模式下可能会有问题。 基于nativehook方案:如阿里开源的Andfix和Dexposed(实时修复)   需要针对dalvik虚拟机和art虚拟机做适配,需要考虑指令集的兼容问题,需要native代码支持,兼容性上会有一定的影响; 基于阿里混合模式:阿里没有开源的Sophix(兼

  • vue项目在微信中打开是好的,用支付宝打开页面空白?

      今天晚上项目上线,在微信环境里一切正常,然后放到支付宝里懵了,一片空白。一开始以为是配置问题,然后就没在意,后来生产了,还是出现这种问题,用ios的支付宝打开正常,和同伴找了半天,发现是严格模式的问题,微信里有内置浏览器,所以没有这个问题,然而安卓版支付宝用的是手机自带浏览器,不支持严格模式,故出现这种问题。    打算用webpack在打包的时候取消严格模式,然而并没有成功,只能先用笨方法把编译生成的严格模式的代码去掉,先上线再说,问题暂时解决。下面就研究怎么在编译的时候去掉严格模式。  

  • python学习笔记(76) 索引

    descuserinfo3;  #显示所有列   普通索引:   index索引名(列名)  #创建表的时候   creatindex索引名on表名(列名)   dropindex 索引名on表名 唯一索引:   unique索引名(列名)  #创建表的时候   creatuniqueindex索引名on表名(列名)   dropuniqueindex 索引名on表名 联合(组合)索引:    creatindex索引名on表名(列名,列名)  #unique同理   dropindex 索引名on表名 主键:   primarykey(列名)   altertable表名addprimarykey(列名)  #后天创建   作用:   约束   加速查找 索引:   普通索引:加速查找   主键索引:加速查找+不能为空+不能重复   唯一索引:加速查找 +不能重复   联合索引(多列):     联合主键索引     联合唯一索引     联合普通索引     最左前缀匹配 加速查找:   select*fromtb1whe

  • linux命令大全

    1.启动,关机,登入,登出相关命令 登录:login登出:logout登出:exit停止系统:shutdown停止系统:halt重启动:reboot切断电源:poweroff把内存里的内容写入磁盘:sync安装lilo启动管理程序:lilo安装lilo启动管理程序:grub 2.Shell相关命令 切换Shell:chsh显示命令履历:history设置命令别名:alias取消命令别名:unalias显示命令所在位置:which查询命令种类:type显示字符串或者变量内容:echo设置/显示Shell变量:set显示环境变量:printenv设置环境变量:export设置临时环境变量:env释放环境变量:unset设置环境变量:setenv释放环境变量:unsetenv执行文件当中的命令:source查询命令手册:man查询超文本命令手册:info显示命令简介:whatisapropos通过关键字查询手册:apropos 3.用户管理相关命令 切换到其他用户:su追加用户:useradd追加用户:adduser删除用户:userdel修改用户设置:usermod修改用户私人信息:chf

  • 「学习笔记」AC自动机

    还记得2019年暑假,gy在英乐华翻开ybt提高篇的目录 概述 通常来讲,KMP算法用来处理单模式串匹配问题。而若要处理多模式串的问题,就要引出AC自动机。 AC自动机是以Trie的结构为基础,结合KMP的思想建立的。 步骤 将所有模式串构建成一棵Trie树 对Trie上所有节点构造失配指针(最长后缀) 利用失配指针对主串进行匹配。 流程 构建指针 记\(tr[p][c]=v\)表示结点\(v\)的父结点\(p\)通过字符\(c\)指向\(v\)。 记\(fail[u]\)表示\(u\)的失配指针,即\(u\)的最长后缀。 若\(tr[u][i]\)存在,则\(fail[tr[u][i]]\)可以由\(fail[u]\)增加一个字符\(i\)得到 否则,直接将\(tr[u][i]\)指向\(tr[fail[u]][i]\)的状态 voidbuild(){ for(inti=0;i<26;i++) if(tr[0][i])q.push(tr[0][i]); while(q.size()){ intu=q.front(); q.pop(); for

  • C# 计算两个字符串的相似度

    我们在做数据系统的时候,经常会用到模糊搜索,但是,数据库提供的模糊搜索并不具备按照相关度进行排序的功能。 现在提供一个比较两个字符串相似度的方法。 通过计算出两个字符串的相似度,就可以通过Linq在内存中对数据进行排序和筛选,选出和目标字符串最相似的一个结果。 本次所用到的相似度计算公式是相似度=Kq*q/(Kq*q+Kr*r+Ks*s)(Kq>0,Kr>=0,Ka>=0) 其中,q是字符串1和字符串2中都存在的单词的总数,s是字符串1中存在,字符串2中不存在的单词总数,r是字符串2中存在,字符串1中不存在的单词总数.Kq,Kr和ka分别是q,r,s的权重,根据实际的计算情况,我们设Kq=2,Kr=Ks=1. 根据这个相似度计算公式,得出以下程序代码: ///<summary> ///获取两个字符串的相似度 ///</summary> ///<paramname=”sourceString”>第一个字符串</param> ///<paramname=”str”>第二个字符串</param> //

  • Mysql 操作

    1,数据库定义语言(DDL)   ①create:用于创建数据库、表、索引、视图等;   ②alter:用于修改数据库、表、索引、视图等;   ③drop:用于删除数据库、表、索引、视图、用户等。 2,数据库操作语言(DML)   ①insert:用于插入数据(如在指定列插入数据、对表中所有列进行数据插入、多条记录的插入等);   ②update:用于修改表中的数据(执行过程:先删除旧的数据,旧的数据存储在deleted中,再插入新的数据,插入后的数据保存在inserted中);   ③delete:用于删除表中的数据。 3,数据库查询语言(DQL)   使用select语句查询表中的数据,如简单查询、条件查询、连接查询、子查询等;   建议:在实际的开发中,应该减少使用select*语句及嵌套子查询。 4,数据库控制语言(DCL)   ①grant:授予用户某种权利,即让用户对某表或某库拥有一定的操作权限;   ②revoke:收回用户手中拥有的权利,使其不能操作对应的库或表等;   ③commit:用于提交事务。当涉及事务的操作执行过程中满足事务的ACID时,触发commit的执行

  • 【转】Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

    Memcached Memcached是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载。它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态、数据库驱动网站的速度。Memcached基于一个存储键/值对的hashmap。其守护进程(daemon)是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信。 Memcached安装和基本使用 Memcached安装: wgethttp://memcached.org/latest tar-zxvfmemcached-1.x.x.tar.gz cdmemcached-1.x.x ./configure&&make&&maketest&&sudomakeinstall PS:依赖libevent yuminstalllibevent-devel apt-getinstalllibevent-dev 复制 启动Memcached memcached-d-m10-uroot-l10.211.55.4-p12000-c256-

  • 动态页面,登陆,注册,留言 JSP

    登陆页   主要使用html表单,javascript验证注册信息 <%@pagelanguage="java"contentType="text/html;charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPEhtmlPUBLIC"-//W3C//DTDHTML4.01Transitional//EN""http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <metahttp-equiv="Content-Type"content="text/html;charset=UTF-8"> <title>登陆页</title> <scripttype="text/javascript"> functioncheck() { varuid=document.getElementById("userid"); if(uid.value=="") { alert("请输入用户名");

  • .NET Core 处理 WebAPI JSON 返回烦人的null为空

    前言    项目开发中不管是前台还是后台都会遇到烦人的null,数据库表中字段允许空值,则代码实体类中对应的字段类型为可空类型Nullable<>,如int?,DateTime?,null值字段序列化返回的值都为null,前台对应字段赋值需要做null值判断,怎么才能全局把null替换为空。     本文分享WebAPI接口服务统一返回null替换为空的方法。 一、分析问题     .NETCore中使用Newtonsoft.Json进行序列化,WebAPI接口返回格式通过Startup.cs类全局设置。想是否可以通过配置把null替换为空值?于是找到了Newtonsoft.Json在序列化和反序列化期间如何处理空值和默认值的属性,具体配置代码如下: 1publicvoidConfigureServices(IServiceCollectionservices) 2{ 3//配置Mvc+json序列化 4services.AddMvc() 5.AddNewtons

相关推荐

推荐阅读