OOP最终阶段性总结
0. 前言
本阶段,本次博客主要记录所有作业后的思考,出现的问题以及我的解决办法。
1. 作业过程总结
① 从homework1到homework11,OOP课程设计的难度在不断提升,写起来也越来越顺手。
② 首先,前三次作业作为从C语言的面向过程编程到Java语言的面向对象编程的过渡,题目比较简单。
③ 其次,中三次作业难度稍微提升,练习了面向对象的写法,并且学习了正则表达式和集合框架的使用。
④ 最后,后三次作业的难度提升了很多,将我们学过的知识结合起来考察,并且用到了数据结构的知识,思维上得到了很好的锻炼。
2. OO设计心得
(1)几种原则的理解
(1)单一职责原则:每个类做好自己的事情,尽量不与其他类功能重复,
(2)开闭原则:要对扩展开放,对修改关闭。就像上次那个雨刷的随堂作业,利用控制类来集成很多类,利用抽象类来使扩展性增强。但这个其实是一个矛盾的点,当追求过多的可扩展性就会导致代码臃肿,而追求代码代码简洁又会对扩展性造成影响,所以这里需要根据实际情况来平衡选择。那次的代码我就觉得有些不合实际,有些臃肿了,我认为既然雨刷的工作模式几乎使固定的,就没有必要在一开始设计的时候就绞尽脑汁去想一些极特殊情况,但是其他的扩展还是有必要的。
(3)里氏代换原则:在软件中将一个基类对象替换成它的子类对象,程序将不会产生任何错误和异常,遵循这个原则可以让我们能更加抽象的编写代码,不用过于纠结对象会如何实例化,修改的时候也可以只修改子类而不用担心用到这个子类的代码出现问题。
(4)依赖倒置原则:可以作为手段实现开闭原则,要与里氏代换原则和开闭原则一起学习使用。
(5)迪米特法则:这是一个为了减少耦合度而存在的法则,非常重要。
(2)三大技术特性
①封装
封装,就是把客观事物封装成抽象的类,并且类可以把自己的数据和方法只让可信的类或者对象操作,对不可信的进行信息隐藏。 一个类就是一个封装了数据以及操作这些数据的代码的逻辑实体。在一个对象内部,某些代码或某些数据可以是私有的,不能被外界访问。通过这种方式,对象对内部数据提供了不同级别的保护,以防止程序中无关的部分意外的改变或错误的使用了对象的私有部分。
继承
继承,指可以让某个类型的对象获得另一个类型的对象的属性的方法。它支持按级分类的概念。 继承是指这样一种能力:它可以使用现有类的所有功能,并在无需重新编写原来的类的情况下对这些功能进行扩展。 通过继承创建的新类称为“子类”或“派生类”,被继承的类称为“基类”、“父类”或“超类”。继承的过程,就是从一般到特殊的过程。要实现继承,可以通过 “继承”(Inheritance)和“组合”(Composition)来实现。继承概念的实现方式有二类:实现继承与接口继承。实现继承是指直接使用 基类的属性和方法而无需额外编码的能力;接口继承是指仅使用属性和方法的名称、但是子类必须提供实现的能力。
多态
多态,是指一个类实例的相同方法在不同情形有不同表现形式。 多态机制使具有不同内部结构的对象可以共享相同的外部接口。这意味着,虽然针对不同对象的具体操作不同,但通过一个公共的类,它们(那些操作)可以通过相同的方式予以调用。
②单一职责原则SRP(Single Responsibility Principle)
是指一个类的功能要单一,不能包罗万象。如同一个人一样,分配的工作不能太多,否则一天到晚虽然忙忙碌碌的,但效率却高不起来。
开放封闭原则OCP(Open-Close Principle)
一个模块在扩展性方面应该是开放的而在更改性方面应该是封闭的。比如:一个网络模块,原来只服务端功能,而现在要加入客户端功能,那么应当在不用修改服务端功能代码的前提下,就能够增加客户端功能的实现代码,这要求在设计之初,就应当将服务端和客户端分开,公共部分抽象出来。
④类的设计心得
保证数据的私有性(private):
为了实现一个类的良好封装性,一定不要使用其他的方式去声明成员变量,这是为了后期代码维护做的基本准备.
对数据初始化:
虽然编译器会自动对成员变量进行隐式初始化,但是为了可读性,应该为变量提供初始化或是利用构造器进行初始化(局部变量必须初始化).
不要在类中使用过多的基本类型:
意思是当类中存在多个基本数据类型时,用一个引用类型来包装这些基本类型,这样可以增强其可读性,且后期要替换这个类的名称也更简单.
并非所有的域都需要getter/setter:
例如:在一个Employee类中,雇员的薪水是可以有getter和setter的,但是雇员的雇佣日期就不应该有setter.一个类的功能尽量不要太繁杂:如果一个类的某些功能明显的可以分为两类,就应该将其分解.
类名/方法名的名称要可以体现其职责
3. 测试的理解
① 再刚开始,没写测试,相当于欠下债务。在之后,程序出现bug时,需消耗大量时间和精力去debug。而如果在最开始写一个测试,可能只需要1分钟就能搞定。
② 先找一些常见样例,再往一些比较特殊的情况考虑,比如说范围最大最小,特殊情况等。
4. 课程收获
面向对象程序设计,要遵守五大原则,熟连运用三大特性(封装,继承,多态)。写程序时,也要常常测试,以免写完后出现bug时的难以修改。
5. 对课程的建议
①希望不要采用pta的这种方式。这样子写代码,失去了我们本来的意义,相当于把面向对象硬生生写成面向过程。
②希望老师能抽出时间回答一下同学们的问题,不要总是让人有种本门课程全是靠自学的感觉。