OO学习最终总结
0.前言:本次主要是针对第三阶段的三次作业以及整个课程学习的总结,这三次作业主要是针对对程序进行重构使得程序可以对功能进行扩展的训练以及对类的设计,所以在此阐述在练习过程中的问题以及感悟。
1.作业总结
1. 三次作业的难度相差不大,但由于这三次没有给出参考UML类图,全部类的设计都需要自己思考设计所以会比给了类图的相对麻烦一点。前两个阶段的作业主要注重基础知识的训练以及理解,如继承封装、多态以及类的聚合等等。该阶段的三次作业都是自己设计类并且对程序进行重构使得可以对功能进行扩展,加深对单一职责原则和“开-闭”原则以及对面向对象过程的理解和体会。层层深入,让我们从中学习以及理解。
2.第一次作业的雨刷程序功能扩展设计相对比较麻烦的就是功能扩展部分,需要用到抽象、接口、继承,整个类的设计也是利用类的单一职责将每一部分封装成一个类并且继承各自的抽象类,且一个类只负责该类的职责,类与类之间的聚合来实现整个过程,加深了我对单一职责和“开-闭”原则的理解。Dial类、Lever、Brush类、Agent类各自继承自自己的抽象类,如果不用继承就会发现其实他们之间很多代码都是重复的,用了继承给他们之间建立一个联系,这样就可以减少代码的冗余,而且也能更加体现他们之间的关系,更加符合实际,且能够对功能进行扩展,需求变了只需再new一个新的Agent类就可以了,不会影响之前的需求,这就是“开-闭”原则。接下来的第二次是自己设计类实现统计Java程序中关键词的出现次数,通过这次作业加深了我对于字符串的相关方法以及知识点的学习以及运用,还有让我对于面向对象的设计有了更深的体会。第三次在第二次的基础上更加麻烦一点,需要使用堆栈以及正则表达式,用正则表达式来判断表达式的合法性,用堆栈来计算表达式的值,并且对设计做修改,将它们继承抽象类实现扩展性和复用性,这就是对修改关闭,对扩展开放的“开-闭”原则。总之,三次作业最主要的就是学会自己设计类,以及运用“开-闭”原则使程序的功能完善且实现扩展性。
3.第一次作业的雨刷程序功能扩展设计中总是报空指针和数组越界的错误,这两个错误相信并不少见,经常都能碰见,是真的烦人。所以异常处理的优势就凸显出来了,一个异常处理就可以解决,让他遇到异常跳出继续执行下面代码,不对异常处理,可以规避很多异常情况,非常方便。
第二次作业的统计Java程序中关键词的出现次数一开始我始终通不过全部关键字测试,后来发现我的53个关键字中有一个不是关键字,也就是关键字找错了一个才导致这个测试点过不了。还有两种注释的测试也没过,几次检查发现是少考虑了/**这种情况。最后一个正常测试到最后也过不了,目前还没发现是哪里的问题,各种测试都没有问题,但是就是过不了该测试点,很是无奈。
第三次作业的表达式求值开始的时候堆栈使用不太好,总是报错,不然就是出现空栈的错误,一次次尝试,一次次修改,终于能够正常运行了,由于之前的多次作业都运用过正则表达式判断,所以在判断过程花费的时间不多,也相对熟练了一点,总体上也没有很大问题就写完了这次作业。
4.三次花费时间比例为2:6:2。第二次花费时间主要是在最后一个测试点上反复修正,仍然没有发现到底问题出在哪。
5.编程首先就得仔细看清楚需求分析,这个很有必要,看的越仔细,后期就会花更少的时间来检查这方面的问题;其次需要屡清楚你要做的是什么,怎么做,需要什么,怎么分解成一个个小问题,把这些小问题逐个封装成单独的类,再通过接口以及它们之间的联系建立相应的关系,完成初步设计,在对其针对单一职责和“开-闭”原则对设计作进一步的调整,达到复用性高,设计严谨;再者就是需要提前对异常情况做预判以及处理,亦或者规避,保障程序在任何情况都能正常运行,因为测试的工作总是巨大而且相对片面的,并不能完全检测出所有的异常情况,所以及时做一些异常处理的规避还是很有必要的。当然保证功能的完整正常还不够,还需要对程序进行改善,对功能设计分工明确,使得代码的能够实现复用性以及可扩展性,减少冗余。
2.OO设计心得
1.每一个单独的部分通过封装成类,封装的类可以通过继承抽象类或者接口来实现多态性。多态必须要求有继承,抽象类就是为了继承而生,而它们的基础都是类的封装。
2.单一职责原则:一个类就专注地做一件事。“开-闭”原则:对修改关闭,扩展开放,就是当某个类的方法不满足需求了,不会对其方法进行修改,而是创建一个抽象类让其继承于该抽象类,再另外写一个子类继承它来实现新的需求。
3.面向对象的思想就是在解决问题过程中分解成一个个小问题,再把这些小问题作为一个单独的个体来对它们进行处理,它们有自己的功能和状态以及与其他个体之间的联系,然后它们之间相互作用来解决问题。这样的设计方法比较符合现实,其实每个大难题都是由一个个小问题组成的,所以只要把它们分解成小问题,再逐个解决就可以了。这也是类似的道理。
4.类主要还是要坚持单一职责原则,一个类就干一件事,分工明确才有秩序,不会乱成一团。当然也要考虑到“开-闭”原则,增强代码复用性以及扩展性,使得设计更加灵活多变。
3.测试的理解与实践
1.通过测试可以检查程序的功能是否能在各种状况下正常运行,保障功能正常运行,当然测试的目的并不是单纯的为了找错误,而是通过分析错误产生的原因和错误的发生趋势,可以帮助项目管理者发现当前软件开发过程中的缺陷,以便及时改进,这样可以保障代码的质量以及程序功能的稳定。只有编码质量有保证,功能才能稳定,才能受到广大用户的好评。所以测试是保障编码质量的重要手段。
2.使用Junit进行程序的测试是可行的,它可以通过编写一系列的测试来对项目所有的接口或者方法进行单元测试,启动后,自动化测试,并判断执行结果,
不需要人为的干预。只需要查看最后结果,就知道整个项目的方法接口是否通畅。并且各个测试之间是相互独立,互不干扰的。所以使用Junit进行测试还是一个不错的可行方法。
4.课程收获
这三个阶段的OO编程训练,一次次的加深我对其思想和设计的理解和体会,更加理解面向对象的含义。在练习过程中也会碰到很多问题,逐步认识到自己的不足
。学习到OO编程需要始终遵循单一职责原则和“开-闭”原则,这样可以更好地检查代码的错误以及使你设计的代码有更好的复用性和扩展性,减少代码冗余,保证代码的质量。测试也是不能少的,它可以帮你更加全面的检查代码功能问题,减少自己逐篇检查代码逻辑的时间和工作量。
5.课程学习总结
课程对每个重要的知识点进行有针对性的学习和训练,让我们在训练中学习理解,能够学以致用,更好的掌握它们。大体的知识基础有了后,接下来就是学习新的知识和进一步完善每一次设计,保证代码的扩展性和灵活性,让我们对于面向对象有了更深的理解和感悟。该门课程区别于其他课程,是一个需要日积月累的代码量堆积起来的,达到一定量才会对OO编程有更深一层的理解和感悟,光靠理论知识的堆积是远远不够的,当然也要是有质量的代码量才能够提高自己的编程水平。我们在课堂上能够学到的,学进去的也不太多,仍然需要课后的学习积累以及训练才能更好的学习该门课程。
OO学习最终总结的更多相关文章
- 【OO学习】OO第三单元作业总结
[OO学习]OO第三单元作业总结 第三单元,我们学习了JML语言,用来进行形式化设计.本单元包括三次作业,通过给定的JML来实行了一个对路径的管理系统,最后完成了一个地铁系统,来管理不同的线路,求得关 ...
- 【OO学习】OO第四单元作业总结及OO课程总结
[OO学习]OO第四单元作业总结及OO课程总结 第四单元作业架构设计 第十三次作业 第十四次作业 总结 这两次作业架构思路上是一样的. 通过将需要使用的UmlElement,封装成Element的子类 ...
- 【OO学习】OO第二单元作业总结
OO第二单元作业总结 在第二单元作业中,我们通过多线程的手段实现了电梯调度,前两次作业是单电梯调度,第三次作业是多电梯调度.这个单元中的性能分要求是完成所有请求的时间最短,因此在简单实现电梯调度的基础 ...
- 【OO学习】OO第一单元作业总结
OO第一单元作业总结 在第一单元作业中,我们只做了一件事情:求导,对多项式求导,对带三角函数的表达式求导,对有括号嵌套的表达式求导.作业难度依次递增,让我们熟悉面向对象编程方法,开始从面向过程向面向对 ...
- OO学习体会与阶段总结(多线程程序)
前言 在最近一个月的面向对象编程学习中,我们进入了编写多线程程序的阶段.线程的创建.调度和信息传递,共享对象的处理,线程安全类的编写,各种有关于线程的操作在一定程度上增加了近三次作业的复杂度与难度,带 ...
- OO学习体会与阶段总结(设计与实现)
前言 在最近的一个月的课程中,笔者对于规格化编程进行了深入的学习.运用面向对象抽象思想对编写的程序进行过程抽象.异常处理.数据抽象.类的层次规格与迭代等等规格设计,使得程序结构化程度提高,具有更好 ...
- OO学习体会与阶段总结(测试与论证)
前言 随着期末的到来,对于面向对象程序设计课程的学习也迎来了尾声.在最后一个月的从课程中,笔者对于面向对象程序规格实现层面的单元测试.正确性论证以及使用UML图描述程序的设计进行了深入的学习.通过 ...
- OO学习总结与体会
前言 经过了对于面向对象程序设计的一个月的学习,我初尝了JAVA以及面向对象程序的魅力.经历了三次难度逐渐加大的课后编程作业,我对于工程化面向对象编程以及调试有了深刻的认识与颇多感想.我写下本篇文章以 ...
- OO学习第二阶段总结
面向对象课程的第二个阶段结束了,作业们由简单的玩具模式步入到复杂的多线程地狱模式,由之前的算法简单实现有坑转变成算法复杂实现有很大的坑.一个最重要的心得就是一定要在动手敲代码实现之前对整个程序的实现做 ...
随机推荐
- IP协议及其它的小弟 ,我保证没人会看的
IP协议及其它的小弟 IP协议:127.0.0.1就一个32位的标识符.实际上: 类似这样的: 精神小伙慢慢看吧.我赌一包辣条你是不会认真看完的. IP协议的构成 地址解析协议 ARP 前面的叙述中我 ...
- promise的理解和使用
1. Promise是什么 1.1 promise 的理解 1. 抽象表达: Promise 是 JS 中进行异步编程的新的解决方案(旧的是纯回调形式) 2. 具体表达: (1)从语法上说:Promi ...
- 不卸载Nginx隐藏版本号
[修改配置文件](不卸载Nginx隐藏版本号,直接修改配置文件) Linux环境: [root@localhost nginx-1.16.1]# curl -I http://10.56.1.115 ...
- python之Python VS Code下载和安装教程
Visual Studio Code,简称 VS Code,是由微软公司开发的 IDE 工具.与微软其他 IDE(如 Visual Studio)不同的是,Visual Studio Code 是跨平 ...
- 3.8 Go Array数组
3.8 Go Array数组 数组是固定长度的特定类型元素组成的序列. 一个数组由零或多个相同类型元素组成. 数组的长度是固定,因此Go更常用Slice(切片,动态增长或收缩序列). 数组是值类型,用 ...
- uefi win10 Ubuntu 18的安装
uefi win10 Ubuntu 18的安装 (Ubuntu折腾的第一天) 安装时的踩坑记录
- 王艳 201771010127《面向对象程序设计(java)》第十四周学习总结
实验十四 Swing图形界面组件 一理论部分 1.Layout Manager(布局管理器):布局管理器是一组类,实现 java.awt.LayoutManager 接口,决定容器中组件的位置和大小 ...
- Spring BeanFactory 容器
Spring 的 BeanFactory 容器 这是一个最简单的容器,它主要的功能是为依赖注入 (DI) 提供支持,这个容器接口在 org.springframework.beans.factory. ...
- MySql建库操作
mysql创建数据库 create database db_namedefault character set utf8; db_name为数据库名 查看所有数据库 show databases; 查 ...
- PHP目录操作函数汇总
一.判断普通文件和目录 1.is_file()//判断给定文件名是否为一个正常的文件 2.is_dir()//判断给定文件名是否是一个目录二.文件的属性 1.file_exists( ...