Java第三次总结
1. 前言
本次作业针对的是第七次作业以及两次ATM机的实验,首先说明一下作业的情况,第七次作业得分情况是100分,ATM第一次作业的得分情况是90分,ATM第二次作业的得分情况是100分。以及第三阶段学习了面向对象程序设计课程的心得体会。总结心得如下:
2.设计与分析
①总结三次作业之间的知识迭代关系:
作业的难度和复杂度是以此递增的,第七题应该是这三次作业中最简单的了,因为图形继承在第六次作业中已经做过了,现在只需加一个Card让他们关联起来即可,主要考察的有四点:1.继承、多态的应用;2.ArrayList泛型的应用方法;3.Comparable接口及泛型的应用单一职责原则的应用;4.“开-闭”原则的应用。通过此例,进一步深入理解面向对象设计原则中的“单一职责”原则和“开-闭”原则。第二题则是在第一题的基础上进行的改善,考虑面向对象设计的“单一职责原则”,思考该程序是否能够符合“开-闭”原则。这两道题都是为了让我们掌握类的继承、多态性使用方法以及接口的应用。
而两次ATM机的作业就比较困难了,作业要求编写一个银行 ATM 机的模拟程序,能够完成用户的存款、取款以及查询余额功能。首先要联系现实,明白中国银联(China UnionPay),银行(Bank),银行用户(User),银行账户(Account),银行卡(Card),ATM(Automated Teller Machine)的概念,其次是注意题目中的各实体类之间的关系,尤其是一对多的组合关系。 (2)对实体类的设计要做到单一职责原则,且不能缺少规定的实体类。 (3)编程时考虑面向对象中的封装性本题目中的应用以及是否有能够扩展 的衍生需求。第一次还差不多,只是一些简单的要求,存钱和取钱,没有跨行的要求。没拿满分是因为在密码那个测试点,有一丝尴尬,没有看清题目的要求,把拼音的密码写了上去,导致一直过不去。
第二次的ATM机就不太一样了,这次作业中银行卡包含借记卡和信用卡两类,且允许跨行办理相关业 务(例如在中国建设银行的 ATM 机上使用中国工商银行的银行卡进行业务操作)。设计要求也有了不一样的变化,设计要求 (1)务必注意本题目中的各实体类之间的关系,尤其是一对多的组合关系。 (2)对实体类的设计要做到单一职责原则,且不能缺少规定的实体类。 (3)在“合成复用原则”及“单一职责原则”基础上,尽量对上次作业的程 序进行重构,使之符合 “开-闭”原则。
②如何通过作业逐步理解面向对象的“合成复用原则”及“单一职责原则”,“开-闭”原则;
合成复用原则:优先使用对象组合,而不是继承来达到复用的目的。
合成复用原则分析:
1.合成复用原则就是在一个新的对象里通过关联关系(包括组合关系和聚合关系)来使用一些已有的对象,使之成为新对象的一部分。
2.新对象通过委派调用已有对象的方法达到复用功能的目的。
3.复用时尽量使用组合/聚合关系,少用继承。
4.继承复用:实现简单,易于扩展,破坏系统的封装性;从基类继承而来的实现是静态的,不可能在运行时发生改变没有足够的灵活性;只能在有限的环境中使用。
5.组合/聚合复用:耦合度相对较低,有选择性地调用成员对象的操作;可以在运行时动态进行,新对象可以动态地引用与成员对象类型相同的其他对象。
单一职责原则:一个对象应该只包含单一的职责,并且该职责被完整的封装在一个类中。
单一职责原则分析:
1.一个类(大到模块,小到方法)承担的职责越多,它被复用的可能性就越小 当一个职责变化时,可能会影响其他职责的运作
2.将这些职责进行分离,将不同的职责封装在不同的类中
3.将不同变化的原因封装在不同的类中。
4.单一职责原则是实现高内聚,低耦合的指导方针。
开闭原则:软件实现应当对扩展开放,对修改关闭。
开闭原则分析:
1.开闭原则由Bertrand Meyer于1988年提出。
2.在开闭原则的定义中,软件实体可以是一个软件模块,一个由多个类组成的局部结构或一个独立的类。
3.开闭原则是指软件实体应尽量在不修改原有代码的情况下进行扩展。
4.抽象化是开闭原则的关键。
5..相对稳定的抽象层+灵活的具体曾。
6.对可变性封装原则:找到系统的可变因素并将其封装起来。
③作业过程中遇到的问题及解决方法
ATM在办理跨行业务的时候出现了麻烦。
④每次作业花费的时间比例
第一次作业花了一天左右,这次作业比较简单,花费的时间不多;
两次ATM也是各花费了一天左右,相比于以前,如今的Java已经不一样了。以前是没有思路,现在是有了质的改变。
2.OO设计心得
①对面向对象三大技术特性之间关系的理解
1. 封装——对类里面的成员变量通过使用private修饰符进行隐藏,通过使用public 修饰符来编写它们对应的方法来进行访问和修改。将不同的职责抽离出来封装到不同的类中.可以实现对代码的解耦;封装是通过将对象的某些属性和和操作隐藏起来,内部信息是对外隐藏的,在其他的地方就不能随便使用了,是对成员的一种保护。封装可以被认为是一个保护屏障,防止该类的代码和数据被外部类定义的代码随机访问。
2. 继承——如果子类继承于父类,子类继承父类非private的属性和功能,子类具有自己的属性和功能,即父类没有的属性和功能;第三,子类还可以以自己的方式修改父类的功能;继承的子类拥有父类非 private 的属性、方法,子类可以拥有自己的属性和方法,即子类可以对父类进行扩展,子类可以用自己的方式实现父类的方法。Java 的继承是单继承,但是可以多重继承,单继承就是一个子类只能继承一个父类。
3. 多态——多态表示不同的对象可以执行相同的方法,但是不同的对象对于方法的实现不同,操作就可以不同,多态是一种事物的不同表现形式,具有多样性。就像是走路,每个人走路的形态都是不相同的。
②面向对象设计的基本原则理解(单一职责原则及“开-闭”原则)
在面向对象中每个类每个方法都是承担也是实现一种功能的操作,不会出现很多功能放在一起的情况。
对于开闭原则,看到过CSDN两句话,“对于扩展是开放的” ,“对于更改是封闭的”,模块的行为可以根据需要得到扩展,此时可以不用改动原来的代码而得到实现。
开闭原则指导我们,当软件需要变化时,应该尽量通过扩展的方式来实现变化,而不是通过修改已有的代码来实现。这里的“应该尽量”4个字说明OCP原则并不是说绝对不可以修改原始类的,当我们嗅到原来的代码“腐化气味”时,应该尽早地重构,以使得代码恢复到正常的“进化”轨道,而不是通过继承等方式添加新的实现,这会导致类型的膨胀以及历史遗留代码的冗余。当然我们在开发过程中也没有那么理想化的状况,完全地不用修改原来的代码,因此,在开发过程中需要自己结合具体情况进行考量,是通过修改旧代码还是通过继承使得软件系统更稳定、更灵活,在保证去除“代码腐化”的同时,也保证原有模块的正确性。
③OO编程思维的理解
面向对象中,对问题细致划分,通过一个个小功能的实现,而实现整个大的功能,而不是去专注于整个过程应该怎么解决。因而复用性很强。
④类设计心得
一个类的设计,应该是一个相对比较大的功能的实现,在这个类里有着实现该功能所必要的条件实现起来相对完整。
4.课程收获
总结这四周来在OO方面的教训及收获
在写了很多次关于图形的作业后很快吸收了继承和多态的意义,从这个角度出发,让我领会了面向对象的意义。同时我也学会了正则表达式的使用,这让我知道了知识的萃取不能光依赖老师的讲解,我们需要及时在网络上查阅相关资料来获得知识。总之我的代码水平在这三次作业中得到了很大的提高,解决问题的独立性也因此增强
通过这三个月的训练,,对面向对象三大技术特性封装,继承与多态三者之间关系有了更深的理解,对它们的运用也更熟练了。
了解了并慢慢开始使用“开-闭”原则,进一步训练了单一职责原则,对面向对象理解更深开闭原则指导我们,当软件需要变化时,应该尽量通过扩展的方式来实现变化,而不是通过修改已有的代码来实现。这里的“应该尽量”4个字说明OCP原则并不是说绝对不可以修改原始类的,当我们嗅到原来的代码“腐化气味”时,应该尽早地重构,以使得代码恢复到正常的“进化”轨道,而不是通过继承等方式添加新的实现,这会导致类型的膨胀以及历史遗留代码的冗余。当然我们在开发过程中也没有那么理想化的状况,完全地不用修改原来的代码,因此,在开发过程中需要自己结合具体情况进行考量,是通过修改旧代码还是通过继承使得软件系统更稳定、更灵活,在保证去除“代码腐化”的同时,也保证原有模块的正确性。在ATM的问题上,第一次是运行超时的,这也让我看到了代码的优化也是很重要的。
①总结三次作业之间的迭代关系
第七次到ATM两次作业,难度逐渐增加。
第七次作业:目的是让我们掌握类的继承、多态性使用方法以及接口的应用。
两次ATM则是通过作业逐步理解面向对象的“合成复用原则”及“单一职责原则”,“开-闭”原则;
②如何通过作业逐步从面向过程过渡到面向对象
在第三和第五次作业中,从面向过程的日期判断迭代到第四次,第五次作业面向对象的日期计,面向过程在思考和编写代码时较为简单,但具有很大的耦合性,代码中各部分关联较大,且只能顺序完成单一功能,一旦出现需求更改,几乎难以修改代码。而面向对象将各部分抽离出来成为类,使其解耦,通过对象之间的操作完成所需功能,复用性好,扩展性强。
5.总结
1.第四阶段作业难度、题量的建议
难度不要偏重于单一的部分,不要像第四次作业的第一题水文校验一样,大部分时间都用在了对数据格式的验证上,实际上实现功能并不难,但是大部分时间花在了编写正则表达式上。题量两三题即可,代码的完整性还是很重要的。不要在意数量,质量才是最重要的。
2.课程内容讲解方面的建议
就是关于PTA方面查重问题,我觉得查重应该是查最后一次正确提交的代码,而不是第一次。
做题的话,只靠课上老师讲的内容是不够的,很多内容都是需要自己去找资料的,希望课上的内容有更多的实例让我们去理解。
3.课程难点
学习了这段时间的Java,个人觉得难度固然是有的,比如说字符串的分隔,以及正则表达式和Map的使用,这些稍不注意就会报错或者是运行错误,有些地方比如面向对象的思路,类的思路也很难理解,但是其实上课认真听课,积极完成课堂作业以及PTA,课后也可以去观看慕课复习知识,其实最后坚持下来发现Java的学习虽然不算简单,但却是充满韵味的,比如当你学习了一节课很轻松的完成了老师交给的课堂作业或者历经百般磨难PTA这个题目的测试点全都能过时,那个红色字体的“答案正确”真的让人回味无穷,有了很强的成就感。
4.个人收获
通过这一个学期对于《Java面向对象设计》课程的学习,虽然困难但是还是坚持了下来,一个学期的时间学习了关于Java的很多很多知识,这里就不一一描述了,最主要的是从原先学习C语言的面向过程的思想,转变到现在也具备了一定的面向过程的思想,以及关于面向对象三大技术特性封装性、继承性、多态性理解的提高,从一开始看到复杂的UML类图不知所措,但后面有自己的独力思考能力可以将他们分为一个一个类去解题,也是一个质的改变。时间也是过的飞快,但是我也不会终止对于Java的学习,有时间也会去看一些大佬的博客或者相关书籍,我现在学到的应该还是冰山一角,后面还需要继续学习了解。
浙公网安备 33010602011771号