OO第二次博客作业

2021-05-01     lian

---------------------

前言:

一、4-6次作业集主要是考验我们对Java程序中类与类之间的关系的熟悉程度,让我们实际使用像继承,集合等结构;其次是对于正则表达式的理解,尤其是水文处理那一题,严格考核了我们对正则表达式的使用;最后是对于array list的使用,让我们学习其语法。

二、对于题量,整体来讲不是很大,除了水文那一题之外,其他的题控制在一个小时之内能写完,总的来说题量算合理。

三、难度的话,除了水文数据和关键字那一题,其他的题难度都不算大,主要是涉及到了复杂的正则表达式就会很难写,还是对正则表达式的语法不是很熟练,写的时候要反复的改,反复的试错,导致就算花了很多时间也拿不到多少分。

设计与分析:

一、习题7-2和习题7-4两种日期类聚合设计的优劣比较

1、习题7-2采用的是依次往下找的形式,类似于c的链表,如果我要达到某个节点,那我一定要经过之前的节点,这样的结构可以使程序的整体性更强,执行起来更加有章法,这种结构就像在图书馆找书一样,先从楼找到区,从区找到几号柜,再找到那一排的第几本,且每本书都能用一个码来表示,永远不会混乱,富有章法。其缺点是如果类很多,那么程序依次往下走就会很费时间,即使是像使用一个很常规的方法都有可能要往下走很久;再一个就是这样的结构会使代码很冗长,有时太过复杂就会连自己都不知道要找哪一个属性或者想找一个属性却不知道他的get是哪一个;最后是这样的结构如果有一个地方错了,那么整个程序就会连环崩溃。

2、习题7-4采用的是一个类控制其他所有类的聚合关系,这样的结构就像c语言的基本结构,高聚合,低陇和,每一个类各司其职,只需要一个类来调用他们并使用里面的属性。这比起7-2有一个明显的优点就是显得更加简洁,非常容易让人理解,各司其职的方式也让程序的运行时间大幅度减少,低陇和也不会造成连环错误,最多是错误地方的功能无法使用。但是因为类与类之间几乎无关联,所以在写代码和看代码的时候就可能不知道这个类是干什么用的,对于这点,在写代码时一定要做好批注。

3、总的来讲两种结构各有优缺点,但我更倾向于第二种,因为他足够简洁,在写代码的过程中不易出错误。

二、习题7-3、7-5、7-6三种渐进式图形继承设计的思路与技术运用

1、习题7-3是纯粹地使用了继承关系,将具有相同属性的类进行继承,在添加一些自己需要的属性,这样的继承关系没有明显优点,只是在初学时,比较好理解。

2、习题7-5的继承关系是先创建一个抽象类,然后在这个抽象类里面定义好需要用的方法,在让其他所有的类都继承这个类,最后在这些类里面定义要使用的属性和继承来的方法并说明他们,这种为不同类提供一个父类(接口)的结构被称为多态,通过输入的信息的不同从而让程序进行不同的行为,这样写出来的程序复用性较高,也较为常用。

3、习题7-6的是定义一个接口,在这个接口里面定义一个抽象方法,当这些类对这个接口进行调用后自行对这个接口进行解释说明,最后在主函数里直接使用这些类,与正常的类一样,这样的写法相较于前两种又精简了不少,在实现方法上也更为快速和简便。

三、对三次题目集中用到的正则表达式技术的分析总结

1、第一个正则表达式是水文数据,匹配数字不是很难,但是要将他们依次分隔,并且储存到固定的地址就显得十分复杂,我的写法是先将其按“|”分开再按“/”分开,每个数据两边匹配零个或多个空格,多次使用split对分好的字符串进行储存,实现算法,正则表达式如下:

String pipei1=" *([1-9]\\d{0,3}/([1-9]|1[0-2])/([1-9]|1[0-2]|3[0-1])) (([02468]|1[02468]|2[02]):[0][0]) *";

String pipei2=" *(([1-9]\\d{0,2}.[0-9]\\d{0,2})|([1-9]\\d{0,2})) *";

String pipei3=" *([1-9].[0-9][0-9]) *";

String pipei4=" *([1-9]\\d{0,1}.([0-9]\\d{0,2})|([1-9]\\d{0,2})) *";

2、第二个关键字的字符串匹配,这个正则表达式不是很复杂,最难的地方在于如何使用正则表达式识别两种注释,对将其注释的部分删掉或替换,遗憾的是写到最后我也没能实现这个算法,正则表达式如下:

