面向对象程序设计 第一单元总结

我现在只希望老师说的”第一单元最难“是真的

第一次作业

架构分析:

  本次作业的内容为简单多项式导函数的求解,支持加减乘与幂函数运算。由于我缺少java设计的经验,我简单地以面向过程的思维完成了这次任务。以下为我的类图,其中Item类管理每个由乘号连接起来的项,并对输入的项字符串进行化简。Polymicial类管理一个类型为Item的Arraylist容器,也就是多项式,并对输入的表达式字符串进行初步的化简与分割,将分割后的结果传入Item类构造对象。Sortbymulsign则是一个为排序而写的类,属于为了化简而进行的额外操作。

  

 

   从类图中可以看出,我的第一次作业的设计基本上是面向过程的思维,只是把对象当成了一个好用的变量在使用。对象与对象之间缺乏联系,程序整体的结构也不太好。同时,类的属性与方法集中度高,整个项目一共才19个方法,一个类就有14个方法,这极其不利于代码进一步的维护与扩展。除此之外,我对正则表达式的使用也不够漂亮,仅仅在方法中使用了零散简单的正则表达式,没有领会到指导书采用形式化语言的意图,也就没能使用递归下降的分析方法。

复杂度分析:

  

 

   以上是我的复杂度分析表,可以看到,负责构造对象的iteminitial类与负责输出的toString类结构都是有问题的。其中iteminitial类的问题主要在循环复杂度上,究其原因,是因为我将项字符串的对象构造与合并同类项都放到了这一个方法中,导致这个方法的长度高达50行,且判定结构复杂,十分臃肿。toString类的问题则是在基本复杂度上,模块化程度过低,有很多的特判,不利于代码维护。这两个方法的问题,本质上也都是我面向过程的编程习惯没有彻底地改掉。

bug分析:

  第一次的作业由于较为简单,所以在强测与互测中我都没有产生bug,但是我也没有花时间去hack别人的代码,只是把我自己在编写代码过程中注意到的可能出现的问题构造成样例之后,交了上去,结果没有hack成功。

第二次作业:

  第二次的作业内容为包含简单幂函数和简单正余弦函数的导函数的求解,支持因子嵌套。在这次作业中,我没能按时通过中测,最终收获了一次无效作业。主要的数据结构我已经设计出来了,但是在写item类,处理相乘因子的导数时遇到了困难。主要就是没有办法处理每一项的括号与符号,最终导致了我没能通过这一次作业。对这次的作业,我缺乏心理准备,也没能及时养成面向对象的思维,导致设计方法出了一些问题,在debug时非常费力,最后没有赶上ddl。

  第二次作业给我的触动非常大,因为我发现OO比我想象中的要深很多,我不能再用上学期学java的方法来学OO了,一定要深刻理解OO的内核。

第三次作业:

  第三次作业的内容与第二次基本相同,但增加了三角函数的嵌套与输入表达式的合法性判断。以下为我的类图。Factor类作为抽象类,说明了所有类型的因子都要具备的方法。Sin类,Cos类,Power类,Expr类继承Factor类实现不同类型的因子。Term类对表达式进行分割解析出因子,Expr类对表达式进行分割解析出项。Main主类则对输入的表达式类进行初步的化简与合法性检查。同时,吸取了第二次作业的教训,我这次仔细考虑了正则表达式的结构,最终以指导书的形式化语言描述为框架,构造了层次化的正则表达式,在读取表达式的过程中起到了很好的匹配效果。

  但是我的习惯并不是很好,我为了便于管理,将所有的正则表达式都放到一个类里并设为public,导致我被扣光了代码风格分,今后还要多加注意。

  

 

   这次的代码结构比第一次有了明显的进步,有了面向对象的影子,但这也建立在我学习别人代码的基础上,想要写出自己的漂亮代码,我还要多加努力。这次方法的长度也有了较为明显的进步,但是expr类和term类的构造方法依然很长,需要进一步的优化。并且,我并没有在我的代码中应用工厂方法,工厂方法可以让我的代码更加简洁,减少case和ifelse的频繁使用,这也是可以优化的点之一。另外,本次作业类之间多为聚合关系。

复杂度分析:

  

 

   

 

  以上为关键方法的复杂度分析表。可以看到,复杂度较高的方法多为构造方法与输出方法,这和构造过程中没有使用工厂方法有很大的关系。 至于输出方法,为追求性能分,需要进行一些特判,也是没有办法的事情。

bug分析:

  本次作业强测被测出一个bug,互测没有。我通过阅读测试样例直接找到了bug,就是我的输入合法性判断出了问题,具体位置在Main类的isLegal方法,在判断是否有带符号的整数中有空格时,没有考虑sin或者cos括号中有此类整数,导致被hack一个点,这是我在考虑个人测试用例时的失误。出现bug的方法模块化程度极低,相当于我把几个方法塞进了一个方法中,这不利于代码的维护。并且我用了很多的ifelse结构来进行特判,这也导致了代码编写时的逻辑可能会有一定的混乱。

 

心得体会:

  我的第二次作业没有通过,这其实对我的打击很大,我曾一度怀疑我要挂科了,因为才第二个任务,我就已经被拿下了。幸好OO的课程设置还算人性化,课上有老师讲理论知识,研讨课有大佬带我们卷,讨论区也有同学们交流思考,互测还可以学习大佬的代码,当然,如果助教也能讲个30分钟,那就更好了(

  我相信OO一定会成为我受益匪浅的一门课,这门课教的不只是知识和技巧,更是一种解决问题的思考方式,我相信,只要我这学期认真学OO,我一定不会挂科的。应该吧

  最后,提一点小建议,希望在今后的课程中能降低task之间的难度跨度,尤其是第一单元。对于某些对OO课程基本不了解的同学,比如我,第二次作业确实太难了。另外,pre明年还是算分吧,不做pre真的很伤很伤,一定要做pre啊!

 

posted @ 2021-03-26 19:40  twilight3590  阅读(124)  评论(0)    收藏  举报