OO第一单元作业总结

0.前言

       这是Java的第一次大作业,第一次作业考察基本语法,第二次作业考察方法的使用,第三次则是类设计。这三次作业让我们的思想逐步从c语言的面向过程过渡到面向对象。对于知识点我基本上掌握了,但是有一些概念还不是很明晰,在一些算法逻辑上容易出现错误,出现思维漏洞,导致程序出现bug。

1.作业过程总结

  1. 三次作业的知识迭代
           三次作业针对的知识成面很清晰。作业一主要是通过在main方法,通过Java的一些基础语法,进行一些简单的科学计算以及选择循环,解决一些简单问题;作业二引入了方法的使用,以及加强了对选择,循环,数组的使用,通过main方法调用其他方法解决问题;作业三上升到类与对象的定义、构造方法的重载与使用、属性与方法、类的设计原则以及类间关系这些知识点的掌握,对类的设计中需要对其中的方法进行设计。

  2. 如何通过作业逐步从面向过程渡到面向对象
           三次作业是从简单程序到面向过程再到面向对象的一个过程。第一次作业是一些简单的小程序,主要是熟悉Java语法。第二次和第三次作业是从面向过程到面向对象的转换。首先是解一元二次方程,为之后的时间类型的题目作铺垫,比起时间类型的题目更为简单,前一次作业是在一个类里面解决问题,运用的是面向过程的思想,后一次作业是要使用多个类解决该问题,是从面向过程到面向对象的一个简单转折。之后是关于时间类型的题目,需要考虑求下n天,前n天以及两个日期之间相差的天数等三个问题,前一次作业是运用面向过程的思想,分化了三个问题,逐个解决,后一次作业是将三个问题结合起来考察,需要设计一个类DateUtil去实现这三个功能,并且用三种不同的方法去编写程序。第一种是只需要设计DateUtil类,将day,month,year作为类的私有属性;第二种与第三种还需要设计Day,Month,Year三个类,用不同的结构去解决问题。时间类型的题目体现出了面向对象是为了模仿自然界的规律,而从第一种到第三种正是体现出面向对象的特点,将相关数据和方法看作一个整体,用不同的“组合”方法让我们明白结构的重要性,该如何使得这个整体看起来更加符合自然界的规律,实现对现实世界客体的真正模拟。

  3. 作业过程中遇到的问题及解决方法
           在这三次作业中,我还是遇到了挺多的错误。首先是对非法输入的判断,大多数情况是考虑不周所致,加强对可能存在的非法输入考虑,便能解决;再者是对算法的优化,提高程序的运行速度,例如求下n天与前n天,如果是用不断求下一天和前一天的方法速度太慢,于是我把超过一年的部分拿出来单独计算,大幅度减少了循环次数,提高了运行速度;最后是代码长度的问题,例如求两个日期之间相差的天数,一开始代码以及算法较为繁琐,后来发现可以通过getNextday,getPreviousday,compareDates,equalTwoDays四个方法的使用大幅度减少代码量,同时逻辑更加清晰。

  4. 每次作业花费的时间比例
           三次作业花费的时间比例是2:3:4。第一次作业比较简单,主要还是基础语法,所花时间较少;第二次作业要运用到方法,较于第一次难度增加,同时在时间的算法上出了一点小错误,卡了一下;第三次作业涉及到类的设计,类间关系等问题,同时完成程序后还要对程序进行优化,提高运行速度,难度较大。

  5. 对编程过程的逻辑严谨性的认识及教训
           在这次的作业中我体会到了编程的逻辑严谨性的重要性。例如没有考虑以及判断可能存在的非法输入,在一些合法输入中可能会出现数据越界的情况。由此可见逻辑严谨性是十分重要的,要考虑到方方面面可能存在的问题,用户可能有的非法输入,以及某些地方数据可能会有越界的情况出现。作为一名程序员,应该具有这样的逻辑严谨性,看待问题要全面,多方面去考虑,提高程序的容错性。