String[] fenge1=data[i].split("( *([{}\\[\\]\\(\\)=\\|><,;:\\+\".])+ *)| +");

3、后面第六次作业的正则表达式都是比较基础的正则表达式,主要还是起一个让我们对正则表达式更加敏感的目的,难度几乎没有,正则表达式如下:

String pipei1="[1-9][0-9][0-9][0-9][0-9]\\d{0,10}";

String pipei1="[a-zA-z0-9]+";

String pipei1="[2][0][2][0]([1][1-7]|[6][1]|[7][1-3]|[8][12])([0][1-9]|[123][0-9]|[4][0])";

四、对习题五7-4集合框架应用的分析总结

   这种一对多的类结构,可以使没有类之间几乎没有关联,只要在调用时输入的是不同的信息,就可以让程序实现不同的操作,这种高聚合但低陇和的结构正是商业产品的内置代码所需要的,因为要制作一个商用程序,肯定要面临一个庞大数目的用户考验,没有人知道用户在使用时会犯哪些错误,会遇到什么样的问题,我们作为软件工程师,只能在写代码时尽可能完善其实用性,而这种结构可以使即便用户在使用时遇到了不可描述的错误,但是这个错误也仅仅会出现在用户使用的那一模块,不会让错误扩散到程序全身,从而让程序员修改代码更为方便,也让用户的使用体验更好。

踩坑心得:

1、在写日期类聚合二的时候,因为我的输入算法的原因会用到一个split去接受输入的值然后按空格分开,最开始我的写法是split(“ ”)就好了,但是提交到pta上发现一直有一个测试点一直过不了,因为上面显示是越界测试没过所以开始以为是越界的算法有问题,但是后面自己去找问题,也让同学帮我看了代码,都没有发现问题在哪,最后用直接输出wrong format的方式终于发现是输入有问题,所以将split那里改为split(“ +”)就行了。原来,split的双引号之间也是一个正则表达式,之前我以为只能在里面写一个字符,也是因为没有仔细看eclipse上面对split的解释,导致一直对其有理解错误,也正是因为发现这里面是一个正则表达式,后面关键字的题也用split轻松写出了提取代码并将其分隔的算法,两个正则表达式如下:

static String fenge[]=i.split(" +");

String[] fenge1=data[i].split("( *([{}\\[\\]\\(\\)=\\|><,;:\\+\".])+ *)| +");

2、在使用聚合关系时,尤其是聚合一那样的聚合关系,链式的聚合结构会使在上面使用下面的属性和方法时,显得很冗长并且过多连接会使程序员也变得大脑混乱,容易写错,所以,当我们在定义下面的set、get和其他方法时,方法的名字一定要写清楚,至少当你看到这个方法时你知道它是用来干什么的,例如有一个属性a,他是私有属性,你在定义a的get方法时应该写为geta而不是get或者get1,这样即使程序很复杂,但你看到程序每个地方都知道它是什么意思。如下:

void set1(int value){

this.value=value;

}

public int get1() {

return value;

}

void set2(){

this.month=month;

}

public Month get2() {

return month;

}

这样书写就很容易造成混乱,应写为getvalue。

改进建议:

1、对于水文数据处理,我们可以将程序和一个录入水文数据的程序结合起来,这样就不用对进来的数据进行判断,而日期可以直接用eclipse包里自带的方法得到当前日期,在里面还可以做一个判断,保证只取到偶数整点;我们还可以将各部分功能做得再精细一点,比如这些数据的各种处理可以设计一个子类来进行计算。

2、在这些程序创建对象时,我们都可以使用创建对象数组,然后使用arraylist来储存他,这样做可以使程序运行时可以想有多少组数据就有多少组数据,提高程序的实用性。

总结:

     通过这几次作业,我们首先学习了面向对象程序的多种关系结构,例如聚合、继承、多态等,这写基础的关系为我们之后写大工程打下了基础,并且能够让我们对面向对象有更加深刻的理解;其次,我们再次学习了正则表达式,这是程序的一大难点,同时也是一个非常实用的功能,它能实现很多功能,但是要想写出自己想要的正则表达式,在这一学期还要对其进行不断地学习才行。

     对于目前的课程安排以及学习节奏我认为是比较合适的,只是感觉这几次题目的截至时间都有点紧凑,尤其是有水文处理和关键字这样的题,感觉时间不太够,而且有时时间还会和实验冲突,希望之后作业里有难题的时候,作业时长可以延长。

posted on 2021-05-01 15:45  lian152  阅读(55)  评论(0编辑  收藏  举报

导航