其他分享
首页 > 其他分享> > OO面对对象第三阶段总结

OO面对对象第三阶段总结

作者:互联网

0.前言 

第三阶段的学习要结束了,这次博客也算是本学期最后一次博客,本阶段的学习主要是要自己设计类,需要有自己对于题目的构思与想法。虽然每次发布的作业只有一道题,但是难度也相对于之前的阶段也是加深了,但是收获也是满满的,这个过程也更加加深了我对于面向对象的理解。

1.作业过程总结 

第三阶段的三次作业的迭代关系,收获以及总结,该阶段承接上两阶段,让同一道题有了更多不同的解法,也更加开拓了我们的思维。

第八次作业

                                                                 

这次的作业用到了类的封装、继承、多态,同时也需要理解抽象类和接口的区别,本次的作业比较好写,给了主函数,主函数如下:

 

同时也给出了雨刷系统的具体功能描述,该系统由控制杆、刻度盘刻度、雨刷速度组成,而控制杆有四个不同的状态,分别是停止、间歇、低速、高速,我们需要在此基础上加上一个状态:超高速,对于控制杆间歇状态时的刻度盘也需要加上两个档位:4、5,给出可参考的类图如下:

 

该类图的设计运用了面向对象设计原则中的单一原则、合成复用原则以及迪米特法则,对于单一原则的运用还比较常见,是一个类来负责一个功能。而我对合成复用原则的理解是:采用组合的方式来来提高代码复用性。迪米特法则则是降低类之间的耦合度,使每个类减少了不必要的依赖,降低一个类的访问权限。该次作业是在第一种的手动雨刷系统仿真系统的基础上对其重构,使其实现了雨刷系统类型的扩展。

       对于本次作业,我设计了很多抽象类来增加其代码复用性

 

我认为最核心的部分还是Agent0,其中包含了对其他各类的调配,此过程需要清晰的思路来理解加速加档,减速减档之间的转换。

第九次作业

 

题目要求如下:

 

 

 

对于本次的作业需要用到Java源码中的关键字,如下:"abstract","default","goto","null","switch","boolean","do","if","package","synchronized","break","double","implements","private","this","byte","else","import","protected","throw","throws","case","extends","instanceof","public","transient","catch","false","int","return","true","char","final","interface","short","try","class","finally","long","static","void","const","float","native","strictfp","volatile","continue","for","new","super","while","assert","enum",一共53个。

对于这道题的做法,我认为是先对输入的Java源码进行分析字符串和关键字,接着是关键字分类,这里我使用了Comparable接口,设计了一个String类,该类中compareTo方法来进行关键字的排序,同时为了在new对象传入参数后完成对关键字和数量该两属性的初始化, 在构造string类的构造函数时传入了两个参数。

设计子类如下:

而对于以下测试点:

我使用的正则是"((.*[\"].*)|(/[*].*)|(//.*)|([*][^/].*))", "[\\s]*", " |\\(|\\)|\\.|\\{|\\}|\\[|\\]|;|,"

使用了foreach来对解析后的字符串进行遍历,方法如下:

对于本次作业,我认为主要的难点还是正则的使用,以及正文中的关键字和注释中关键字的统计。所以这道题主要还是在正则上花费了很多时间,需要一个一个进行测试,来检测所写正则是否正确。

第十次作业

 

对于本题的要求,需要使用两个栈(Stack),一个运算符栈,一个操作数栈,然后需要一个list储存拆分后的数字,对于本题的设计方法是:设计了一个Check类来进行对字符串的检测,PolishNotation类用来将字符串分运算符和操作数压入栈中。

 

以上是匹配字符串错误的情况,我是将其分为了每一个小点,来分别通过不同的测试点。同时在同学们的帮助下,完成了使用正则来对字符串进行匹配,使得过程更加简便,也好理解。 

①对于空字符串的测试,我是使用string.equals(""),来直接检测输入的字符串是否是空字符。

②错误的运算符则是除了正确的运算符之外的符号都算是错误的,只有(、)、+、-、*、/才是题目要求的运算符,除此之外运算符匹配错误,因此可用正则"[^\\+\\/\\*\\(\\)\\-\\d]"来对其进行匹配。

③匹配错误的运算数则可以检测有无小数点,匹配到小数点,即输出错误,因此可用String类中的indexOf方法来检测小数点。方法为string.indexOf(".")>0。

④匹配括号的话,思路是左括号的数量要等于右括号的数量,同样用到String类中的方法是charAt,检测每个字符是否==‘(’,或是‘)’。最后检测该两字符出现的数量,不相等即输出错误。

⑤空括号匹配是直接匹配括号内无其他内容,对于其检测Pattern pattern = Pattern.compile("\\(\\)");  Matcher m=pattern.matcher(string);  return m.find(); 如果找到即输出错误。

