OO第一单元总结
写在开头:由于本人在本单元中并未能成功完成通过后两次作业的课下中测,因此在本次的总结内容中后两次作业的篇幅将会极度贫瘠。但本人仍会尽力而为来总结本次单元作业的自己的程序设计思路,包括对于为何没有能够完成后两次作业最基础的课下中测的反思和总结。
一、程序结构分析及重构经历总结
本单元的主题是实现表达式的求导功能,第一次作业是简单的幂函数和常值函数的组合形式,第二次作业是在基础上增加了三角函数以及括号嵌套的组合,第三次作业则是在基础上进一步增加了三角函数中的表达式的复杂程度。
下面将一一介绍本人对于每次作业的分析理解和思路架构。
1、第一次作业
本次作业是强行使用一个MainClass类编译通过的,程序结构显得十分单薄,因此分析结构的意义变得微乎其微,故主要的内容是本次作业的分析思路以及采取的比较重要的解决手段。
本次的设计思路中最重要的便是怎么通过直接通过分析整串字符串从而得到结果。为了能够简化对于字符串的分析,本人在字符串的预处理上花费了大量的精力及设计,主要的思路是如何通过replace函数达到将大量格式化内容进行优化读取的效果。
首先是将字符串中大量的空白字符去除,因为在整个表达式中,区分因子与因子、项与项之间的标志实际上可以不用考虑到空白字符的存在,比如说本人构思的将项与项之间区分的条件就是加减号的前面如果紧连着已经处理过一个数字因子,则代表着这个加减号一定是区分项的分割标志。
将字符串大量空白字符去除后,紧接着的是对于紧贴着的两个或三个加减号的合并处理。两个及三个紧连加减号的含义代表的实际上是对应于因此或者项亦或者是表达式的正负问题,因此在此的合并含义无需过多赘述。主要需要讨论的是这里要注意到替换紧连的加减号时,如何做到全面覆盖,这里本人图方便直接采取了8次替换的方法,实际上这是存在多余操作的,如何更少的步骤实现细节则需要进一步探讨。
最后的步骤,也是本次表达式预处理的点睛之笔,为本人在代码设计上带来较大便利的替换。第一步是将“**"替换成“^”,幂次符号的简化,很容易想到。第二步则是将“x^”处理成“^”,这一步的关键思想所在是,将x这个稍显多余的项从表达式中去除掉。而原本x的作用怎么去除替换后才不出现问题呢?这还需要配合到第三步,将“x”转化成“^1”。来分析一下这么做的道理。首先是我们要清楚x的作用是什么。x的作用有两个,一个是用来标志,在其后的数字因子代表的是一个幂次数,另一个则是如果其后不存在数字因子时,代表的其本身带有一个1次幂的幂次数。那么就很好解释这第二步和第三步的采用理由了,首先是将其后带幂数字因子的x去除掉,随后再将不带数字因子的x替换成一个1次幂的幂次数,尤其要注意的是,这两步一定不要调换步骤,否则x的指代性作用会出现问题,这将导致识别出错。问题是,这么操作之后,幂次数怎么找出来呢?很简单,看“^”的指示就行了,这里的第三步也正是为了完成这一步。

总得来说,这次作业的完成说实话,本人认为基本没有用到面向对象的思路和方法,基本上都是面向过程的处理思路,从对于表达式的大力度预处理事情上就可以观察出来这个特点,而这与单元设计的作业初衷大概率是相违背的,因此从中的关于面向对象的知识收获并不是很丰富。
2、第二次作业
由于本次作业并没有通过中测,因此在此放上对于程序结构的分析指标没多大参考含义,故简单文字阐述本次的架构思路以及对失败教训的反思。
很明显的,用一个MainClass来完成作业的想法变得异想天开了,因此逃不开对第一次作业的代码进行重构,或者说完全算得上是对着题面重新写一份代码。在一开始,本人对于本题是毫无头绪的,因此面对着这样具有嵌套的表达式,我有些犯难。之后通过和同学的讨论本次作业的思路,本人开始有一些头绪来进行本次作业的架构。问题的难点主要是在于如何处理带有嵌套的表达式,而解决这一问题的最好方式就是递归,让机器来帮你解决这个嵌套问题。设计的主要思路则慢慢浮现出来,包括利用上作业页面下方的HINT内容,将各种函数结构归类,然后构建加法法则和乘法法则,通过设计一个通用的求导接口,就大致完成了设计的主体内容。但是!这个不是最核心的内容,最核心的是,我们到底是怎么处理嵌套的?HINT中,包括和同学的讨论,构建一个表达式类的思路浮现出来,”将表达式也作为一个类来处理“,这是我认为在本次作业中显得十分优秀的处理思路,也正是这个关键性内容,让我有些感受到面向对象的设计思想。

