算法
本单元架构设计编程
第一次做业安全
第一次做业架构设计比较直接,用一个专门的类存放UML类图,使用 Hashmap 以 UMLCLass
的id为存放每一个类下面的属性,操做,关联,继承关系,接口实现等,对接口之间的继承关系也专门设置一个 Hashmap 存放。这么作的好处是直观,存取方便,但须要注意的是每次对 Hashmap
进行 get()
操做时,须要线判断是否 contains()
,若是不判断直接读取到没有存进Hashmap里的 key
会抛出异常。多线程
本次做业的指令除了求类实现的全部接口以外都比较简单,而因为接口支持多继承关系,在搜索类实现的接口时应该相似对图遍历同样进行bfs搜索,这样能保证求得的接口不重不漏。其他的指令只需在对应的 Hashmap 中找到对应存放的 value
便可。架构
第二次做业编程语言
第二次做业的顺序图和状态图的处理与第一次做业相似,对每一个顺序图与状态图创建相应的 Hashmap 存放相应的数据,存取操做都与第一次做业没有太多差异。因为本次做业对数据进行了很大程度的简化,在考虑状态转移时不用考虑多种特殊状况,只需对最基本的状态转移作处理便可。对后继状态的搜索一样采起了bfs搜索,可以保证能到达的后续状态不重不漏。函数
本次做业对循环继承和重复继承的规则检查有些棘手,一开始我本打算顺着继承关系和接口实现关系的 Hashmap
一层一层往上找,但担忧这么作的时间复杂度过于高昂,最后将继承关系与接口实现关系转换成了相似于图的邻接矩阵,经过求本身与本身之间是否存在通路来判断是否存在循环继承,求两点之间的路径数是否大于1来判断是否存在重复继承,当UML输入完成以后开始建图,再对每一个类和接口依次进行判断便可。单元测试
四个单元架构设计及OO方法理解的演进学习
再次回顾本身前几个单元的做业,其实能够看出许多差异。第一单元开始时刚开始接触面向对象,不少地方其实并无体现出面向对象的思惟方式,更多的是对求导的过程进行建模,甚至存在一个类中一个函数写到底的状况,而没有对表达式和求导规则创建管理层次与抽象层次。固然,在第三次做业中, 因为其复杂性,若是不对表达式创建层次关系将会无从下手,所以我开始尝试对因子、项和表达式进行建模处理,经过继承与接口实现来对不一样类型的因子、项和表达式进行管理和抽象,使其可以完成归一化处理。测试
从这之后我也逐渐开始找到面向对象的思惟方法的入口,在设计程序以前开始思考各个部分之间的关系层次,尝试经过封装、继承、多态的方式创建并管理对象之间的层次。
第二单元多线程的设计,要求咱们在面向对象的基础上保证线程之间的安全。对输入请求、调度器、电梯,要分别设置线程进行交互,同时保证处理输入类、调度器类与电梯类设计分离,各司其职,对多线程之间的共享对象的操做也应保证准确而很少余,防止出现线程安全问题。本单元第一次做业我就提早考虑到了以后可能增长的需求,将输入处理、调度器、电梯分别进行处理,以后的两次做业也就是增长了对调度算法的调整与多部电梯交互之间的调整,在架构设计方面还算比较满意。
本单元还有比较重要的收获是对高内聚低耦合的理解,高内聚针对的是对象自身,即管理好对象本身的数据,作好本身的事,低耦合针对的是对象对外界的状态和行为,尽可能减小对其余对象的依赖,这样出错时不会致使牵一发而动全身。在多线程的程序设计中,保证高内聚低耦合,能够最大程度地下降线程之间交互出错的可能性,这也意味着咱们应该按照面向对象的思惟合理对各个对象进行建模,合理对对象之间的关系层次进行抽象。
三四单元的架构设计比较类似,这两个单元主要训练的是咱们对JML规格和UML图的理解,因为指导书给的指示比较清晰,在设计架构方面并无多大困难,对不一样的模型和数据进行层次化管理,创建数据之间的映射关系便可。这两个单元同时对时间复杂度也提出了要求,所以在存取操做和算法实现时要多留心,防止超时。虽然难度没有前两个单元大,可是不仔细处理仍会出现错误,第三单元第三次做业对换乘、票价、不满意度的计算对于算法方面也是一大挑战。
最后几回做业能够说是对前面做业的整合,当咱们再次拿到指导书的时候,第一时间思考的不是给定功能该如何实现,而是应该设计什么类来实现给定功能,类与类之间存在什么层次关系来协助咱们完成给定功能,这一学期的OO课就算是没有白上。
四个单元测试理解与实践的演进
OO的课程设置让人深入体会到了测试的重要性,这是这门课一个成功的地方。经过中测并不表明你的程序有多好,只能说程序实现了最基本的功能,程序的鲁棒性、复杂度、对边界数据的处理在中测中没有任何体现,都须要咱们本身构造测试数据甚至自动化生成测试集来帮助咱们检验程序设计。
第一单元的测试主要集中于对错误格式的判断上,虽然说重心有些放错了地方,在第三次做业的互测中中也及时改了过来,却也让咱们对边界数据和特殊状况的处理更加剧视,认识到了测试完备性和全面性的重要性。
第二单元的测试主要集中于对程序鲁棒性的测试,在多线程之下程序可否正确运行,线程之间的共享对象是否不出差错,线程之间是否没有出现死锁,等等,都是咱们须要考虑的点,也都应该构造足够多的极限数据去进行压力测试。多线程的错误有时候很难复现,本该出错的数据可能运气好跑对了,所以对每组数据也应该进行屡次测试,保证测试的覆盖性。
第三单元的测试主要针对时间复杂度,咱们须要构造数据量极大的测试数据,而且保证程序可以在给定时间以内成功跑出结果。第三单元和第四单元的测试均可以经过单元测试的方式来完成,这也是提供给咱们官方包的好处,咱们只需专一于功能实现的正确性便可。这两个单元坦白说我测试得并不充分,有些指令看着很简单,自觉得不用测试,但其实在数据量极大的状况下仍是有错误。
四个单元的测试侧重点各有不一样,从边界数据,到鲁棒性,到复杂度,到单元测试,每一个环节都重要,缺一不可,有任何一个方面没有照顾到,测试就不是充分的,程序也不能保证是正确的。手动构造也好,自动化生成也好,测试数据的最终目的就是帮助咱们找到程序中可能的漏洞,在测试得不够完备以前,咱们都应该把咱们的程序当成错误的来处理,程序设计应该有怀疑一切的思想准备。测试一样可以帮助咱们在设计的时候提早从用户的角度思考,提升咱们的设计思惟以及防错意识,这是OO教给个人很重要的一点。
课程收获
最直观的收获天然是学会了一门编程语言,并在做业与实战中不断完善对该Java的理解与对用法的精进。数次做业也体会到了为何Java是世界上使用范围最广的语言之一,其包含的各类容器和库,构造器,回收,封装,继承,多态等机制,都给这门语言带来了其独有的魅力。
更重要的收获天然在于对面向对象思想的理解与运用,这也是这门课的主题,从最初的面向过程式的思考转变到面向对象式的思考,不只仅是一句“一切皆对象“就可解决,还须要无数次在架构设计中的斟酌和完成程序后的反思,不断寻找类与类之间的层次关系,思考如何对层次关系进行管理和抽象,知足高内聚低耦合以及SOLID规则,提高程序的稳定性和正确性。通过这学期的训练,在面向对象的设计方面有了长足进步,对于每一个类之间的功能分配和层次管理,以及提取抽象对象之间的共性也愈来愈有心得。
同时,对于测试及其重要性也有了更深入的认识,一方面是确实吃过测试不充分的亏,一方面是在从中测到强测到互测的过程当中逐渐理解了各类测试的意义,开始将测试思惟带到设计时考虑,程序的质量也获得了提高。从开始的手动构造测试样例到自动化生成测试数据再到使用JUnit进行单元测试,对程序的测试手段也在一步步完善,使测试得以更全面,覆盖面更广。
还有一些诸如如何写出具备良好风格的代码,如何高效阅读他人代码等的收获,比较微小,但对未来的程序编写也必定会有所帮助。
体会与建议
上机内容常常是上午才讲过的内容,没有时间消化,上机现场学习效果不必定是最好的。