面向对象第一单元个人总结

面向对象第一单元个人总结

摘要:本次博客介绍了第一单元三次作业的思路、bug分析与心得体会,三次作业均采用预解析模式。

一、第一次作业

UML类图:

解析:

MainClass:执行主程序,判断每一次的输入为add、sub、neg、pos、mul、pow中的哪种运算,进而执行Factor中的相应函数。

Factor : BigInteger[] factors用于存储次数为0~8对应的系数,factor函数用于初始化数据,add、sub、neg、pos、mul、pow几个函数用于运算,进行系数的运算。

优点:

将系数存入数组进行运算,思路简单明了,便于操作,针对性强。

缺点:

拓展性弱,因各个次数对应的系数是用数字类型的数组进行存储的,当系数的类型增加后,该方法难以应对,拓展性弱,这也导致了我第二次作业的重构。

 

 

整体复杂度与类的耦合度都较低,但也有个例,pow做乘方计算的函数复杂度过高,计算时过于复杂,代码行数较多,影响性能,mainclass中也做了过多运算。

bug分析:

在公测和互测的过程中无明显bug,虽然性能存在一定缺陷,但未出现bug。

互测bug寻找:

随机测试,仅通过寻找特殊数据来进行hack,导致本次互测未发现别人bug。

二、第二次作业

UML类图:

解析:

与第一次作业相似,但是不再是原本的只存储数字的系数,这次选择了ArrayList去存储每个表达式不同的项。

MainClass:执行主程序,判断每一次的输入为add、sub、neg、pos、mul、pow中的哪种运算,进而执行expr中的相应函数。

expr:ArrayList<Factor> factors用于存储存储每个表达式不同的项,其中包含add、sub、neg、pos、mul、pow,进行运算。

Factor:将str转化为Factor类型,便于存储和运算。

优点:判断运算类型后直接进行Factor的运算,运算简单。

缺点:最终的形式为字符串,且运算过程中无化简,导致最后难以化简,只能进行一定的字符串替换。

整体复杂度与类的耦合度都较低,只是在MainClass中进行了过多的字符串处理与判断,导致其复杂度过高。

bug分析:

本次出现了较多bug,第一个是由于本次的运算方式导致的,最终只进行简单的字符串合并,没有关注到形式的合法性,导致出现了类似“*-x”的不合法的情况,在进行字符串处理后将此bug进行了修复。

第二个是出现了未考虑0次幂的情况,导致运算错误,在pow进行了0次幂的特殊情况讨论后将此bug进行了修复。

互测bug寻找:

未能发现bug。

三、第三次作业

UML类图:

解析:

与第二次作业的程序极度相似,选择了ArrayList去存储每个表达式不同的项,相比与第二次作业,只是添加了sin与cos的()。因此以下几部分也是与第二次作业相同的。

MainClass:执行主程序,判断每一次的输入为add、sub、neg、pos、mul、pow中的哪种运算,进而执行expr中的相应函数。

expr:ArrayList<Factor> factors用于存储存储每个表达式不同的项,其中包含add、sub、neg、pos、mul、pow,进行运算。

Factor:将str转化为Factor类型,便于存储和运算。

优点:判断运算类型后直接进行Factor的运算,运算简单。

缺点:最终的形式为字符串,且运算过程中无化简,导致最后难以化简,只能进行一定的字符串替换。

整体复杂度与类的耦合度都较低,在MainClass中进行了过多的字符串处理与判断,导致其复杂度过高。

bug分析:

本次强侧中出现了2个测试点未通过,经过手动计算与程序结果比对,程序结果是正确的,应该是因为最终结果未化简导致的错误。

互测中未被发现bug。

互测bug寻找:

 本次bug寻找主要是构造极限数据与特殊情况,寻找到了3个其他同学的bug,有2个bug是通过测试sum中数字的超大值发现的,例如sum(i,99999997,99999999,i)。第3个bug是通过测试sum(i,-3,-1,i**2)测得的,部分同学在进行幂次运算时未打括号,导致结果为负而出错。

四、架构设计体验

第一次作业由于对各种语法、思想都不熟悉,导致在最初构建框架时很费劲,构建出来的框架也不够完善,仅仅依靠完全的面向第一次作业的特殊形式而过关,这也导致了第二次作业的重构。

第二次作业进行了重构,改变了原本的以单一数字为系数的存储模式,将每一次的计算结果存入hashmap中,用expr的类来存储表达式的每一项。然而在此过程中未能发现“*-x”类似的不合法的bug和未考虑0次幂的bug,导致结果不理想,虽然在bug修复中进行了修复。第二次的作业架构设计还是可以的,这种做法能够适应表达式类型的增添而不受影响,虽然化简过程麻烦,甚至难以化简,但是在保证拓展性和正确性方面还是可以的。

第三次作业是比较轻松的,由于第二次架构的完整性与拓展性,第三次作业中仅添加了sin与cos后的()便完成了作业,由此可见好的建构的重要性。从第一次到第二次,从第二次到第三次,这完全是两个极端,一个由于架构的巨大缺陷而重构,一个由于架构的拓展性而仅仅修改了一点完成了作业,这也算是一次巨大的教训了吧。

五、心得体会

最初接触第一次作业,真的很不熟悉,几乎没有思路,又有许多语法上的不明白的地方,真的挺折磨人的,还好在经过询问与求助后得到了不错的结果。面向对象真的需要花费时间去学习,去理解,仅仅掌握语法是完全不够的,就拿这几次作业来说,很难马上拥有思路,更何况自己本身的知识储备匮乏,所以还是要多加练习啊。第一单元也算学习到了许多,类似继承、接口等方法,虽然用的不多,但也算知道了大致的用法和定义。希望第二单元能够学到更多知识,能够顺利度过。

 

posted @ 2022-03-25 21:16  苏俊行  阅读(42)  评论(0编辑  收藏  举报