更多参考:http://www.javashuo.com/article/p-fgcthskj-da.html
http://www.javashuo.com/article/p-ovmgsvmj-cq.htmlhtmlUML顺序图http://www.javashuo.com/article/p-xnhtilmq-cb.html
UML状态图https://blog.csdn.net/w36680130/article/details/81014032java
经过StarUML和notepad++工具查看并总结程序员
UML将类(class)、接口(interface)、方法操做(operation)、属性(attribute)等都视为对象元素(UMLelement),UMLModel容器管理着模型的全部元素算法
UMLModel描述各类<UML***>类型元素及其关系(一种图数据结构)……图片来自同窗大佬编程
UML:接口能够继承接口,也能够实现接口;
Java:接口能够继承接口,但不能够实现接口。设计模式
B.attriCount = A.attriCount + B.self.attriCount (rule 1)
B.operaCount = A.operaCount + B.self.operaCount (rule 2)
关联正常状况下会有两个end元素,都是AssociationEnd类别
navigable(关联方向),reference同上,navigable为false(未打勾)的时候表明指向类,为true(打勾)时表明可被指向类
答案是确定的,子类拥有父类的全部关联关系,类能够自关联,自关联至关于两次关联
F.assoCount = D.assoCount + F.self.assoCount (rule 3)
缓存
实质上,UML层次已经显示出来了,经过ref(隐式指针)和_parentId来链接各个树结构造成森林安全
collaboration和Model同层次,Role与interaction(交互行为)为该顺序图的上层,拥有如下的交互对象,sequence,participant 参与交互的对象数据结构
功能:获取参与对象数,获取消息数,获取对象的进入消息数多线程
每条生命线对应一个对象
UMLMessage的数量
接收到的消息数量
StateMachine和Model同层次
状态图表示一个类的行为,功能:获取状态数,获取状态机转移数,获取后继状态数
UMLState元素,可直接得到状态名称
又是一个递归建图的问题,经过该状态UMLTransition元素查找
只要可达的状态都算后继状态,注意处理同名同类型的状态(有可能同名但不一样类型)
UMLTransition元素,source&target
- triggers中的UMLEvent 表明转移触发条件,可从UMLEvent元素中得到转移标志名称
具备UML检查规则,即应当知足状态图自身、顺序图自身、类图自身、三个图之间的对应规则
UML基本标准预检查功能
- UML002:不能含有重名的成员。针对类图中的类(UMLClass),其成员属性(UMLAttribute)和关联对端所链接的UMLAssociationEnd不能有重名
- UML008:不能有循环继承。该规则只考虑类的继承关系、类和接口之间实现关系,以及接口之间的继承关系。
- UML009:任何一个类或接口不能重复继承另一个接口。该规则考虑类之间的继承关系、接口之间的继承关系,以及类对接口的实现关系,包括直接继承或间接继承。
实现一个UML类图解析器UmlInteraction,能够经过输入各类指令来进行类图有关信息的查询。
查询指令:模型中一共有多少个类、获取类中指定类型的操做(本类本身定义的)数量、类中的属性有多少个、类有几个关联、类的关联的对端是哪些类、类的操做可见性、类的属性可见性、类的顶级父类、类实现的所有接口、类是否违背信息隐藏原则。
UML交互接口的实现类MyUmlInteraction
* 经过className创建树结构,每一个class对本身类进行相应的计算
* 经过className映射类元素
* 经过元素自身id映射元素(id不会重复的原则)
* 一个项目有一个Model容器,容器内有多个类、接口等
* 每一个class下有孩子元素,其中Operation元素下还有Parameter元素
* 每一个元素都有成员_parentId, _id, _type, name, type, visibility, direction, source(源),
* target(目标), reference(相关的两个类,正常状况分两个end元素), navigable(关联 方向)等property
本次做业的bug:并不保证输入元素具备顺序性,id是惟一区分元素的标志,类和接口会同名(java中不一样包内容许),父类和子类的属性可同名不一样可见性。
容易出错:类实现的全部接口,包括接口的多继承接口,包括同名不一样id的接口也要列出来;继承父类的关联(父类也可能有继承)。
大多数问题是对类图层次分析不够明确和完全,对mdj代码和UML图型的对应关系没有理解透彻,形成不少考虑没到位,或者理解错误的地方。
自己实现接口的类很少,只有一个实现接口的类,知足用户查询需求。但须要创建数据结构的类很是多,也是本次做业的重点,查询功能的代码不难写,难在创建数据结构和UML层次关系的解析。只要创建好了数据结构,计算结果很容易得出。
经过树和图创建数据结构,经过递归或者dfs搜索计算,代码深度和类图层次关系较为复杂。
在第一次做业基础上,实现一个UML类图、状态图、顺序图解析器UmlGeneralInteraction,能够经过输入各类指令来进行类图有关信息的查询,并可以支持几个基本规则的验证。
查询指令:除第一次外还有:给定状态机模型中一共有多少个状态、给定状态机模型中一共有多少个迁移、给定状态机模型和其中的一个状态,有多少个不一样的后继状态、给定UML顺序图,一共有多少个参与对象、给定UML顺序图,一共有多少个交互消息、给定UML顺序图和参与对象,有多少个incoming消息、模型有效性检查(针对下面给定的模型元素容器,不能含有重名的成员(UML002)、不能有循环继承(UML008)、任何一个类或接口不能重复继承另一个接口(UML009))。
UML交互接口的实现类MyGeneralInteraction
* 经过className等信息创建树结构,每一个class对本身类进行相应的计算
* 经过className映射类元素
* 经过元素自身id映射元素(id不会重复的原则)
实质上,UML层次已经显示出来了,经过ref(隐式指针)和_parentId来链接各个树结构造成森林。
* 一个项目有一个Model容器,容器内有多个类、接口等
* 每一个class下有孩子元素,其中Operation元素下还有Parameter元素
* 每一个元素都有成员_parentId, _id, _type, name, type, visibility, direction, source(源),
* target(目标), reference(相关的两个类,正常状况分两个end元素), navigable(关联 方向)等property
1.计算状态数量的时候初始和结尾状态只算一个
2.一个StateMachine下保证只出现一个Region,且final和pre状态都只做为一个,且一个Machine中状态不重名
3.若是初始或者结尾状态是后继状态算
4.每一个State Machine中,从某个状态到另外一个状态的直接迁移均具备不一样的Event或Guard,即从某个状态到另外一个状态的直接迁移如有多个,则这些迁移必定互不相同。
5.transition的parentid为region,所以用source。
6.容易爆空指针以及递归栈溢出,没有处理好递归边界(循环继承的例子)。
大多数问题是对类图、状态图、顺序图层次以及规则分析不够明确和完全,对mdj代码和UML图型的对应关系没有理解透彻,形成不少考虑没到位,或者理解错误的地方。
自己实现接口的类很少,有实现4个接口的类,在第一次做业上增长状态图、顺序图交互、规则检查接口,知足用户查询需求。但须要创建数据结构的类仍然很是多,总共达到13个类,也是本次做业的重点,查询功能的代码不难写,难在创建数据结构和UML层次关系的解析。只要创建好了数据结构,计算结果很容易得出。
模型图增长了状态图和顺序图,范围广了,但创建数据结构的方法相似第一次。
面向对象设计的初步,刚开始还不太会运用面向对象思想编程,对于求导问题仍是很直接地写面向过程的代码。架构设计几乎也没有,很乱,没有交互层面。一次做业仅仅3-4个类:表达式、主函数、求导、数据结构类。
多线程程序不只有数据结构类、输入输出类,还增长了与需求交互的类,还有多个线程并发的状况——线程类,还有管理(调度)类。第二次做业逐步体现出抽象的过程,将需求和功能分别对应。
JML设计,在这次做业中主要是实现功能接口,也学习到了部分软件工程设计模式(工厂化模式)。这个单元对类的抽象和封装有更高的层次,咱们根据官方接口,实现本身的容器,用于用户查询等操做。在架构设计上,还增长了缓存计算层,将数据层与应用层独立开来。
同第三单元相似,只是在数据结构层上增长了深度和难度,结构观察视角和行为观察视角。设计模式和第三单元差很少,都有缓存计算层,实现接口功能的应用层则更好地体现了用户需求与数据的交互,但不会影响数据结构层。
做业采用了迭代增量的方式每一个单元的三次代码做业,都是基于本来功能进行扩展,增长更多需求和操做。
测试没有太多技巧,主要是经过肉眼观察表达式匹配的字符串,以及碰撞边界特殊表达式的状况,同时,手写评测器疯狂对代码进行测试,虽然效率增长了,但很难保证测试范围和测试质量。
本单元加入多线程,调试难度加大,甚至没法用断点调试以及找出死锁问题。做业的调度算法增长了难度,须要考虑时间优化,因此逻辑上、优化上出现了不少问题。线程调度、线程安全是测试的重点,但测试方法没有找到很合适的。对于输出结果能够利用对拍器自动比较。
经过学习JML语言后,运用jmlunitNG等工具编写测试类进行代码测试。这个单元的bug主要是第三次做业,需求增长到四个计算,显然不少Bug,中测倒数第二个最后关头都没找出来,因此没进互测,而后时间复杂度特别高,对于强侧的数据,简直爆炸了。
修复过程当中,改进了求最短路的算法,修复了超时的问题。对于最低票价和不满意度是最容易存在Bug的,而对于并查集求解基本没有问题。最低票价我采用上文的思路,仍会出现问题,有这几种:单条路径存在环路须要更新权值;每条路径都须要求最短路;新增路径与原有路径存在相同节点也须要更新。
学习了UML模型图以及运用starUml工具进行模型图构建、生成mdj代码,方便观察和测试,同时可使用前几回做业的测试方法和测试类。
学期刚开始,甚至还没开学(还在家里)的时候咱们就接收到本学期面向对象课程预习做业的通知,我也是本学期才接触到Java编程及其面向对象编程思想,整体上的感受就是,这门课程让我从一无所知变成学会了不少编程思想、测试、调试、架构设计、多线程、软件工程设计模式等方法(不过我依然是一个菜鸡)。那么具体来讲一下这门课程中个人收获,以下:
一、熟练掌握Java语言及其IDEA编译器的使用。虽然一个学期的时间很短,可是课程任务不是通常的重,而是超乎常人的重。每周都有相似于大做业、大工程的代码项目,那就是必须在每周前三天较好、较快地完成代码编写、调试和经过基础测试,在经过基础测试后,接着两天内进行同窗之间的匿名互测(互相hack,我学会如何作一名hacker哈哈),最后官方评测系统再根据较强测试进行评分,最后还有几天的bug修复环节。除此以外,每两周有一节上机实验课和一节研讨课,每一单元做业完成后对单元做业进行总结的博客编写(例如如今写的就是)。对于咱们来讲,每周都是紧张的状态,每周的代码量也都充足,因此短短地一学期,可以熟练运用IDEA和Java面向对象设计是一大收获。
二、我的的自学能力和思惟能力获得提升。我我的(或者说大多数人)在这门课程的做业上花费的时间应该是最多的了,这门课程也是最烧脑、最磨时间的课程了。每一个人对程序、工程都有本身的独立思考和转化,能完成这些代码量的程序说难不难,说易也不易,也挺佩服你们的毅力。
三、课程带来了面向对象编程思想和软件设计模式这些新编程方法。这些思想方法更贴近软件的设计和用户的需求,掌握多种设计方法,可以让咱们(程序员)更好地应对客户需求。一开始从面向过程编程到面向对象编程不免会有不适应,没法理解类的封装与独立,熟练以后,以为每一个功能、每一个类别的东西独立开来,还能够互相交互更方便设计。之间加入多线程则更是符合实际生活需求,生活中多线程的例子不少,滴滴打车,银行排队等,这些也在实验课中完成过,多电梯多调度做业也编写过。
四、掌握多种程序测试方法及其本身编写评测器还有bug修复方法。写程序固然少不了测试,谁的程序都避免不了出现bug,bug修复也是一个难题,甚至连bug在哪都有可能找不到。课程增长了同窗之间的hack,不只须要找本身代码的bug也要构造测试用例找别人的bug,在此过程当中也学会了编写基本的对拍器,自动评测器,加快hack效率和质量。在学会jml以后,还运用jmlunit等测试类工具进行测试代码。bug修复不比写代码花的时间少,其实写完代码后发现连基础数据都过不了很正常,如今的程序代码复杂度高,肉眼没法再观察获得了,只能经过调试、结果输出、猜测断定等方法找出bug。
五、如何在短期内写出上千行代码(哈哈哈,这多是程序员最骄傲的收获了,一周内写了上千行代码,是又想吐槽又骄傲又秃头~警告)。
我对本课程满意度仍是挺高的,虽然确实折磨人,不事后来稍微下降了一点难度,内心畅快多了,以前的多线程单元确实头疼,基础测试都没过。高强度、高难度才能训练出好的工程师,这句话实测无错。
提点建议: