oo第四次作业总结性博客

  今天是我开始Java编程的第三周,虽然勉强编出能跑的程序,但是感觉自己对Java的理解还是不够深入。尽管如此,我还是总结了一些关于Java的一些体会。

  首先,我们都知道,Java是面向对象的编程语言,而c是面向过程的。在c语言中,但凡我遇到一些类似Java的相似对象时,我一般会首选结构体。利用结构体来大致模仿Java的类。但是这样也有非常大的弊端,例如:如果有两个相似但不完全相同的结构时,结构体往往会需要重新定义;对于Java中的多态数组,我目前还没有想到什么好办法在c语言里面再现它。

  其实,我在开始学习的时候最不习惯的估计是没有指针的痛苦了。在c语言中,即使没有把变量设置为全局变量,我们仍旧可以通过传指针的方式,来改变变量的值。然而,Java中却没有给我们这种随意访存的权限,我们程序员,只能在函数间传值或者传引用,而没有办法去改变没有传递出来的值。其实关于这一点,我也进行了一些思考,为什么Java的设计者没有开放这一权限?

  我觉得,原因大概有二:首先,我们知道,C语言是远远早于Java诞生并投入使用的编程语言,当时可能对于内存安全性等方面的问题尚未有太多的考虑;要知道,在早期Linux系统中甚至可能都不存在病毒等恶意程序的概念,因此C语言的开发者一开始就没有对这方面做很多工作;而后面,C语言格局已定的情况下,后来的版本虽然注意到了这一问题,但也只能进行小规模的修补,而无法从根本上解决。其次,Java这么设计应该考虑了面向对象的特性;因为作为一个个对象,我们很难对其地址所指向的值或状态进行直接解读,而传值,传引用的方式就不会带来此类问题。

================================================================================================================

对于老师上课讲授的内容:

  我确实在课下研究过老师PPT上的代码,甚至在第一次作业是打算在老师的代码框架下继续补充。奈何感觉和老师的设计思路有所出入,因此无法借鉴,引以为一大遗憾。我觉得,吴老师每节课结尾时都会给我们讲解代码的思路,这非常有助于我们的学习。例如最近的一次课,老师用他的类图阐释了接口到底是用来干什么的。听完以后豁然开朗:原来所谓的电梯接口适用于以后的多线程电梯的代码复用的,在反观我的电梯接口,纯粹是为了写一个接口而写的。但是我也有一点点小的建议,能否在PPT上给出少许注释,因为在参考老师的设计方案时,往往会因为老师的方案与我自己的有很大不同而放弃,进而像这次(第三次)作业,走上一条极其复杂繁琐的设计思路。

我发现的别人的bug:

&第一次作业:空输入没有定义、至多20个多项式、至多50个项的要求没有满足(我认为,这主要是没有审清题意造成的)

&第二、三次作业:很遗憾没有发现bug

我的bug&&我存在的共性问题:

&第一次作业:模式匹配出错(因为没有使用正则表达式);关于老师所讲的共性的问题,我的程序中确实也有存在,例如我的类分的比较少,面向过程时的编程习惯仍然没有完全得到纠正,而且我也存在几个类仅仅是用作全局变量,而没有实际意义。

&第二次作业:(错误提示符前没有‘#’、int型数据的边界情况处理)(这也是血的教训,因为在后来的版本中这些错误确实得到了改正,很可惜没有交上);很庆幸,我的代码中对老师提到的易错点都进行了规避

&第三次作业:数组处理时没有进行边界保护,捎带请求判断时漏判(以后一定会在此方面多加注意);

================================================================================================================

&第一次作业(多项式计算)

  作为我的第一份Java作业,我所提交的结果可谓是100%伪面向对象风格的代码。由于对Java语言的不熟悉,我选择了从c程序开始做。在codeblocks中编完了C语言版的多项式计算后,我将其很生硬的套用到了Java程序中,虽然也考虑到面型对象的编程语言的特点,而分出了poly,polynomial等类,但是骨子里仍然透露出了浓浓的面向过程的风格。特点有三:

  其一:完全不注意使用Java中自带的一些方便的库函数。例如正则表达式的pattern类,很多同学都采用了教程中推荐的正则表达式;而我由于不熟悉,生硬的手撸了一段字符串匹配的代码,说来也好笑,别人10行以内解决的问题,我愣是写了几十行。

  其二:没有采用Java的独特的try catch结构,导致我的字符串匹配虽然写了老长,还是被揪出了bug,一出还就是个crash。

  其三:就是前面所说的编程风格的问题,对于习惯于通过指针在程序间跳来跳去的我,一下子少了指针这一大杀器,极度不适应。无奈之下,我只好多定义了一个公共类来保存全局变量。

  第一次作业结束后,我痛定思痛,回去好好学了面向对象的编程语言,正则表达式,try catch等结构也一一补习了一番。终于在第二次作业前初步掌握了相关内容。

&第二次作业(傻瓜电梯)

  第二次作业,我就注意很多了,例如前面所说的第一次作业的一些教训,我都一一小心避开。但是正当我以为我将会交上一份令自己满意的答卷时,没想到天有不测风云,我虽然早早的将代码push到了git平台上,但是经验主义害死人,我误以为还是会和第一次作业一样,oj自动拉取git最新提交,万万没想到,oj的最终提交竟是我很早写的一份错误百出的老版本。通过与老师,助教们的沟通(这里非常感谢老师和助教们的耐心指导),我理解了oj为什么会判定我的老版本为最终提交,并认识到了我没有认真阅读要求的错误。如果说第一次作业是学到了技术,那么我从第二次作业中学到的就是血淋淋的教训了。最终成绩当然在意料之中,很不尽人意。但是吃一堑,长一智,这次的教训比什么教导都来得管用。所以,我从第二次作业中学到的就是宝贵的经验教训了。

&第三次作业(捎带电梯)

  第三次作业的捎带电梯是在第二次的傻瓜电梯基础上的进阶版。这次我也有了一个比较严重的决策失误,对于算法,我沿用了第二次的算法,虽然理论上是可行的,但是却造成了代码的逻辑及其复杂,各种漏洞难以修补,直接造成了周二到周三的为期20小时的连续debug。所谓的“沉没成本”大概就是这样了,我一开始没有舍得将已经基本完成的复杂算法直接舍弃,从而造成了后面各种复杂的工作。这一次的作业可以说也是一个很好的教训吧。

 

 

  总的来说,对于我自己这三次作业的表现,我个人是很不满意的,我也会将这些教训深刻地记住,并在以后的学习中多加注意。

posted @ 2018-04-03 09:55  8gong  阅读(146)  评论(1编辑  收藏  举报