【面向对象】第一单元总结

【OO】第一单元作业-表达式求导总结分析


 

第一次作业


 

前言:作为之前完全没有接触过“面向对象”设计理念的新手小白,我的第一次作业直接采用了“面向过程”的设计,将C语言式的代码“翻译”成了java语言,整体功能难以扩展。

(1)基于度量来分析自己的程序结构

 

 度量分析:在main方法中,我的基本复杂度,模块设计复杂度和圈复杂度都比较高。

第一次作业的结构设计不是很合理,将数据处理部分直接写在了main方法中,将wrong format输入判定直接放在了main方法中,没有设计成类或者方法,模块耦合度高,难以扩展维护。

(2)程序bug分析

第一次作业的强测和互测分别被hack了一个点。

错误分析:在写代码的时候,经过一波冷静分析,我坚定的认为当幂函数的指数为1时,系数不可能为1(例如当系数不为0时,指数为2的幂函数求导后系数肯定大于1)。

由于这波盲目分析没有考虑到合并同类项后系数可能变为1,而我的程序错误的输出了+*x,从而使得强测wa了一个点,互测被hack了一个点。

(留下了因为少写一行代码而悔不当初的泪水)

(3)发现别人程序bug所采用的策略

第一次作业的互测阶段,我构造了一个简单的测试数据集,分为错误输入和复杂数据,错误输入数据主要用来测试代码的输入处理是否正确(Wrong Format),复杂数据用来查看代码合并同类项是否正确,输出情况是否考虑完全。

第一次作业中,同屋的小伙伴有两个没有考虑除了空格和Tab之外的其他空格,统一使用了\\s来处理空白字符,导致了bug的出现。

还有一些同屋的bug是输出没有考虑完全(比如我的谜之思考逻辑),从而遇害。

(另外,由于第一次作业的hack情况是完全公开的,我在“测试”的时候是优先测试被hack过的人,也发现了一些bug。)

第二次作业


 

前言:相比较第一次作业,第二次作业加入了底数为sin(x)和cos(x)为底数的幂函数。我写第二次作业的代码也是完全按照第一次作业的思路,整体分为输入处理,数据处理,结果优化三部分。

(1)基于度量来分析自己的程序结构

 

 

 度量分析:由于第二次作业延用了第一次作业的思路,整体还是2个类。可以看出,main方法和mOpt(优化)的三项指标都很高。由于优化方法是匆忙加上的,没有进行很好的设计,基本复杂度,模块设计复杂度和圈复杂度都很高。这次作业还是没有把main方法单独抽出来,导致main方法的耦合性也很高,难以维护和扩展。和上次作业相比,第二次作业的设计更为结构化,虽然一些方法的复杂度还是很高,但整体的设计较为清晰。

(2)程序bug分析

吸取了第一次作业的教训,我充分的考虑了第二次作业的输出处理,强测和互测都没有发现bug。

(3)发现别人程序bug所采用的策略

由于在写代码的过程中,我在测试自己的程序的时候也使用了大量的测试数据,构造了一个简单的测试数据集。

这次作业我测试的重点是正则表达式是否会爆栈,输入处理(例如sin和cos保留字之间的空白符问题),还有结果优化三部分。

同屋的Saber和Caster分别是爆栈和输入处理考虑不完全的,从而被害。

第三次作业


 

前言:在听到第三次作业可能会有嵌套数据的时候,经过一波理智分析,我单纯的认为嵌套肯定只会套一层,问题不大,不过是多处理一层的情况罢了。

而在下午收到指导书的时候,我冷静的看了一遍,,,,,,,,没看懂。

再看一遍,居然真的是多重嵌套,surprise!

 这次作业基本脱离了前两次作业的思路,重构了一个新的程序。

(1)基于度量来分析自己的程序结构

 

 

度量分析:这次作业是完全重构的新版本。由于是自己手动for循环来判断输入的合法性,checkString方法的模块设计复杂度和圈复杂度都比较高,只能针对这次作业的输入情况来进行判定,模块耦合度高,可扩展性低。 setString方法是在进行了合法性判定后,对正确输入的数据进行一些基本的预处理(比如去掉多余的括号),基本复杂度和圈复杂度较高。

(2)程序bug分析

在放弃优化的情况下,这次作业强测没有被查出bug,当然除了WF外其余性能分都是0。

然而,在互测第一次数据更新后我就被hack了,透心凉,最终被hack了5次。

 错误分析:在将表达式分裂成项的时候,我才用了for循环,将左括号压入栈中,在栈为空时遇到+-后就将之前的式子加入项的集合,而我考虑了‘+-’之前的字符不能为‘^’,没有考虑‘*’,项的分割出错导致了结果计算错误。

因为这次作业完成的比较赶,我没有对自己的程序做到而来充分的,覆盖性的测试,出现了这个相当严重的bug,在此真诚忏悔。

 (3)发现别人程序bug所采用的策略