可惜的是,本人并没有完成通过这次作业的中测数据,究其原因,我认为问题基本在于,本人JAVA语言的基础实在是过于薄弱,很多语言的处理基本的细节都没有做好,以至于出现了很多恶性的语法BUG,在心态的崩溃以及对于自身能力感到失望的情况下,只能对本次作业表示莫大的遗憾。
3、第三次作业
同第二次作业的原因,本次作业同样只能依靠文字阐述架构思路和对失败教训的反思。
这次作业的设计思路实际上和第二次作业没有过大的差别,具体来说实际上只是加上对于输入表达式的正确性判定,而这个表达式的判定机制,是可以结合之前的递归下降思路一并来完成的。在三角函数中增加了更多的复杂嵌套?实际上影响不大,如果在正确理解了第二次作业的设计架构的思路的情况下,仅作简单修改即可。
基于第二次作业的架构基础上,应该是可以很快完成这部分作业内容的,但是本人在此周花费了大量精力应对其他诸如冯如杯竞赛的内容,加上第二次作业中存在但仍未解决的大量语法恶性BUG,所以本人仍然未能够利用有限的时间和精力来顺利完成这部分的作业内容。
二、程序BUG分析以及互测经历体会
介于前文篇幅中描述的本次作业完成情况,本人仅对第一次作业的互测经历以及表现出的BUG进行分析和总结。
本人在第一次作业的互测环节并未有过多表现,究其原因,主要在于对于测试别人数据的环节没有一个高效的处理方式,而只能够通过阅读代码和手动测试数据的手段来完成互测目标,因此在此低效的测试过程中,本人未能查出同房间成员的潜在性BUG。
而与此同时,本人被HACK出了4个BUG,经过分析,在简单程序设计下还依然存在BUG的可能性,指向了”爆仓“这一问题。首先是对于一些变量的控制使用是存在语法问题的,因此没能及时捕捉到这些数据范围的潜在问题,然后是如下图所示的表达式输出问题,可以说是一丁点优化都没有做,同时还无缘无故的白白增加了大量的空白字符,给本人的本地自身调试都带来了极大的困扰,产生这一问题的主要原因则是本人对于题目中的格式要求没有理解到位。

三、单元学习心得体会
本单元的学习,实在是一次十分深痛而沉重的经历,这次的经历带来了太多的教训和遗憾,以及暴露出了自身具有的大量的问题。
本人检讨自身,总结了以下几点主要问题:
1、在明知自身JAVA语言基础十分薄弱的情况下,仍然没有花足够的精力来学习JAVA语言,尝试弥补这一巨大的基础性问题。
2、本人对于自身的约束力十分薄弱,很多事情都是推到DDL即将结束之际才准备着手完成,而这是存在巨大风险的挑战的方式,果不其然,也同时给我本单元的作业带来了巨大的困扰。
3、在时间精力等方面的分配存在很大问题,因为其他项目的进度而影响主要课程的学习是十分不值得的。
总结了问题同时希望提出一些规划来解决这些问题:
1、利用好空闲时间,抓紧将JAVA语言薄弱的这一问题解决,多学习、多搜索、多实践,特别在之后的完成作业的过程中不断学习,形成
一个语言学习的良性循环。
2、不要赶着DDL做事情!完全可以做完任务之后再腾出时间来处理自己的一些其他项目上的事情!做好时间上的规划和精力分配。
希望各位能够以本人为戒,莫再犯如此让自己感到遗憾的行为。
浙公网安备 33010602011771号