zoukankan      html  css  js  c++  java
  • 第二单元作业总结

    1. 前言

    经过三周的时间,第二单元也算告一段落了。这几次作业相比于前面几次,难度真的高了不少。与第一单元相比,两个单元之间的难度有一定跨度,有的时候坐在电脑前盯着电脑发蒙半天,也是毫无进展。相比于课上简单的演示,课后的作业要复杂的多。作业里基本上都用到了很多自己没有使用过甚至没有见过的方法。本次作业中通过自学上网查资料看视频等途径,真的学到了不少东西,但比较遗憾的是,第二次作业没能完整的做出来。

    2. 作业过程总结

    总体来说,三次作业在层次上逐渐递进,但是却没有像上次一样越来越难。总体上反而是在一二次作业上花的时间更多。第一次作业初步的加深了我对代码可复用性以及单一职责原则的理解,在作业中初次使用继承和正则表达式;而第二次作业则是在继承的基础上加入了多态的知识,且加深了自身对正则表达式的运用;第三次作业则是对类的继承、多态性使用方法以及接口的应用的巩固,进一步深入了解了“单一职责”原则和“开-闭”原则。

    第一次作业三道题目难度逐渐递减,除了第一题以外,二三题并不是很难。从最简单的第三题说起,虽说是第一次在作业中使用类的继承,但因为题目难度本身不高,做起来也比较顺手,虽然中间有遇到类无法调用的情况,都是在查阅相关资料后,开始声明的3个量应均为shape型,后面才能方便直接通过继承,调用其他3个类中不同的方法,在一定程度上对类的继承的作用有了一定理解。第二题在写好类和方法后,查询蒙特卡罗仿真方法后,题目也算比较快完成了。再来讲第一题,本次作业最难的一题,看到第一题的时候,脑子里有一个很模糊的轮廓,各种各样感觉可能要使用的方法很多,给人一种很复杂的感觉。

     

     

    与第二三题相比,不要说具体的方法怎么写,就连类与类之间的依赖,方法与方法之间的调用,都给人一种很难实现的感觉。而且本次作业的类图没有之前那么详细,很多需要自己补充,从类图到代码之间有很大的空白,用自己已有的知识很难将其实现。我在做这道题目的时候从网上学了很多新的知识比如StringBuilder的方法,正则表达式的使用等等,新的知识通过很长时间的组织,能够使用的方法越来越多,解题的思路便越来越清晰。我开始都不知道如何将一大串数据输入在拆分成每一块,后面利用StringBuilder接受数据,在通过将StringBuilder类型转为String类型,在通过他们拥有 的共同点进行切割,这个过程中的每一个部分几乎都是利用自己新学的东西,可见自学很重要。

     

     

     

    第二次作业,虽然只有两个题目,但是第二个题目难度系数很高。第一个题目是衔接上一次的图形继承,因为有了上一次作业的引导,这一题思路很清晰,通过将3个具有相似点的图形分别继承一个Shape的抽象类,从而Shape类分别3个类中的方法实现多态,加深了对继承与多态的理解。首次使用ArrayList ,查阅相关资料后,调用其中的add等方法,题目便迎刃而解了。主要问题在第二题。第二题到最后我也没有做出来。虽然写出来匹配输入数据的正则,但是输入数据后,却怎么也没想出一个拆分多项式的方法。虽然每一个多项式都有相似点,但是X前的系数可能没有,当x为1次的时候^也没有,且指数系数可正可负,这使得数据很难通过匹配器拆分。输入的数据最后要转化为BigInteger,在计算上遇到了很多问题,查阅了一些资料,调用其中的方法最后得到的结果总是null。虽然最后几个类中的方法差不多写全,也能用正则表示,但是最后有几个测试点还是没过。

     

     

     

    第三次作业,可能是由于有了前两次作业的经验,做起来反而比前两次轻松。第三次作业的两道题都是在第二次作业的继承与多态的深入。第一题的主方法源码以及类设计图都详细给出,题目比较局限,做起来反而比较容易。 第二题在第一题的基础上新增加了分组,就出了一些问题,我在第一题代码基础上新增了4个ArrayList类型的对象数组,然后在输入数据时通过选择循环然后将数据分别输入四个数组中,但是最后我发现怎么也输不对。然后发现是直接输入一种类型的图形多个后,用数组输出后每个数据间会自带逗号。然后我就开始想怎么去掉逗号,但是后面发现一组与组将逗号去掉特别麻烦,最后还是选择了使用循环将数组数据一组一组的输出。作业中因为生成的每组数据都要排序,求和,输出,方法的可复用性便在这里体现了,通过其他四个类对shape类的继承,从而使得整个系统有一定的可复用性,不同图形数据调用的方法不同,这也通过多态实现了。

    我在3次作业中花的时间都是不同的,第一次因为初次接触正则和StringBuilder,总体上花费了较长的时间,第二次作业虽然题目少,但是第二题做了很久也没有完全做出来。相反第三次反而比前两次更轻松。如果按比例来讲我觉得1、2、3次作业分别对应百分之40,百分之35,百分之25。三次作业中,对类的继承、多态性使用方法以及接口的应用的不断巩固,进一步深入了解了“单一职责”原则和“开-闭”原则,在不断的学习新方法的过程中,我能明显感受到自己知识储备的匮乏,以及写代码方面的不足。这是我更加深刻的理解到,写代码也是一个不断学习的过程,储备的知识越来越多,会的方法变越来越多,解题起来也更加得心应手。解题的过程中应不断的发掘题目中所隐藏的信息,以及对整个题目涉及的方方面面都要加以考虑,这样写出的代码才是完整的。

    3. OO设计心得

    ①对面向对象三大技术特性之间关系的理解: 封装性就是将类的某些信息隐藏在类内部,不允许外部程序直接访问,而是通过该类提供的方法来实现对隐藏信息的操作和访问,封装遵循了“开闭原则”,禁止外部直接访问和修改类的信息。而继承恰好与之相对立,通过继承我们可以访问类中的所有信息和方法。但是两者各有其优缺点,封装是各个对象之间互不干扰提高了代码的效率,同时不允许外界访问也提高了其安全性,而继承则是子类继承父类的所有方法,从而实现了代码的复用。而多态是在继承的基础上衍生出来的。通过多态,父类引用可以指向本类对象,也可指向子类对象,子类中可以重写父类的方法,在调用方法时,通过传递给它们的不同个数和类型的参数来决定具体使用哪个方法,提高了代码的扩展性。

    ②面向对象设计的基本原则理解:单一职责原则就是指将每个类都封闭的分开,使他们各自只执行一种功能。一个类承担多个功能会有很高的耦合性,它会导致你需要修改某一个类时它会对另一个类产生影响,会抑制其他功能的实现,甚至是破坏其他功能,承担的类过多会导致代码难以进行修改和维护,代码的适用性将会很低。当一个类会受到多个因素影响时,因对该类进行细化,分成多个只执行一种功能的类。“开-闭”原则则是只我们设计的代码,在需要对其增加功能时,是可以增加的、扩展的,但是不允许修改的。也就不必修改源代码,就能扩展新功能,要达成这样的要求,写的代码的功能模块必须是可复用的,这样才能在不修改的情况下进行扩展;

    ③OO编程思维的理解:类和对象是OO编程中最重要最基本的两个元素,在设计时,先将找到要处理的各个对象,再找到各个对象的共同的祖先,逐层抽象,再确立各个类之间的继承关系,便有了解题的大致轮廓。在设计过程中代码要尽量做到可复用,每个类只执行一种功能,且类与类之间要做到相互独立,不影响。这样即使代码能够更高效的实现各种功能,也便于之后的测试和维护。

    ④类设计心得:要多用接口、抽象类、多态等技术来设计类。设计类时因使其指执行一种功能,且类与类之间因保持封闭,方法的实现能相互独立。类与类之间可通过关联,聚合,依赖等关系来实现代码的复用,从而提高功能执行的效率。

    4. 测试的理解与实践

    ①测试对于编码质量的重要性:测试能够极大的减少代码的错误以及漏洞,同时它还能够提醒写代码的人对运行时间过长冗杂的部分进行方法的改进。只要是提交的代码便会有错误的可能,而测试正是减少这些错误的最好的工具。测试还能够检测代码的效率,是否存在冗长多余的部分,通过测试可以提高代码的质量。

    ②查阅资料,假设使用Junit进行程序的测试是否可行:可行,Junit测试为程序员测试,即所谓白盒测试,程序员知道被测试的软件如何完成功能和完成什么样的功能。它是根据代码的功能,人工设计测试用例进行基本功能测试。依据程序设计说明书,按照一定规范化的方法进行软件结构划分和设计测试用例。所以其用测试的结果和代码的预期结果对比,分析错误原因,找到并解决错误是可行的。

    5. 课程收获

    本单元学会的新知识:

    对于正则表达式的运用更加熟练;

    对封装性、继承性与多态性,单一职责原则及“开-闭”原则有了更深的理解。

    对StringBuilder和ArrayList的应用有了一定程度的掌握。

    对排序接口comparable有了一定程度的掌握。

    6. 对课程的建议

    每个过程的三个阶段要求迭代上升本来是很好的训练方法,可是由于一开始只给出了最简单的需求,往往不能准确猜测后续需求的变更,以致不能设计出很好的架构,往往要在需求变更后对自己的设计进行调整,如果时间不足甚至会放弃重构精致的代码,而是草草加一些新代码满足变更。如果一开始就给出最后的要求作为参考,然后每一阶段实现这个要求的一部分,这样应该对设计帮助更大。

    希望老师可以带领我们多多练习,让学生也能看看老师是如何解题的。

  • 相关阅读:
    操作系统-多进程图像
    025.Kubernetes掌握Service-SVC基础使用
    Linux常用查看版本指令
    使用动态SQL处理table_name作为输入参数的存储过程(MySQL)
    INTERVAL 用法 mysql
    sql server编写archive通用模板脚本实现自动分批删除数据【填空式编程】
    docker部署redis集群
    Ubuntu1804下安装Gitab
    Bash脚本编程学习笔记06:条件结构体
    KVM虚拟化基础
  • 原文地址:https://www.cnblogs.com/yakan2333/p/12804830.html
Copyright © 2011-2022 走看看