因为这次的代码量比较大,很难通过阅读所有人的代码来找bug,我写了一个超简单脚本,将所有人的输出放在一起进行比较,肉眼识别结果是否正确。

同屋的同学有的没有考虑sin和cos括号嵌套之间的空白符,还有的是幂函数的指数为10时不输出指数。

三次作业对比分析总结


 

 

输入处理:第一次作业采用大正则,直接进行整体表达式的判断;

第二次作业通过构造匹配器来进行项的单独小正则判断,防止爆栈;

第三次作业在我尝试了一周末的正则匹配失败后,最终采用了手动for循环进行小表达式的正则匹配。

数据处理:第一次作业和第二次作业都是直接进行计算,将项的结构存储在arraylist中,统一进行输出判断。

第三次作业则是采用了递归下降进行表达式的处理,在得到一项求导结果后立即加入结果字符串。

输出判断:前两次作业都尝试了一些简单的优化,合并同类项后输出结果;

对于第三次作业,我选择放弃。最终只是也进行了一些简单的符号替换。

  对比三次作业,我学到了很多,代码结构逐渐变得清晰了,(可能)摸到了所谓“面向对象”设计理念的门槛,逐渐将基本的功能实现都交给方法去做,抽象成类,实现相应的代码分装,提高了代码可维护性和扩展性。

 

转载于:https://www.cnblogs.com/MHKING/p/10600521.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 《Java开发实战1200例》第一卷,是一本以实例为基础的Java开发指南。本书首先介绍了Java的基础知识,包括Java语言的特性、面向对象编程的基本概念和常用的数据结构与算法。 在接下来的章节中,本书通过大量的案例实例,深入讲解了Java开发中的各个方面,包括Java的核心类库、多线程编程、IO操作、网络编程、数据库操作等等。每个案例都围绕一个实际的应用场景展开,通过解决实际问题的方式来帮助读者理解和掌握Java开发的技巧和方法。 与其他Java开发书籍相比,《Java开发实战1200例》第一卷的特点在于它的实战性和丰富的案例。通过实际案例的演示和实践,读者可以更好地理解Java开发的实际应用场景,学会解决实际问题。本书既适合初学者入门,也适合有一定经验的开发人员进阶学习。 总结来说,《Java开发实战1200例》第一卷是一本涵盖了Java开发各个方面的实例教程,帮助读者从实践中学习和掌握Java开发技术。它的实战性和案例丰富度是其与众不同的地方,适合广大Java开发人员阅读和参考。 ### 回答2: 《Java开发实战1200例》第一卷是一本非常实用的Java开发教程,旨在帮助读者提升Java编程技能和解决实际开发中遇到的问题。该书共收录了1200个例子,分为多个章节,涵盖了Java的各个方面。 在这本书中,读者可以学习到Java的基本语法和面向对象编程的概念。从简单的数据类型和变量开始,逐渐深入讲解流程控制、循环结构、数组等基础知识。通过各种实例演示,读者可以理解各种概念,并灵活运用到自己的开发项目中。 此外,书中还介绍了Java的核心类库和常用工具,如集合框架、字符串处理、文件IO、多线程等。通过实例讲解,读者可以学习到这些类库的使用方法和注意事项。这些例子涵盖了很多开发场景,有助于读者理解实际项目中的需求,并能够迅速解决问题。 《Java开发实战1200例》第一卷不仅仅是简单的代码示例集合,而是通过实例来讲解Java开发的基本原理和实践经验。通过阅读这本书,读者可以获得更深入的Java编程知识,并掌握一些常见问题的解决方法。无论是初学者还是有一定经验的开发者,都可以从中受益匪浅。 总之,《Java开发实战1200例》第一卷是一本非常实用的Java开发教程,适合想要提升Java编程技能和解决实际问题的读者阅读。通过学习这本书,读者可以快速掌握Java开发的基本知识并解决开发中的各种问题。 ### 回答3: 《Java开发实战1200例 第一卷》是一本Java开发实战的书籍,共有1200个实例。这本书主要面向Java开发初学者和有一定基础的开发人员,旨在提供实践经验和解决方案。 这本书分为多个章节,每个章节都涵盖了不同的主题,例如基本语法、面向对象编程、异常处理、集合框架、多线程编程、网络通信、图形用户界面等等。 每个实例都是一个具体的问题场景,通过代码实现和说明帮助读者深入理解Java开发的各个方面。在实例中,作者提供了详细的代码和解释,同时还通过注释和说明提供了相关知识点和技巧的讲解。读者可以通过逐个实例的学习和实践,提升自己的Java编程能力和应用水平。 这本书的特点是实践性强、案例丰富、涵盖面广,可以帮助读者快速掌握Java开发的基本技术和核心概念。通过实际应用的示例,读者不仅可以学习到Java语言的基本语法和常用类库的使用,还可以了解到实际开发过程中的注意事项和解决问题的方法。 总之,《Java开发实战1200例 第一卷》是一本实用性较强的Java开发参考书籍,适合希望系统学习Java开发、提升编程技巧的读者。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值