这次做业的要求是查询给出的由uml类图解析出来的文件包含了多少个类,每一个类的属性,操做以及操做可见性、关联对端、接口的实现和继承状况等等共计十条指令,所以在最初设计架构的时候我以为把元素分红类和接口两大类比较合适,所以有了上图总览中的TryClass和MyIntergrace两个本身定义的类,分别用来实现类和接口相关数据的整合,这是一个总的框架,大体是把数据分散到不一样的子树下,而后在MyUmlInteraction里面进行查询数据的操做,该类中只保存数据的索引列表。
java
在进一步实现的时候,我考虑到查询和存储以及时间性能的须要,决定在查询机制中采用电梯的调度策略,在进行一次查询的时候存储通过的全部可能被查询的中间值,这种策略相比于构造时一次性计算出查询结果,提升了性能,但也带来了代码量增大的问题,所以,我考虑到将MyUmlInteraction里面用于计算的部分也迁移到对应的TryClass或者MyIntergrace类中,将数据和查询部分完全分离,可是考虑到代码已经基本完成,就没有再进一步优化,只是简化了MyUmlInteraction中的HashMap索引结构。正则表达式
算法部分,一部分查询计算为了简化代码和电梯算法实现缓存的缘由,采用了递归算法,最终问题也就出如今了递归算法上,也就是递归的起始,过程,返回与复原并无处理好,致使出现了一些问题,该部分在下一次做业中受到了重视。算法
第二次做业在第一次做业的基础上增长了三条状态图的查询指令、三条顺序图的查询指令和三条规则检测,所以能够直接将第一次的代码复用。但因为规则检查须要用到第一次代码的一些数据,所以没有采用继承的方式,同时,又以为改为数据和查询分离的模式更改部分太多,担忧出现错误,所以,将部分第一次做业代码写入Lib这个类做为方法调用,同时在实现第二次做业的时候彻底采用了树形结构,在做为查询类的MyUmlGenerallnteraction中只保存了用来检索数据的索引,方法直接调用对应元素类的方法,也就是计算只在MyUmlGenerallnteraction的下级进行,本级只进行单纯的查询操做。更改成这种模式的架构后,代码的解耦就很顺利,层层分离,对下级方法只须要传递元素的索引便可,层次比第一次做业清晰。编程
这种架构模式带来的体验就是,在修改代码时不会出现粘连的情形,逐行排查代码问题的时候也不会影响上层或者下层代码,无论是排查仍是修改层次都变得很清楚,我认为是一个比较完善的架构。但存在的麻烦是,对于输入数据的处理没有解耦,依然是一个大块,这一点由于影响不是很大就没有解决。设计模式
虽然第一次做业历时比较就久远了,但依然给我留下了较深的印象。按照最后一次理论课的说法,第一次做业是逐步引入不一样的项而且逐步引入组合规则,可是,我实际完成这三次做业并非这个感觉。第一次和第二次做业个人重点基本上都在正则表达式的运用上,以后对数据的推理和数据的处理反而在其次,第一次做业我甚至只提交了一个类就完成了全部的工做,根本不可能有什么层次化抽象和归一化处理,并且这一单元重点介绍的继承和接口在前两次做业中根本没有用过。缓存
而后就是给我留下了深入印象的第三次做业,从看完指导书到结束设计开始进入编码,这一过程我用了两天,也是这两天我基本搞懂了什么是层次化抽象,以及继承和接口究竟有什么用,而对OO的模糊认识也有了一个较大的飞跃,从一个文件一会儿跨到了9个文件,开始习惯从逻辑上对需求进行分层和分类,而不是和之前同样直接开始写代码,边写边构思。数据结构
实际上这里我对OO和其架构设计的理解,基本就是从逻辑上解耦,以第三次做业为例,将式子拆解成一个个类别下的小块,而后小块将本身完成任务,也就是将信息分解并层次化,后续做业的架构设计基本都包含了这一设计思路。多线程
第二单元引入了一个全新的概念,多线程。这一部分我以为和个人相性至关高,多是由于日常我就是一个比较喜欢同步作事情的人。这一部分引入的并发、调度等概念,以及观察者模式、工厂模式、生产者-消费者模式、订阅-发布模式、哲学家就餐等设计模式同时在多门课程上进行了讲解,包括C++、OS等,所以理解起来相对简单。架构
这一部分设计架构主要借鉴了这几个设计思路:一、寻找共享数据并将其与线程等分离;二、将属性与方法与线程挂钩,设计线程之间的同步和互斥关系;三、管理线程间的同步和互斥。架构的具体设计主要采用了调度器和电梯分离的模式,电梯只负责本身的运行,由调度器根据电梯的运行状况和当前用户列表进行分配。架构的具体细节上,以第三次做业为例,由于只有三部属性不一样的电梯,没有采用工厂模式,并且由于是调度器分配任务给电梯,没有采用观察者模式,而是纯粹的信息传输的模式,而对电梯和调度的内部,架构只划分到了方法的层次,调度器的划分是根据功能,如分类、查询和搜索,电梯的划分是根据类别,上行和下行,这些划分的形式并不适合于扩展,但在代码的可读性和修改方面仍是有一些便利之处。并发
并且,因为第二次和第三做业的区别不大,第三次的做业框架基本沿用了第二次,只作了一些适应性改变,对此次做业来讲,架构的设计仍是蛮合理的。
第三单元主要讲解了面向对象过程当中的一个重要的方法或者说工具,jml规格。
这一单元的重点不是架构设计,而是如何读懂和根据须要写jml规格。jml规格对于开发人员和设计人员来讲是一个很是重要的沟通利器,尤为对开发人员来讲,jml规格减小了对需求理解的二义性。
因此我以为这一单元对架构的没有要求,主要是感觉jml规格的便利性和重要以及对jml规格的理解。
第四单元讲的是uml类图,对于程序设计上的侧重能够说不多,主要在如何使用uml绘图软件来完成程序的需求设计工做,架构方面仍是采用了第一单元学习到的分类和分层的思想,主要的OO方法为逐步引入的uml的模型的理解、语义和语法规则、以及对uml图的结构化解析。
这一单元和上一单元相似,做业只是学习的辅助工具,是为了增长对uml图的理解而服务的,做业自己的难度比较低,重点在全面地理解uml图的元素含义及如何使用uml图来完成本身根据需求要实现的代码的层次结构和功能。
四个单元过去,个人架构设计能力和思想能够说有较为稳健的提高的话,那么对于测试,个人提高很是有限。在第一单元的时候,个人测试主要是手动编写一些临界条件测试或者较为全面的功能普查性测试,这些测试的用处不小但都有一个较为局限的问题,他们都出自个人理解,也就是只要我考虑了的问题,那么我都会写对应部分的代码,所以我所谓的测试,其实测试的不是程序功能的面向需求的正确性,而是程序功能面向我理解的正确性,而我理解的正确性没法确保,这一问题到了第四单元集中爆发。其次,我没有像水群和讨论区中采用了什么对拍器和规格化单元测试对每一次做业进行测试,最多只是使用了数据生成器对程序进行了手动的较大规模的普查,并且在第二和第三单元的时候我对测试的重视比较低,也没有耐心对代码进行普查,所以有两次强测得了很是低的分数。到了第四单元,为了确保代码的正确,第一次做业我编写了较为完善的测试样例,有效果,但没有根治代码的bug,强测依然出现了小毛病,所以,到了第二次做业,我直接对代码挨行进行检查,效果我的认为比编写测试样例要强,可是比较费精力。
综上,我以为往后对代码的检查,能够采用以代码逐行检查为主,样例测试和规格检查为辅助的形式。
首先,这个课程带我了解了什么叫作面向对象编程。目前,我所认识的面向对象编程就是与以往的的编程相比,面向对象更倾向于在寻找解决具体问题的数据结构和算法以前,先对抽象的问题进行抽象的处理,也就是所谓的对象,而后在这个基础上,由上而下地逐步填满包括数据结构和算法在内的诸多层次。而以往的编程模式,有三个特色,第1、问题是具体而特定的;第2、对于程序地总体架构考虑较少或不考虑;第3、程序的体量小,独立性强。而面向对象须要考虑复杂、多样且抽象的问题,架构是必须考虑的内容,程序的体量较大并且程序之间存在逻辑上的关系。所以,这四个单元的做业带给个人最大的收获就是对面向对象入门级的了解和体验以及对架构设计的理解和重视。
其次,四个单元的做业也伴随了四个单元的测试,虽然在这个过程当中我没有尝试太多的新的测试方法,但对于本来的以测试样例为核心的测试模式有了新的感悟,对测试样例的编写有了新的体会。同时,也肯定了以阅读代码为核心的检查方式的必要性,
再次,这四个单元经过事实告诉了我一我的的力量是有极限的,尤为是第四个单元,若是不是水群里群策群力,讨论区里互相帮助,以及私下和同窗的讨论,最后一次做业将会面临彻底不知道指导书要求标准的尴尬状况,所以,团队合做是很是重要的,并且必须主动地寻求交流和合做。
最后,感谢这个课程告知的多线程概念,让我第一次明白了所谓的并行执行是怎么用代码实现的,补充了我对代码理解的局限,同时展现了代码可以实现计算机功能的一个新的领域。而在第二单元上手编写了一次代码,也让我对多线程运行有了真实的体会。
一、第一单元多项式求导的跨越性太大,从假期给的小的java程序体验题目到第一单元的继承多态封装等抽象概念的跨度太大,能够看出老师和助教但愿经过三次做业实现过分学习,可是,我以为这个过分并无作好,变相致使第三次做业难度骤然上升。我以为对第一单元的三次做业的要求能够提升一些,加入诸如必须使用继承、接口等的条件,以及能够把第四单元的uml类图部分提早到第一单元,做为形式上的辅助。
二、第四单元的指导书是但愿同窗经过解析uml图的元素来学习uml图的诸多含义和画法,我以为这一部分单独放出来有些多余,不如放入第一单元做为辅助性工具进行学习,而把结构解析单独列出来做为一单元,解析更复杂的数据模型,做为学期总结把以前学过的继承、多线程等都用上,做为一个大做业来完成。
三、关于实验课,实验课的游戏体验很是差,上午刚听讲完下午就要尝试作,并且只有不到两个小时的时间,时间紧张,内容不熟,感受彻底起不到实践上午学习知识的做用,不如把实验课的内容放到课后做为课后做业,实验课留做课后做业的时间,也不须要要求同窗必须到机房,而是自选是否到场,到场的同窗能够向助教咨询问题等。