OO第4次博客做业正则表达式
1、第4单元设计算法
第四单元主要围绕UML图的结构进行JAVA代码编写,对JAVA的层次结构进行更多的认识。我的认为编程操做在实质上与上一章的PathContainer有许多的相同之处,难度也较上一章下降的不少。与此同时有许多新的新的概念须要理解,对我提出了编程以外的要求。编程
第十三次做业多线程
此次做业主要解决UML中的类图。主要包括2点内容,即类图的构建以及相应的查找函数。架构
一、课程预先写好的接口给出的是一种链式存储结构,经过ParentId找到所属的上层结构。在实际的编程中为了方便操做和查找,我采起的作法时本身编写了各个类储存下层结构和上层结构的Id,实现有序的层次结构。模块化
二、因为在构造函数传入的Element元素没法确保合理的顺序性。所以须要分别对不一样元素进行排序,分层处理。个人处理方式将CLASS和INTERFACE放在第一层, UML_INTERFACE_REALIZATION UML_ATTRIBUTE UML_OPERATION UML_ASSOCIATION UML_GENERALIZATION放在第二层,UML_PARAMETER UML_ASSOCIATION_END放在第三层,分别进行处理。函数
三、此次的测试彷佛并无对性能有任何要求,所以在查询函数中我为了确保正确性,使用了普通的顺序遍历就成功经过了全部测试案例。工具
第十三次做业类图:性能
第14次做业学习
14次做业在第13次做业基础上增长了顺序图和状态图。而且在开源LAVA代码中增长了大量Element子类。表面上难度彷佛大幅增长,实质上此次顺序图和状态图考的内容都很是简单而且和第13次做业很是类似,只是简单的计数和遍历问题。同时助教也将细节部分大幅简化了,少了不少重名、合并等边界问题。给出的Element子类最后也用到的很少。我的认为此次做业在难度上彻底能够更上一个台阶。
此次做业的难点很少,其中之一是UML003规则的断定,即类和接口的重复实现。须要判断的状况相对较多,包括只包含接口的重复实现,只包含1个类和接口的重复实现。类重复实现了父类已经实现的接口以及父类重复实现致使的子类也重复实现的状况。种类较多,比较容易遗漏。
另外一个难点在于代码量的控制。因为这一次做业概念较多致使代码量较大,想在500行以内搞定是不可能的,每一个方法也很是容易超过60行的限制。我将UMLINTERACTION拆分红了3个类,1个类包括构造函数,第二个类负责上一次做业的查找函数,而第三个类负责这一次做业的函数。三个类之间有继承关系,从而使得最终类的代码量只有原来的三分之一。
第十四次做业类图:
能够看见因为将每一个元素都本身写一个独立的类,同时将最终类分红三层分别实现,致使个人代码和结构都比较复杂。优势则是将全部的实现都独立开来,方便代码复用。第十四次做业实现时彻底照着上一次做业的模板在其之上添加而成。
第十3、十四次做业BUG修复
这二次做业共产生了3类BUG。第一是很是广泛的BUG:空指针异常。产生缘由是对顺序图理解不够彻底。例如第二次做业中出现了发送给endpoint的消息,但个人程序则忽略了对其的处理。
第二个BUG是类型转换错误。这一次的JAVA包中包括大量枚举、继承以及接口实现关系。我不慎将两个没有继承关系的类进行了强制转换,致使了BUG出现。
第三个BUG是对循环继承处理的错误。我在该项检查时使用了很是简单的方法,让一个类不断getfather,当最终回到本身是则最终出现循环继承。BUG在于若它的父类存在循环继承而其自己并不存在会致使循环判断最终步入死循环。
2、架构演进
一、第一单元做业
第一次做业是针对简单表达式的求导过程,对于JAVA语法以及正则表达式都是第一次接触和学习。因为第一次进行JAVA编写,所以在实现上大体采用的是面向过程的写法,并无考虑代码重用方面的构造,致使下一次做业彻底重写。
第二次做业在第一次的基础上增长了三角函数。吸收了第一次做业的教训,我将第二次做业的多项式结构层次化分为2个类,多项式和项,经过正则表达式匹配项的种类进行求导。此次做业我沿用了上一次的空格判断函数,同时对JAVA的模块化设计有了更多的理解。
第三次做业结构较上一次做业更为复杂多变。我沿用了第二次做业的结构,并在其上增长了因子类,经过递归方式进行求导,顺利经过了此次的做业。
在测试方面第一单元因为经验不足,大部分测试样例都是本身脑补出来的,主要聚焦于边界条件等方面,所以在互测以及本身对BUG的发现方面有许多不足之处。
二、第二单元做业
第一次做业是简单的单电梯且无换乘,所以没有BUG出现,代码量也很是少。在这一次做业中肯定了电梯程序的3个基本类,包括输入线程,调度类以及电梯线程。在两个线程中使用了同步锁,初步感觉到了线程协同的过程。
第二次做业在上一次的基础上增长了电梯的捎带以及对于CPU时间的检查。我在第一次做业的基础上增长了电梯线程对于每一层对于捎带的判断,同时使得电梯线程和输入线程互相通讯,防止电梯线程的轮询查询。
第三次做业在第二次做业的基础上增长了多电梯运行的状况,以及每一个电梯对于停靠楼层的限制。多电梯运行不难解决,为每个线程增长等待和运行队列以及考虑电梯协同便可。关键在于对于每一个电梯任务的拆分和合理调度,这也是此次做业我思考最多的地方。
这一次做业的BUG测试没法采用上一次做业的自我脑补方式。个人作法是经过编写C程序随机生成测试样例,同时经过本身编写的检测程序判断测试样例的合理性,同时经过一些本身编写的代码量较小的针对边界条件的测试程序进行BUG检查。整体上效率明显高于上一次的做业。
三、第三单元做业
第一次做业针对的是简单的 PathContainer,所要执行的任务也只是增删查而已。在图的构造方面,因为此次做业对性能有很是严格的要求,所以我采用HASHMAP存储PATH。同时针对getDinstinctCount指令的复杂性,在每一次增减指令的时候更新DINSTINCTCOUNT,减小调用该函数的负担。
第二次做业在第一次做业的基础上增长了最短路径以及连通性的查询。解决方法经过BFS替代DJ算法,下降复杂度,保证了性能。
第三次做业增长了很是多的概念,包括不一样的权重图,最大连通块的存储以及对于换乘的处理。在沿用第二次做业整体构造的基础上,我增长了对于连通块并查集的存储以及权重图的存储。同时经过拆点法解决换乘问题。这一次做业最大的难点就是对于DJ算法的处理。我使用了堆排序优化了算法,可是没有找到好的方法缓冲中间查询结果,致使超时状况的大量出现。
针对BUG的寻找以及互测,个人方法沿用上一次的内容,经过大量构造随机数据进行压力测试,并本身编写程序测试边界状况。不一样的是这一次做业网上提供了大量JML工具,我也利用了JML UnintNG和Junit进行测试。
四、第四单元做业
(即本博客前部份内容)
3、课程回顾
在面向对象课程中我充分感觉到了不一样于C语言的面向对象编程方法,模块化设计以及对于测试的各种方法。学习了多线程编程,JML,UML等各类JAVA编程的特性方法,同时也学习掌握了JAVA编程大量的辅助工具链。此外锻炼了咱们的自我学习能力,许多关于JAVA构造函数,HASHMAP等各种JAVA特性方法的使用都是经过本身的不断尝试实践以后才可以彻底掌握的,而不是老师的一味教学。最后,此次的课程也锻炼了咱们对于大量程序代码的构造以及长时间编程能力,以及对于代码一步步构造和分析的能力,这也将为咱们将来工做打下必定的基础。
4、对于课程的建议
一、最后一次关于UML的做业第一、2次做业几乎没有什么跨度,同时关于UMLENDPOINT等大量新增概念都没有用上,函数也是很是基本的函数。能够适当提升该部份内容的难度。
二、适当增长中测的难度,同时增长强测测试点的梯度。经常出现有人一个小点忽视致使强测爆光而另一我的构造自己有问题却能安然无恙的状况。
三、感受能够增长一单元的综合内容,将现实中企业可能遇到的编程问题交给咱们来编程而不是简单的给一些抽象问题,感受这样可以获得更大的锻炼。
四、能够增长对于经常使用工具链的介绍。仅仅介绍UML和JML感受比较有限,能够增长对于自学其余经常使用工具的要求。