OO作业总结(一)

由面向过程语言过渡到面向对象语言

一、前言

pta三次作业题目说明

1、 Java_Homework1

1) 计算税率

2)判断坐标点所在范围 

3)电话键盘字母数字转换 

4)判断三角形类型 

5)统计最大数出现次数 

2、 Java_Homework2

1)求一元二次方程

2)判断闰年及星期几

3)求下一天

4)求前N天

3、 Java_Homework3

1)用类解一元二次方程式 

2)日期类设计 

3)日期问题面向对象设计(聚合一)

4)日期问题面向对象设计(聚合二)

二、作业过程总结

1、 三次作业之间的知识迭代关系

 

1)知识点层层递进

第一次作业让我了解了Java的基本语法。

第二次作业让我理解Java的方法,了解到C语言和Java语言数组的区别。

第三次作业让我真正意义上走入java,了解了类与对象、类之间的关系,学会通过不同方法去完成同一个功能的设计。

 

2)算法层层递进

第一次作业基本上是一些简单的逻辑运算。

第二次作业我们通过方法进行一些数学计算及对日期类设计的初步算法设计。

第三次作业我们通过类进行一些数学计算,对日期类设计进一步的算法设计。

日期类算法的层层递进关系

 

2、 通过作业逐步从面向过程语言过渡到面向对象语言

1)第一次作业让我了解了Java的基本语法。类似的题目,上个学期我也用C语言在pta做过。

2)第二次作业让我了解到C语言和Java语言数组的区别。我使用了Java的方法和数组。

3)第三次作业让我真正意义上了解了java。前两次作业给我的感觉和C语言大同小异,而第三次作业有一种让我对对象豁然开朗的感觉。

对象代表现实世界中可以明确的一个实体。而类为对象定义属性和行为。一个对象是类的一个实例。我们可以从一个类中创建多个实例。

在第一题求二元一次方程,我学会了如何定义类,初步了解了调用对象和使用方法的不同。使用方法时,方程的系数、根的个数和根之间是毫无关系的。使用类时,方程就是一个对象,它的系数、根的个数和根都是它的属性。

后面三题是对同一个功能的不同设计,我从中学会了如何为对象定义类。第二题和第一题大同小异。第三题和第四题是通过DateUtil、Year、Month、Day四个类的不同聚合关系来设计的。第三题是通过DateUtil调用了Day,再通过Day调用Month,最后通过Month调用Year。第四题是通过DateUtil直接调用Year、Month、Day三个类。通过这两题的代码比较,可以发现后一种聚合方法明显优于前一种。间接调用显得代码很累赘。

3、 作业过程中遇到的问题及解决方法

1)直角三角形的判断条件错误

原因:浮点数因为存储形式的原因不能直接和0值比较,float,double分别遵循R32-24,R64-53的标准。所以float的精度误差在1e-6;double精度误差在1e-15。所以要判断一个单精度浮点数是if( abs(f) <= 1e-6),要判断一个双精度浮点数则是if( abs(f) <= 1e-15 )

解决方法:将a * a + b * b = c * c 改成 a * a + b * b - c * c <= 1e-6。

2)内存超限

原因:对于下n天和上n天只从月和天进行判断,当天数过大,循环将重复非常多次。

解决方法:在此之间加上一个对四百年天数加减的循环。

3)月越界

原因:当判断输入是否正确是,不管月份是否正确,都会进行对天数的判断。当月份错误时,数组将会越界。

解决方法:先对月份进行判断,若正确再进行对天数的判断。

4、 每次作业花费的时间比例

第一次作业:第二次作业:第三次作业 = 1 :2 :10

5、 对编程过程的逻辑严谨性的认识及教训

编程是一件非常严谨的事情,思维要慎密,逻辑要强,写代码时必须要专注仔细。在写作业的过程中,星期三的英文字母一不小心我给打错了。在自己调试过程中,并没有注意到。因为题目类似,里面有一些方法重复,所以我是先将所有题目写完再提交代码。提交的时候却发现代码有错误。因为几个字母,我找了半天。编程即是如此,如果不及时修改代码中的bug,bug就会越滚越多,最终导致无法挽救的地步。

在写下n天和前n天方法时,因为偷懒使用了无意义的变量名,导致隔一段时间回来,看不懂自己代码,运行又出现了错误,所以不得不重新写了一份。所以编程过程的逻辑严谨性真的很重要!