2.OO设计心得

  1. 面向过程与面向对象的比较
           通过了一个月的学习,我对面向过程与面向对象也有了一些自己的认识。
           所谓面向过程,就是将问题分步骤,变成一个个子函数解决问题,与计算机的运行方式相近;而面向对象是将编程问题抽象化,类的设计是模拟现实生活中的事物,而类中的属性和方法则代表了“事物”的特征和动作,最后通过对象之间的消息传递(即事物之间的互动),完成对自然界的模仿,从而解决问题,更加贴近人类的思维方式。
           在代码量方面,面向过程因为不存在类,所以函数之间可以直接调用,全局变量也能够直接访问,所以代码量上比较少;面向对象的私有变量和私有方法都不能直接调用,私有属性要通过对象调用相应方法进行获取和修改。
           在逻辑方面,面向过程与计算机的运行方式相似,而面向对象则是对自然界运行的模拟,更加贴近人的思维。前者的逻辑比较直接,对于人类可能有的时候难以理解,一些比较复杂的程序使用面向过程编程可能会比较复杂。后者模仿的是现实世界的事物,更容易接收,逻辑上也更加被人类接收,使得一些复杂程序的编程更加容易。
           在代码的维护性方面,面向过程因为是分步骤完成问题,各个步骤耦合性较高,一旦中间出现错误,可能之后全部需要修改,正所谓“千里之堤,溃于蚁穴”。但是面向对象就不会出现这种情况,低耦合以及封装性保证了类与类之间的关联很少,正如同一台故障仪器,可能是部分组装出了问题,也可能是个别零件有了毛病,但是部分重新组装和零件的更换不会影响到其余正确零件,这就体现出面向对象在可维护性方面的优点所在。
            
  2. 面向对象设计的基本原则理解
           单一职责原则。对象应该仅具有一种功能,从而使程序低耦合高聚合。正如同美国的三权分立,将立法权,司法权与行政权分开,三者之间互有联系,但是互不干扰。假如权力统一到一个人或一个集体上,一种权力的使用出现了错误或者变动,很可能导致其他两种权利的使用也发生问题。所以单一职责原则能够通过降低耦合性,提高聚合性,减少了变化对程序的影响,可以通过最小的变动完成对程序的维护。
           开放封闭原则。程序模块在扩展性的方面需要开放,在更改性的方面需要封闭。就像人与人之间的互动是开放的,而人的性格是封闭的,其他人不能直接了解别人地性格,要通过一定的交往才能够了解并通过一定行为去改变。
           关于里氏替换原则,接口隔离原则,依赖反转原则我了解,接触的比较少,不敢妄下定论。

  3. OO编程思维的理解
           在代码组织的逻辑上面向对象比面向过程要更加明晰。之前了解过面向对象是模仿自然界的运行,模拟现实世界的实体,但一直都不理解。完成第三次作业后发现其实面向对象编程就是创造不同的个体(类),赋予他专属的使命(单一职责原则),给予它各种特征(属性),各种能够完成的事情(方法),再通过齿轮(通过对象实现类与类之间的关系)去推动不同个体之间的交互(对象),模拟现实世界的一个抽象过程去解决实际问题。
           OO编程思维便是通过对类和对象的设计抽象并且模拟现实世界事物,符合自然界规律,通过输入命令模仿自然界的一系列行为,完成编程目的。

3.测试的理解与实践

  1. 测试对于编码质量的重要性
           测试用例对代码的测试相当于今后用户对程序的考验。编码质量的好坏在于能否考虑到所有可能发生的输入情况乃至于非法输入,而测试点的作用便是帮助我们发现自己思维上的漏洞。好的测试用例能够发现代码隐藏的问题,帮助我们的逻辑更加完善,提高代码的质量。

  2. 假如让我设计测试用例
           我觉得测试用例需要考虑四个方面。一是所有可能出现的非法输入的测试用例,包括越界输入以及不符合的数据输入。二是正常值的测试用例,一个程序至少要能够,在正常情况下完成运行,需要测试所有的基本情况。三是分界值的测试用例,在某些情况下可能会出现的特殊情况,应该专门设计测试用例测试代码是否能通过。四是极小和极大值的测试用例,用于检测代码会不会在某些范围出现越界的情况,以及限制代码的运行时间。
            道高一尺魔高一丈,测试员一定要比程序员想到的更多更全面,写出的测试用例才能发现代码的更多问题。

4.课程收获

       通过四周的学习,我明白了类与对象的定义,也对面向对象编程有了一些基本概念,能够按照要求完成类的设计,同时锻炼了自己的逻辑思维能力。而且通过一些错误,我明白了自己思维上存在的一些盲点与缺点。首先是逻辑思维不够严谨,容易出现漏洞,忘记考虑可能出现的情况。再者是在算法上容易出现问题,不能够灵活运用已有方法解决当前问题。虽然这些毛病不可能一下就根除,但是我会加强练习,锻炼逻辑思维能力与算法推演能力,争取学的越来越好。

5.对课程的建议

       这门课程确实有难度,特别是在对面向对象的理解和类的设计上。我觉得自己的逻辑思维能力还不够,在这次作业中有一些算法的处理上有一些混乱和漏洞,希望老师上课能够多问一些小问题,锻炼我们的逻辑思维能力。不然上课一直听老师讲感觉自己的脑子都没有转起来,只是单纯的学习没有思考。

posted @ 2020-04-03 23:43  无冕之王tang  阅读(58)  评论(0)    收藏  举报