2020级北航OO第四单元作业总结

一、本单元作业架构设计

  架构如下图所示:

 

  在这一单元中主要分了上述的几个类,此处仅列出了所有类的属性。

二、四个单元中架构设计思维及OO方法理解的演进

  第一个单元:

  是对表达式的化简,第一次接触了递归下降方法。主要的思路是将表达式进行拆解,最终再通过合并化解来得到最终的值。在这个单元里我主要是  将所有的类分为了两大块,分别是数据类和解析类。

  数据类:(Factor是一个接口)Expr、Term、Number、Variable均能实现Factor的toMap()动作。

  解析类:类似于Lexer和Parser这两个类,Lexer类相当于一个字符扫描器,从左向右扫描,并截取相应的字符。其中lexer.next()函数用于向右走一步,lexer.peek()用于返回当前扫描到的字符(可能是一个操作符[()+-*^],也可能是变量因子[x],也可能是一个数[0-9+])。Parser类相当于一个解析器,与Lexer类配合解析。当lexer.peek()等于加号或减号时-> parseTerm();当lexer.peek()等于乘号时->parseFactor();当lexer.peek()等于"("时-> parseExpr();当lexer.peek()等于变量因子或常量因子这两种基本因子时,解析完成。

  第二个单元:

  这个单元是实现多线程的电梯作业。这个单元主要的架构设计是将类分为Thread类加锁的类以及一些普通类。这个单元的横向电梯和纵向电梯是一个难点。但其实只要实现了基本的电梯功能,横向和纵向的差别也没有很大。在这个单元的最后一次作业中我没有用图的算法,但是性能分也没有受到很大的影响。这一单元只要分清楚哪些类中的哪些操作需要加锁。

  其实这个单元对调度器的考验比较大,不同的调度器可能会对结果和性能造成很大的影响。我用的是平均分配,有些同学用的是自由竞争等等。这个单元debug比较难,因为多线程可能会导致不一样的结果,而且可能会导致本地和评测机产生不一样的结果,这也许是因为评测机很快,所以导致一个我在本地测了很多次都没有出现的bug在评测过程中出错。

  第三个单元:

  这个单元主要是写jml。这个单元主要是划分MyPerson,MyGroup等等类,用于实现接口定义的方法。这一单元主要考察的是图论的算法以及对性能的考验很大。图论的算法主要包括两点是否连通,最短路径、最小生成树分别对应于三次作业。为了增加性能,应该尽可能多地用HashMap来增加各个类和属性之间的映射关系,因为这样才可以更快地找到想到查找的值。除此之外,在录入数据和增删改查的时候,可以多维护几个统计类数据,这样就不用在每次查询时重新计算一遍。总而言之,多构造映射关系,多用空间换时间。

 

三、测试理解与实践的演进

  我在四个单元中的测试过程都没有自己造过评测机,希望下学期或者以后有机会一定要试试... ...四个单元的测试主要是通过尽可能多地遍历多种情况,去卡一些边界条件以及一些特殊情况等等。在整个过程中,也有通过和同学们的讨论与对拍来对程序进行测试。

四、课程收获

  OO这门课让我从一开始不知道要怎么分类,甚至一些基本的java语法等等都不熟悉,到后面实现了一个又一个功能,且是实际生活中真真切切会遇到的问题,非常具有成就感。这其中也体会到了互测被刀的刺激与出强测分的紧张。OO课程虽然一开始难度很大,甚至觉得自己无法完成,在第一个单元,几乎每次出了新题就是一整天都在写代码,以及思考如何架构,如何处理一些问题。总之在开学的前几个星期,几乎每天都是在思考OO中度过的。但是当完成了每次作业中要求实现的功能的时候就觉得又可以了!总之这一个学期下来OO带给我的最直观的感受是:我终于也是被代码虐过的人了。

五、改进建议

  建议加强中测!以及强测的分或许可以白天出,晚上十一点经不起折腾)。

posted @ 2022-06-28 19:41  Xcoo  阅读(63)  评论(0编辑  收藏  举报