三、OO设计心得

1、 面向过程和面向对象的区别

1)面向过程就是分析出解决问题所需要的步骤,用函数把步骤一步步实现,使用时一个个依次调用。面向对象是把构成问题事物分解成各个对象,建立对象目的,描述某个事物在整个解决问题的步骤中的行为。面向过程性能比对象高,但没有面向对象易维护、易复用、易扩展。

2)浅谈C语言和Java的区别

C语言是面向过程的语言,执行效率高。Java是面向对象的语言,通用性好,可以跨平台直接移植。

Java与C语言大量成分保持相同,例如语法结构、表达式语句、运算符。Java的标识符可以以$开头,关键字与C语言也略有不同;C语言的变量可以不进行初始化,Java的变量要进行初始化;在C语言中,char类型占一个字节,而在Java中,char类型占两个字节;Java少了C语言容易引起异常错误的指针;Java有垃圾回收机制。

Java面向对象的特征主要有封装、继承、多态。类的继承关系的单一的、非多重的。一个子类只有一个父类,子类的父类又只有一个父类;C语言支持“运算符的重载”。它允许直接对对象进行四则运算,Java不支持;Java支持方法重载和重写;Java比C语言多了一些修饰符,public、private、protected和默认可行性修饰符;Java有super关键字,指代父类对象,通常被同于调用父类的构造方法或一般方法;C语言没有super关键字,两者都有this,指代当前对象;在Java中,除了static、final、private是静态绑定以外,所有方法一律按动态绑定处理;Java中可以将类组织起来用Package打包,而C语言没有。

2、 面向对象设计的基本原则理解

1)单一职责原则(SRP):对于一个类而言,应该仅有一个引起它变化的原因。

 

“就因为你可以,不代表你应该。”  一个类可以有多个职责,但不代表它应该有多个职责。

2)开放-封闭原则(OCP):软件实体(类、模板、函数等等)应该可以扩展,但是不可以修改。

 

“穿外套不需要开胸手术。” 扩展一个类的行为不需要去修改一个类,只需要在原有类的前提下去扩展。

3)里氏替换原则(LSP):子类型必须能够替换它们的基类型。

 

“如果它看起来像鸭子,嘎嘎叫起来像鸭子。但是需要电池——你可能有错误的抽象。” 继承必须保证超类所拥有的性质在子类中依旧成立。

4)依赖倒置原则(DIP):高层模块不应该依赖底层模块,两个都应该依赖其抽象。

 

“你能把灯直接焊接到墙上的电线上吗?”程序依赖抽象接口,而不应该依赖具体实现。

5)接口隔离原则(ISP):客户端不应该依赖它不需要的接口。

 

“你想让我插在哪里?” 接口应该仅包含必要的方法,而不该包含其它的。

3、 OO编程思维的理解

OO就是面向对象。面向对象是一种对现实世界理解和抽象的方法,是计算机编程技术发展到一定阶段后的产物。面向对象的编程方式使得每一个类都只做一件事。面向过程会让一个类越来越全能,就像一个管家一样做了所有的事。

四、测试的理解与实践

1、测试对于编码质量的重要性

作为一个新手,我们编写代码的严谨性不是很强。很多时候我们以为自己写对了,但是提交上去,却发现有错误。这就是我们编码过程中的严谨性不够的体现。测试代码可以帮助我们检验我们编写代码的质量。有一句话说得好,没有程序员能写无bug的代码,代码质量离不开测试。

2、设计测试用例

1)所有可能输入的数据,分为有无效等价类和有效等价类,然后从每一个子集中选取少数具有代表性的数据作为测试用例。

2)对输入或输出的边界值进行测试。

五、课程收获

初步掌握了Java语言,了解了如何面向对象过程编程。在学习的过程中,不能仅仅停留在表面,不然很容易导致只知其一不知其二的后果。运行完课本 上的例子,可以更具自己心的疑惑去改变代码,看看能不能把运行,思考为什么。一定要自己动手试着写代码,学到的知识才能真正属于自己。在学习过程中,遇到形形色色的问题不容易解决,不应该直接就问别人。应该学会自己多去专业论坛了解相关的知识去解决。

六、对课程的建议

每周一次的几题练习,对部分同学来说不够练。希望老师可以出一个习题库,供有需要的同学练习。

posted @ 2020-04-04 22:19  BlogOfComing  阅读(179)  评论(0)    收藏  举报