一、
一开始对于oo这门课是有第一次作业些没有信心的,因为毕竟之前完全没有接触过java这门语言,也没有接触过面向对象式编程,所以在第一次作业中要使用一门全新的语言完成一个上百行的代码,对于我们是一个不小的挑战。好在第一次作业在磕磕绊绊中勉强合格,但是实际上我还是在面向对象的外壳下用着面向过程的编程方法。而且对于java的一些用法也相当粗糙,我觉得在第一次编程中的最大的失误的没有用正则表达式来识别格式,而是用的有限状态机的模式逐个字符判断,但是由于真实情况下的状况太多很难考虑完善,所以在格式判断上有了很大的失误,这点让我在以后的作业中对于正则表达式的用法有了新的理解。
可以看出第一次作业中对于类的应用也比较单一。
二、
相比第一次作业,第二次作业中对于java的应用就要规范了很多。尤其是在规定类的属性过程中,在第一次作业中,在外部想要调用类的属性的时候用了许多public类型的变量,后来在课上经过老师讲解才知道这其实是一种十分危险的行为,因为外部调用了类中的数据对于这数据没有 进行很好的保护,而java看重的就是对数据的保护,在这次作业中我意识到了很多有关数据保护的细节,例如public类型不能随意使用。还有,在这次的作业中,我也深刻认识到了oo这门课程对我们的另一点要求,那就是程序永远不能crash,因为在以前的编程中我们思考的只是如何实现这个程序的正确功能,如何去过测试中给的几个输入格式正确的测试点。而在oo中,实现功能只是编程的一部分,我们要花更多的精力去尽可能地想到每一种错误的的意外的情况进行报错或者其他处理使程序能够正常运行下去。在这种思考的过程中可以培养我们的逻辑思维能力(虽然其实都是根据分支树进行考虑的),并且这种处理是我们以前忽略掉的而且非常有意义的。
这次程序的设计因为有了指导书的规范,各各类相对而言都有了较为详细的分工,也有了一些面向对象编程的感觉。但是
可以看出有些方法还是较为繁琐,负载均衡没有做好。
三、
第三次作业的类图和第二次作业类似,所以就不再进行展示了,主要的区别就是在电梯的傻瓜调度基础上增添了捎带,这看似简单点的增加在实现上就给我们带来了很多困难
1 for(j=i+1;terms[j][0]!=0;j++) { 2 if(terms[j][0]>=refloor) { 3 timenow1 = timenow + 0.5*(terms[j][0]-refloor); 4 } 5 else { 6 timenow1 = timenow + 0.5*(refloor-terms[j][0]); 7 }//判断当前时间 8 if(terms[j][1]<timenow1&&terms[j][2]!=-1&&z==1&&terms[j][0]<floor&&terms[j][0]>refloor) { 9 newfloor = terms[j][0]; 10 newz = terms[j][2]; 11 newstr = termsstr[j]; 12 for(k=j;k>i+mainnum;k--) { 13 terms[k][0]= terms[k-1][0]; 14 terms[k][1]= terms[k-1][1]; 15 terms[k][2]= terms[k-1][2]; 16 terms[k][3]= terms[k-1][3]; 17 termsstr[k] = termsstr[k-1]; 18 } 19 terms[i+mainnum][0]=newfloor; 20 terms[i+mainnum][1]=newtime; 21 terms[i+mainnum][2]=newz; 22 terms[i+mainnum][3]=1; 23 termsstr[i+mainnum] = newstr; 24 mainnum++; 25 judge1=1; 26 27 }//楼层间向上捎带与电梯请求在范围间 28 else if(terms[j][1]<timenow1&&terms[j][2]!=1&&z==-1&&terms[j][0]>floor&&terms[j][0]<refloor) { 29 newfloor = terms[j][0]; 30 newz = terms[j][2]; 31 newstr = termsstr[j]; 32 for(k=j;k>i+mainnum;k--) { 33 terms[k][0]= terms[k-1][0]; 34 terms[k][1]= terms[k-1][1]; 35 terms[k][2]= terms[k-1][2]; 36 terms[k][3]= terms[k-1][3]; 37 termsstr[k] = termsstr[k-1]; 38 } 39 terms[i+mainnum][0]=newfloor; 40 terms[i+mainnum][1]=newtime; 41 terms[i+mainnum][2]=newz; 42 terms[i+mainnum][3]=1; 43 termsstr[i+mainnum] = newstr; 44 mainnum++; 45 judge1=1; 46 }//楼层向下捎带与电梯请求在范围间 47 else if(terms[j][1]<time&&terms[j][2]==0&&z==1&&terms[j][0]>floor&&terms[j-1][3]!=1&&terms[j][3]!=1&&terms[i+mainnum+1][3]!=1) { 48 newfloor = terms[j][0]; 49 newz = terms[j][2]; 50 newstr = termsstr[j]; 51 for(k=j;k>i+mainnum+1;k--) { 52 terms[k][0]= terms[k-1][0]; 53 terms[k][1]= terms[k-1][1]; 54 terms[k][2]= terms[k-1][2]; 55 terms[k][3]= terms[k-1][3]; 56 termsstr[k] = termsstr[k-1]; 57 } 58 terms[i+mainnum+1][0]=newfloor; 59 terms[i+mainnum+1][1]=newtime; 60 terms[i+mainnum+1][2]=newz; 61 terms[i+mainnum+1][3]=1; 62 termsstr[i+mainnum+1] = newstr; 63 judge1 = 1; 64 break; 65 }//向上电梯请求在范围外 66 else if(terms[j][1]<time&&terms[j][2]==0&&z==-1&&terms[j][0]<floor&&terms[j-1][3]!=1&&terms[j][3]!=1&&terms[i+mainnum+1][3]!=1) { 67 newfloor = terms[j][0]; 68 newz = terms[j][2]; 69 newstr = termsstr[j]; 70 for(k=j;k>i+mainnum+1;k--) { 71 terms[k][0]= terms[k-1][0]; 72 terms[k][1]= terms[k-1][1]; 73 terms[k][2]= terms[k-1][2]; 74 terms[k][3]= terms[k-1][3]; 75 termsstr[k] = termsstr[k-1]; 76 } 77 terms[i+mainnum+1][0]=newfloor; 78 terms[i+mainnum+1][1]=newtime; 79 terms[i+mainnum+1][2]=newz; 80 terms[i+mainnum+1][3]=1; 81 termsstr[i+mainnum+1] = newstr; 82 judge1 =1; 83 break; 84 }//向下电梯请求在范围外 85 else if(terms[j][1]<time&&(terms[j][2]==0||terms[j][2]==z)&&terms[j][0]==floor&&terms[j][3]!=2) { 86 newfloor = terms[j][0]; 87 newz = terms[j][2]; 88 newstr = termsstr[j]; 89 for(k=j;k>i+samenum+mainnum+1;k--) { 90 terms[k][0]= terms[k-1][0]; 91 terms[k][1]= terms[k-1][1]; 92 terms[k][2]= terms[k-1][2]; 93 terms[k][3]= terms[k-1][3]; 94 termsstr[k] = termsstr[k-1]; 95 } 96 terms[i+samenum+mainnum+1][0]=newfloor; 97 terms[i+samenum+mainnum+1][1]=newtime; 98 terms[i+samenum+mainnum+1][2]=newz; 99 terms[i+samenum+mainnum+1][3]=2; 100 termsstr[i+samenum+mainnum+1] = newstr; 101 samenum++; 102 judge1=1; 103 }//与目标楼层相同的捎带 104 }
这是我在第三次作业的捎带部分的判断代码,一开始在简单的捎带情景下可以运转正常,然后看考虑到更复杂的捎带情形发现不能运转了,又加了很多中间变量和判断条件,到最后debug的时候,发现自己已经忘记了一开始为什么加了这个变量这个判断条件。
所以在第三次作业中我得到的最大的启发就是在较为复杂的编程中一定要先考虑清楚再开始编程,谨慎使用中间变量和判断条件,做好备注。
四、总结
在以后的oo作业中一定要把指导书先理解透彻再开始编程,因为有的时候问题并不是车到山前必有路这么简单。