1.前言正则表达式
这应该是本学期最后一次写做业总结了吧。整体来讲,对做业的节奏也差很少掌握了,做业作起来的效率也更高了。虽然和以前的做业同样,做业中都要用到新的知识,可是相比以前,更加懂得了如何利用工具以及资料。虽然之间卡过壳,但整体而言,这几回做业还算完成的比较好。数组
2.做业过程总结框架
相比前两个单元,此单元的三次做业每次做业只有一道题。作题目没有了像以前那样的优先级,而是全程专一一道题。做业九则是经过雨刷程序功能扩展设计考察对类的封装、继承、多态的掌握度,做业十是经过 统计Java程序中关键词的出现次数考察对工具类List、Set或Map的掌握程度,做业十一则是设计表达式求值的程序,考察对栈的使用,并检验本身以前对正则表达式的掌握程度。总的来讲,三次做业考察的重点是并列的,但都须要有以前学到的基础知识。经过这几回做业,对面向对象以及其基本原则有了更深的理解。函数
做业九刚开始看题目的时候感受总体不难,可是仔细一想,须要在继承与组合的方法之间斟酌,是本身写出的程序可以使得程序在符合单一职责原则、迪米特法则、合成复用原则的基础上具备良好的扩展性(开-闭原则)、里氏代换原则、接口隔离原则及依赖 倒转原则。将题目写出来问题不大,可是如何使代码实现要求很难。我开始使用了继承的方法,可是由于子类要实现父类的方法,使得代码写到很长。我开始尝试去网上找一些例题,查找了一些组合的方法来解决问题。工具
做业十给人一种很简单的感受,但实际却不简单,刚开始作的时候以为这是到用正则表达式匹配,而后返回匹配正确次数的题目。但开始写主函数代码的时候,就碰到了问题。如何输入数据呢?是一行一行输仍是总体用一个StringBuilder类型的参数将总体接收呢?如何判断输入的数据是否为源代码呢,遇到多行注释该如何跳过呢?诸如此类的不少问题,这个题目在细节上处理很麻烦。第一次的时候是直接用一个StringBuilder类型的参数将总体接收,发如今遇到单行注释的时候很难讲数据处理,就改成了一行一行输入,并在每行结尾加上换行符做为每一行结束的标志,经过换行符将数据切割成字符串数组,对每一个字符串进行正则匹配,在每一行遇到单行换行符后直接跳过字符串后面的数据转而匹配下一行的数据,在遇到多行注释时,同理跳过知道遇到下一个注释符是继续匹配。由于TreeMap能够自动排序,因此选择TreeMap来装载获得的数据。由于53个关键词是不重复的,而关键词出现的次数是能够重复的,因此关键词为key,出现的次数对应value。本题存在疏漏,即题目测试未给出题目所测的53个关键字是以什么来排序的。而是叫咱们去网上找,可是网上找的53个关键字的前后顺序是不同的,我开始觉得是按拼音来排序的,无论怎么作,正确的测试点只能过一个。看到有网站上写到53个字也是按拼音排的,惟一不一样的是它将null放在了末尾,后来我尝试按这种方法排序,结果大部分测试点都过了。最后一个测试点过不了,至少我到最后都不知道最后一个测试点测的是什么数据。学习
做业十一的表达式求值,则须要用到本身彻底没有接触过的知识,栈。开始基本上彻底不知道栈是如何使用的,学着网上的一些例题和相关资料才有了一个大体的轮廓。大体思路是经过用一个栈来装数字,一个栈用来装符号,经过设定符号的优先级,来对数据进行计算。大体思路是将输入的字符串传入到一个字符数组中去,而后对字符数组遍历,用准备好的两个栈,分别来装载数字和字符,当输入比以前字符优先级的字符时,对以前的数据进行计算。开始通过测试的时候发现输入带括号的数据时很容易出错。经过设置一个条件语句,判断是否扫描到括号,若出现右括号,则从后往前计算,并不断删除已使用的符号,直到遇到左括号为止。此题考虑数据错误的状况有不少,须要逐一判断,整体上花了很多时间。测试
本单元的三次做业在大致上花的时间大概差很少,按顺序来三次做业大概花3:3:4的时间,整体上3次做业难度上整体难度相差不大。可是实际花的总时间应该能更短。每次拿到题目,一上来就是想到什么写什么,很容易卡壳。通过这几回的做业,我更加深刻的理解面向对象的理念。在拿到一个题目时,应该先找出其中有哪些对象,而后经过一些方法将它们之间联系起来,造成一个大体的轮廓,同时也便于以后对疏漏的方法进行补充、对代码进行扩充。而不是想到什么写什么,这样到后面很容易出现本身用到的一大串的方法可能到后面用不上或者会影响代码的可拓展性而不得不舍弃。在添加新的方法时,应该考虑会不会影响代码的可扩展性和复用性,这样可以为以后增长新方法省下很多时间。网站
3.OO设计心得ui
①里氏替换原则:通俗的来说就是:子类能够扩展父类的功能,但不能改变父类原有的功能。在写代码时,常常会设计接口或抽象类,而后由子类来实现抽象方法,其中子类能够实现父类的抽象方法也必须彻底实现父类的抽象方法,不然编译器就会报错。关键点在于子类不能覆盖父类的非抽象方法。若是子类对这些非抽象方法任意修改,就会对整个继承体系形成破坏。而里氏替换原则就是表达了这一层含义。在继承父类属性和方法的同时,每一个子类也均可以有本身的个性,在父类的基础上扩展本身的功能。当功能扩展时,子类尽可能不要重写父类的方法,而是另写一个方法。编码
②依赖倒置原则:依赖倒置原则的包含以下的三层含义:高层模块不该该依赖低层模块,二者都应该依赖其抽象,抽象不该该依赖细节,细节应该依赖抽象。打个比方奶茶店卖各类各样的奶茶,奶茶店就是高层模块,各类各样味道的奶茶就是低层模块。当咱们想到奶茶这个名词时,咱们会想到,奶茶店卖奶茶,奶茶有冰镇奶茶,酸奶等这类具体的东西。奶茶就比如一个由各类各样奶茶共享的接口,而奶茶店也依赖奶茶这个抽象类。
③接口隔离原则:通俗来理解就是,不要在一个接口里面放不少的方法,这样会显得这个类很臃肿不堪,并且后续维护与扩展也十分麻烦。接口尽可能细化,一个接口对应一个功能模块,同时接口里面的方法应该尽量的少,使接口更加轻便灵活。
④类设计心得:在拿到题目后,应先找出题目中的对象,经过构造方法使他们之间产生联系,一开始就要构造一个大体框架,把几个大模块设计成类,遵循单一职责原则和合成复用原则,并注意考虑其可扩展性和复用性,多使用接口、抽象类、多态等技术来设计类。尽可能使用组合而不是继承。类与类之间可经过关联,聚合,依赖等关系来实现代码的复用,从而提升功能执行的效率。
4.测试的理解与实践
测试对于编码质量的重要性:测试可以极大的减小代码的错误以及漏洞,同时它还可以提醒写代码的人对运行时间过长冗杂的部分进行方法的改进。只要是提交的代码便会有错误的可能,而测试正是减小这些错误的最好的工具。测试还可以检测代码的效率,是否存在冗长多余的部分,经过测试能够提升代码的质量。
只有不断的练习,才能熟能生巧。经过练习,才能真正的将所学的知识运用起来,才能更加深刻的理解,更好的掌握新知识。
5.课程收获
经过本单元的学习,我对类的封装、继承、多态,抽象类,接口的使用有了更深入的认识,基本上已经能过熟练使用。增强了我对工具类List、Set或Map的认识,学会使用栈来解决题目。经过这几回做业,我认识到本身的不足,更能深入体会学无止境这一道理,只有经过不断地学习,懂得东西才会更多,只有多动手,才能更加清楚发现本身的问题所在,加油。
6.对课程的建议
每次的做业老是和上课所学的知识不能紧密联系,上课所讲的进度每次都要比做业超前,以致于每次作实验时都要从新捡起之前的知识,这样要花费更多的时间。但愿之后讲课能对标上做业,也但愿老师能够带领咱们多多练习,让学生也能看看老师是如何解题的。