【Java面向对象】对第一阶段作业的总结提高

前言:本次博客对上三个礼拜的作业情况进行一个总结,题目如下:

 

 

 

 

 •

 

  •

 

 

 很显然这几次的作业难度在慢慢增加,也在慢慢的靠近面向对象的思想。所以针对这一次的作业总结,主要分为六大方向:1、作业过程总结2、面向对象设计心得3、测试的理解与实践4、课程的收获5、对课程的建议6、对下一阶段的学习安排。

 

 

 

 一、作业过程总结

1、知识的迭代:对于知识的迭代我认为是一个可以重复使用知识的过程,比如第二次作业的求下一天以及求下n天该类题,求下n天可以在前面的基础上继续加以改进。在Java编程上就是一个对类的“包装”,然后再其它题目可以使用写好了类,对知识的重复利用过程。

2、从面向过程到面向对象:该阶段的三次作业其中前两次都是可以说是面向过程的,和上学期的c语言编程题一样都是用同样的思路按照过程写下来。然而第三次作业最后两题就过渡到了面向对象,其算法都没有太大的改变,只是按照面向对象的形式来写,有了较大的不同。

3、遇到的问题及解决方法:我遇到的问题及解决方法主要分为三大块:

①算法上的问题:我是非常看重这个算法,特别是非常精妙的算法。精妙的算法较一般的算法代码量短,看起来也更赏心悦目,更有成就感,在这里我用两种不同的算法比较。

  1 public static void nextDate(int year,int month,int day,int n) {
  2       if(n<0) {
  3         if(isLeapYear(year)) {
  4             if(month==2) {
  5                 if(day<=29-(-n)) {
  6                     day=day+(-n);
  7                 }
  8                 else {
  9                     month=3;
 10                     day=(-n)-(29-day);
 11                 }
 12             }
 13             else if(month==4||month==6||month==9||month==11) {
 14                 if(day<=30-(-n)) {
 15                     day=day+(-n);
 16                 }
 17                 else {
 18                     month++;
 19                     day=(-n)-(30-day);
 20                 }
 21             }
 22             else if(month==1||month==3||month==5||month==7||month==8||month==10) {
 23                 if(day<=31-(-n)) {
 24                     day=day+(-n);
 25                 }
 26                 else {
 27                     month++;
 28                     day=(-n)-(31-day);
 29                 }
 30             }
 31             else if(month==12) {
 32                 if(day<=31-(-n)) {
 33                     day=day+(-n);
 34                 }
 35                 else {
 36                     year++;
 37                     month=1;
 38                     day=(-n)-(31-day);
 39                 }
 40             }
 41         }       
 42         else {
 43             if(month==2) {
 44                 if(day<=28-(-n)) {
 45                     day=day+(-n);
 46                 }
 47                 else {
 48                     month=3;
 49                     day=(-n)-(28-day);
 50                 }
 51             }
 52             else if(month==4||month==6||month==9||month==11) {
 53                 if(day<=30-(-n)) {
 54                     day=day+(-n);
 55                 }
 56                 else {
 57                     month++;
 58                     day=(-n)-(30-day);
 59                 }
 60             }
 61             else if(month==1||month==3||month==5||month==7||month==8||month==10) {
 62                 if(day<=31-(-n)) {
 63                     day=day+(-n);
 64                 }
 65                 else {
 66                     month++;
 67                     day=(-n)-(31-day);
 68                 }
 69             }
 70             else if(month==12) {
 71                 if(day<=31-(-n)) {
 72                     day=day+(-n);
 73                 }
 74                 else {
 75                     year++;
 76                     month=1;
 77                     day=(-n)-(31-day);
 78                 }
 79             }
 80         }
 81       }
 82       else if(n>0) {
 83           if(isLeapYear(year)) {
 84               if(month==1) {
 85                   if(day>n) {
 86                       day=day-n;
 87                   }
 88                   else {
 89                       year--;
 90                       month=12;
 91                       day=31-(n-day);
 92                   }
 93               }
 94               else if(month==3) {
 95                   if(day>n) {
 96                       day=day-n;
 97                   }
 98                   else {
 99                       month--;
100                       day=29-(n-day);
101                   }
102               }
103               else if(month==2||month==4||month==6||month==8||month==9||month==11) {
104                   if(day>n) {
105                       day=day-n;
106                   }
107                   else {
108                       month--;
109                       day=31-(n-day);
110                   }
111               }
112               else if(month==5||month==7||month==10||month==12) {
113                   if(day>n) {
114                       day=day-n;
115                   }
116                   else {
117                       month--;
118                       day=30-(n-day);
119                   }
120               }
121           } 
122           else {
123               if(month==1) {
124                   if(day>n) {
125                       day=day-n;
126                   }
127                   else {
128                       year--;
129                       month=12;
130                       day=31-(n-day);
131                   }
132               }
133               else if(month==3) {
134                   if(day>n) {
135                       day=day-n;
136                   }
137                   else {
138                       month--;
139                       day=28-(n-day);
140                   }
141               }
142               else if(month==2||month==4||month==6||month==8||month==9||month==11) {
143                   if(day>n) {
144                       day=day-n;
145                   }
146                   else {
147                       month--;
148                       day=31-(n-day);
149                   }
150               }
151               else if(month==5||month==7||month==10||month==12) {
152                   if(day>n) {
153                       day=day-n;
154                   }
155                   else {
156                       month--;
157                       day=30-(n-day);
158                   }
159               }
160           }
161       }
View Code

 

 1 public DateUtil getNextNDays(long n) {
 2         int y,m,d;
 3         y=day.getMonth().getYear().getValue();
 4         m=day.getMonth().getValue();
 5         d=day.getValue();
 6         int[] map=new int[12];
 7         for(int i=0;i<12;i++) {
 8             if(i==0||i==2||i==4||i==6||i==7||i==9||i==11) {
 9                 map[i]=31;
10             }
11             if(i==3||i==5||i==8||i==10) {
12                 map[i]=30;
13             }
14             if(day.getMonth().getYear().isLeapYear()) {
15                 map[1]=29;
16             }
17             else {
18                 map[1]=28;
19             }
20         }
21         
22         while(n!=0) {
23             if(map[m-1]>=n+d) {
24                 d+=n;
25                 n-=n;
26             }
27             else {
28             n-=map[m-1]-d;
29             d=0;m+=1;
30             if(m>12) {
31                 y+=1;m=1;
32                 day.getMonth().getYear().setValue(y) ;
33                 if(day.getMonth().getYear().isLeapYear()) {
34                     map[1]=29;
35                 }
36                 else {
37                     map[1]=28;
38                 }
39             }
40         } 
41     }
42         return new DateUtil(y,m,d);
43     }
View Code

第一种算法题目有点条件限制,但是这两种都可以说是求下n天的算法,很显然第二种简洁的多,也更容易修改算法,但所需的时间稍微较长一点,更需要去思考,比如当时我就没有考虑到每年变化了的时候其2月份的值也会相应改变,这导致改了好久。所以主要来说就是对算法的设计上的问题,较显而易见的算法时间耗费长,万一错了无从下手,然而较好的算法又较难写出来。所以说对于这个问题只能多多去写代码去看别人的算法,从而学习到较好较优的思考角度以及思维方法。

②测试点的问题:有的题目有的测试点就是非常的难以想到,比如:

 

 

 一个是关于精度的问题  

 

 一个是关于最大整型数值的问题   这个应该把int变为long型去做,这个也导致我费了不少时间。

总的来说,对于这个测试点的问题应该可以考虑极限状态下,可以根据提示去推去猜想自己可能哪里错了,我一般就是根据提示的错误就推导,还有就是根据自己的经验等等。

③面向对象思路的问题:在第三次作业的后面那几题,因为一开始没有多去学习,就只知道一些java的语法,一些和类有关的基础知识(对象,属性,方法等等),但真的要自己完全去用面向对象思想去写还是有一点点无从下手的感觉。当然哪里有困难,我们就得克服,通过去网上搜索资料学习和去请教别人发现自己慢慢的行了,也没有那么难,这给了我较深的体会。

4、作业花费的时间比例:我大概估算了一下比例大概可以为2:5:20,最后一次作业是花了整整好几天时间才完成。

5、对编程过程的严谨性的认识及教训:在编程过程中真的的要有很强的严谨性,不能每次都有一个小地方发生错误。比如在上面所提到的,年发生了变化后没有再去判断是否是平年,这就出错了,因为2月的天数对于平年和闰年是不相同的,这真的需要考虑到方方面面。还有的一个就是第一次作业的那题算税率的,那个稍微数据算错了或看错了就真的有点没法改了一样,所以说,在编程过程中,严谨性太重要了。

 

 

二、面向对象设计心得

1、面向过程和面向对象比较:就基于我这三、四个礼拜对Java学习而言,面向对象比面向过程更有层次结构,写起来更有方向,每写一个类就有了一个主体,修改起来知道去哪里修改,修改起来也比较方便,能够使整个工程更具模块化、更具有结构化。而面向过程是直接引用函数一个先后顺序结构,如若整个要先的代码非常多、繁琐,就不太好修改容易使系统瓦解。

2、面向对象的基本原则理解:我现在主要对公共私有原则和单一职责原则有了较深的认识,特别是单一职责。对于公共私有的那个原则我主要认识为是否开放或者封闭,还有private关键词不能被其它类读取。单一职责基于我的认识就是一个类里面执行好一种事,完成好一个任务,比如一个Year类我就一个把所以有关年的setter、getter一些其它的有关年的方法放在一起完成好。这样我认为有一个极大的好处就是方便去修改去完善有关年的部分代码。假如一个year类里面又有许多关于day 或 month的话,那整体代码看起来就非常的杂乱无章,我认为这是一个极其重要的原则对于然后一个程序员。

3、面向对象思维的理解:我认为任何东西都可以有一个对象,这个对象可以去指向它,其有这个东西的全部用法,这个东西也就叫类。类里面有属性,有方法。类和类有许多关系,例如聚合,依赖等等,这次第三次作业就是聚合关系。所以我对这个面向对象思维的理解就是:比如考虑一个问题,我们首先想到的是一个分为那几个类去解决也就是有几个对象,这些类应该用什么关系能更好的解决这个问题,这就是我现在基于所学的理解。当然,我的理解不一定十分准确,在今后我还得多多学习,争取对面向对象思维有更深的理解。

 

三、测试的理解与实践

1、测试对于编码质量的重要性:测试就是检验代码的质量,检测是否有bug。这个过程在我们完成一个作业、项目的时候绝对是耗费时间最长的,显而易见测试对于代码的质量是非常重要。一个漏洞百出的代码,一个近乎崩溃的项目显然是没有经过严格、缜密的测试的。在pta平台上,提交代码都是经过多个测试点,从这里就可以看出测试的重要性。比如第三次作业有一个测试点阶段整型数的最大值,当时因为我用的是int所以一直没有通过测试点,在这里显然long数据型其范围显然比int型大,所以只要变成long就行了。有时候测试点真的有点然人捉摸不透,所以需要认认真真去总结思考。

2、设计测试用例:对于测试用例,我认为可以设计具有代表一般性的、极大极小边界值的、错误数据、字符和一些特殊字符测试。我认为设计这些测试用例还是要非常好的功底的,听老师说测试也变成了一个职业,所以说测试用例一定要心性缜密,有较强的水平才能更好的测试出有没有bug,使得这个项目或系统不会奔溃。

 

 

 

 

 

四、课程的收获

这四周从刚开始接触java到现在已经能够用到面向对象的思维,会用面向对象的思路、操作方法解题我觉得这过程是艰难的,即给了我许多的教训

也有许多收获。教训就是在程序员的这条道路上,还是需要自学,老师上课只会挑点重点讲,一些细节和操作用法都得靠自己去学去摸索这几次作业中有许多语法什么的一开始都不会,只能去学去看看怎么用,还有如何实现面向对象的这个操作方法,一开始也有一点点懵,还是得靠自己去摸索。收获当然也挺大的,现在一些基础的Java语法、类与类的聚合关系、面向对象的实现等等都已经有了较熟悉的掌握。所以说有付出就有收获,开始很辛苦后面就会很甜。对于这一开始阶段的学习,我明白了多要靠自己去学习,多打代码,才能有提高。

 

五、对课程的建议

Java老师还是讲得非常不错的,我就是希望老师讲完了面向对象的有关知识后,能够把重心放在怎样去实现怎样去操作,这样对我们应该更实用一点,总的来说老师讲得非常好,我们也收获了许多。

 

六、对后一阶段的学习安排

因为下一阶段是大作业任务的开始,难度也高、时间也紧,所以学习安排就是花更多的时间用来完成Java,多去网上找一些资料来丰富自己对Java面向对象的认识,还有就是要学会如何去用eclipse测试自己编写的代码,希望我能够在Java的这条不归路上越走越远。

 

 

 

 

 

 

                                                                         

 

 

posted @ 2020-04-05 21:37  $BigHao  阅读(98)  评论(0)    收藏  举报