⑥匹配连续的运算符,即运算符连续出现的次数超过两次即为输出错误,需要用到的正则如下:"(-{2,})|(\\+{2,})|(\\*{2,})|(/{2,})"。加法,乘法比较特殊,需要\\来进行转义。 

⑦运算符为正数时,其符号+必须省略,例如+2+4定义为非法,而负数时为合法,符号在前是合法的。相对应的正则匹配是开头:"[[+][/*/]].*",结尾的正则匹配是".*[[+][/*/]]"。

⑧对于字符串中包含的空格,当检测到空格时,可以用replaceAll来将其替换成String temp=string.replaceAll("\\s",""),这时出现的空格不会被当作特殊符号而输出错误。

以上是对于每个检测错误小点的分析

该次作业的核心是栈的使用,栈的方法有push()、pop()、peek(),判断当前元素是否是数字,不是数字则与Stack栈顶元素比较优先级,不低于栈顶元素的优先级则直接入栈,小括号入栈前优先级最高,入栈后优先级最低,先检查栈顶元素是否为“(”,遍历该字符串。接着需要一个方法来比较各符号的优先级顺序,如下:

 

这里我的使用栈的计算方法如下:

 

对于最后比较棘手的问题是当除数为0时,输出:表达式 = NaN,对于这个问题的解决方法是在构造函数中添加一个String类型的参数,然后当在计算方法中其他的情况输出该语句,如下:

 

我认为该题的难点是栈的使用,这对于我来说是个全新的东西,因此也花了很多时间来研究了解。 对于第一次使用的栈,我发现有很多运算不能通过,是栈方法中的弹栈有点问题,后来进行换了一种使用栈的方式,同时在栈中加入了list来储存分解后的字符,这样的计算就没问题了。这道题用到了很多String类中的方法,也加深了我对每个String方法的掌握和了解,之后遇到相类似的问题可以直接使用。

如:trim()(去除字符串两边空格)、replaceAll()(替换字符串中某段字符)、equals()(检测是否与括号内容相匹配,括号内使用的是双引号)、charAt()(返回指定索引处的字符,括号内使用的是单引号)、matches()(检测字符串是否匹配给定的正则表达式,括号内是双引号)。

最后给出两个关于栈的学习网址:

https://blog.csdn.net/daaikuaichuan/article/details/80315261

https://blog.csdn.net/qq_41686130/article/details/82858997?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522159123797919726869049686%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=159123797919726869049686&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-3-82858997.first_rank_ecpm_v3_pc_rank_v4&utm_term=%E4%B8%AD%E7%BC%80%E8%BD%AC%E5%90%8E%E7%BC%80

2.OO设计心得

这是最后一次的作业,难度也比较大,总结前三阶段的学习经验来看,OO关于面对对象的做法确实很抽象,但是,理解之后应用其中的规则可以使得我们的代码更加灵活、更容易维护,同时也更容易拓展。复用性提高了,从雨刷类的第二类雨刷中可以看出,设计出多个抽象类,使用继承和多态的方法在不修改源代码的情况下更改它的行为,多态的实现不依赖与具体类,而是依赖接口和抽象类,在多态的机制中,父类通常被定义为抽象类,在抽象类中给定一个抽象方法,当子类继承父类时,在子类中实现该方法,在这几次的作业中,有很多地方像这样的情况是抽取公共部分放置在一个类中,防止了代码过于冗余的现象。还有一个很重要的是单一原则,这几个阶段的作业都一直在使用该原则,强调每个类负责一种职责,将一个大难题分解为一个一个小题,这样也就降低了代码的设计难度。

3.测试的理解与实践

对于代码的测试,普通的计算出现的逻辑问题可以会使用Junit方法对代码进行调试。而当测试正则表达式是否正确的时候,需要另外给出代码单独对其进行测试,这一部分要考虑到很多种边界情况,需要输入很多种不同的情况来对其进行完善,这是个很费时间的大工作, 而且这一部分是很有必要的,经过这一阶段,锻炼了我们的对代码的改进能力,当测试修改运行超时问题时可以优化代码,使得代码性能更优。

4.课程收获

这是本学期的最后一次大作业了,对于蔡老师的教学方式真的超赞,也学到了很多,很喜欢老师的教学风格,在这学期我学到除知识外,还有就是耐心,一道题真的可以在电脑前琢磨一天,要是缺乏耐心,很难将一个完整的代码写出来。还有就是搜集知识的能力,这是锻炼出来的,要在一定时间内找到自己想要的知识点,而且该知识点有效帮助到我们,还有就是改代码的能力,只有经历了多看多写多实践,这方面能力才有提高。

5.对课程的建议

对于本课程的建议是建议老师在保证实操不减少的情况下,增加一些理论的讲解,比如前发布的有关Java选择题,我们有很多理论不是很清楚。其他的地方老师都做的很好,而且很愿意听老师讲课。

标签:OO,总结,第三阶段,匹配,对于,代码,作业,运算符,字符串
来源: https://www.cnblogs.com/paxlwssy/p/13042465.html