一,代码地址仓库地址
coding克隆仓地址:https://git.coding.net/huyifeng1998/jieduixiangmu.git
二,psp
PSP |
任务内容 |
计划时间(min) |
完成时间(min) |
Planning |
计划 |
60 |
|
Estimate |
估计这个任务需要多少时间,并规划大致工作步骤 |
60 |
|
Development |
开发 |
300 |
|
Analysis |
需求分析 |
100 |
|
Design Spec |
生成文档 |
0 |
|
Design Review |
设计复审 |
120 |
|
Coding Standard |
代码规范 |
30 |
|
Design |
具体设计 |
100 |
|
Coding |
具体编码 |
540 |
|
Code Review |
代码复审 |
300 |
|
Test |
测试 |
30 |
|
Reporting |
报告 |
120 |
|
Test Report |
测试报告 |
30 |
|
Size Measurement |
计算工作量 |
30 |
|
Postmortem& ProcessImprovement Plan |
事后总结, 并提出过程改进计划 |
120 |
|
三
信息隐藏:
对于面向对象的程序设计而言,信息隐藏是一种重要的软件开发手段,它与对象的封装(encapsulation)与模块化(modularity)密切相关。在我看来,信息隐藏使得一个类把复杂的、敏感的、一旦被外界捕获可能会引起不良后果的内容封装在自身内部,这个类以外的代码得不到此类信息(通过反射等手段可能对得到),以提高程序的安全性与健壮性。
松散耦合:
有关松散耦合与接口的使用
一个软件,它具有许多类,类与类之间需要互相调用,一旦某个类与另一个类具有紧密耦合关系的时候,这个软件的重用性就会大大降低。所以一个软件的重用性的高低就取决于它的耦合程度的高低。
而耦合度是指程序模块之间的关联、依赖程度;
为避免这种情况,需要降低A与B之间的耦合度,目的就在于,无论B的形式如何,只要B仍然能够实现A所需要的功能,A就不需要重写代码。
接口:方便各个模块之间的联系
四,计算模块接口的设计与实现过程
三个jsp页面:
first.jsp是首页,可以选择跳转至download或zuoti
download.jsp是下载页面,可以在此页面定制题目,并下载
zuoti.jsp是做题页面,可以上传文件批改,也可以在线做题
两个servlet:
ChuanServlet是用于做题传参获取题目,调用dangejisuan类的方法来获取题目并传递到前台
xianshi是用于下载打印,并从前台获取参数传递到类的方法中,调用创建题目的两个类creat和creat1,分别构造不含乘除的表达式和包含乘除的表达式
五,
六,计算模块部分单元测试展示
七,异常处理
题目数量的异常处理:
public static void scopeOfSumError(int num) throws Exception{ if(num<=0||num>10000) throw new Exception("输入范围有误,请重新输入"); }
运算数上下界的异常处理:
public static void ScopeOfArgsMError(int scope_Lower,int scope_Upper) throws Exception{ if(scope_Lower<1||scope_Lower>100||scope_Upper<50||scope_Upper>1000) throw new Exception("m的输入范围有误"); if(scope_Lower>=scope_Upper) throw new Exception("上界要大于下界"); }
运算符的异常处理:
public static void OperationError(int Operation)throws Exception{ if(Operation<=0||Operation>10000) throw new Exception("o的输入有误,-o 范围为 1 到 10"); }
出题页面download.jsp:
九,界面模块与计算模块的对接
public static void Create( int l, int m1, int m2,int n,String q ) {// 产生1个包含p个运算符的四则运算的方法 ArrayList<String> a = new ArrayList<String>(); for(int k=0;k<l;k++){ String re = "";//result // int p=3+(int)(Math.random()*3); char oper[]={'+','-','*','÷'};//operator int Num[]=new int[30];//存储算式中的运算数 char Op[]=new char[30];// 运算符 for(int he=n-1;he>=0;he--){ Op[he]=oper[(int) (Math.random()*4)]; } for(int hhe=n;hhe>=0;hhe--){ // Num[hhe]=(int) (Math.random()*100)+1; Num[hhe]=(int) (Math.random()*m1)+m2-m1; while(true) { if(Num[hhe]>m1) { break; }else { Num[hhe]=(int) (Math.random()*m1)+m2-m1; } } } for(int e=0;e<n;e++){ if(Op[e]=='*'||Op[e]=='÷') Op[1+e]=oper[(int) (Math.random()*2)]; if(Op[e]!='*'&&Op[e]!='÷') Op[1+e]=oper[(int) (Math.random()*4)]; } re=re+Num[0]; for(int e=0;e<n;e++){ if(q.equals("yes")&&e==4) { re=re+Op[e]+"("+Num[e+1]; } else if(q.equals("yes")&&e==5) { re=re+Op[e]+Num[e+1]+")"; } else if(q.equals("yes")&&e==0) { re="("+re+Op[e]+Num[e+1]; } else if(q.equals("yes")&&e==1) { re=re+")"+Op[e]+Num[e+1]; } else { re=re+Op[e]+Num[e+1]; } } a.add(re); System.out.println(re);//返回一个合法的算式 } shuchu wan=new shuchu(); try { shuchu.test(a); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
十,结对
十一,结对编程的优缺点
结对编程的优点:
1、程序员能够互帮互助,提高效率
2、各抒己见,增强代码和产品质量
3、共享知识,降低现学的成本
4、在编程中,相互讨论,可能更快更有效地解决问题。
结队编程的缺点:
1、与合不来的人一起编程容易发生争执,不利于团队和谐。
2、经验丰富的老手可能会对新手产生不满的情绪。
3、开发者之间可能就某一问题发生分歧,产生矛盾,造成不必要的内耗。
4、开发人员可能会在工作时交谈一些与工作无关的事,分散注意力,造成效率低下。
十二、实际PSP