一、Coding.Net项目地址: https://git.coding.net/gemyty/team.git
二、PSP表格估算时间:
PSP |
任务内容 |
计划共完成需要的时间(min) |
Planning |
计划 |
70 |
· Estimate |
· 估计这个任务需要多少时间, 并规划大致工作步骤 |
70 |
Development |
开发 |
2585 |
· Analysis |
· 需求分析 (包括学习新技术) |
120 |
· Design Spec |
· 生成设计文档 |
60 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
20 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
15 |
· Design |
· 具体设计 |
120 |
· Coding |
· 具体编码 |
1800 |
· Code Review |
· 代码复审 |
90 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
360 |
Reporting |
报告 |
95 |
· Test Report |
· 测试报告 |
45 |
· Size Measurement |
· 计算工作量 |
20 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |
三、Information Hiding, Interface Design, Loose Coupling方法对接口进行设计的实现
首先我对这几个概念进行了资料查阅,了解了它们是什么,为何这么做。
1、Information Hiding(信息隐藏)
什么是信息隐藏
信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。
信息隐藏是软件的首要技术使命中格外重要的一种启发式方法,因为它强调的就是隐藏复杂度。
信息隐藏在设计的所有层次上都有很大作用:从用具名常量代替字面常量,到创建数据类型,再到类的设计、子程序的设计以及子系统的设计等等。
为什么要隐藏
- 隐藏复杂度:这样你就不用再去应付它,除非你要特别关注的时候;
- 隐藏变化源:这样当变化发生时,其影响就能被限制在局部范围内。复杂度的根源包括复杂的数据类型、文件结构、布尔判断以及晦涩的算法等等。
2、Interface Design(接口设计)
设计接口 design interface是传统的后勤保障的一种要素也是一种后勤功能。
与后勤有关的设计参数(如可靠性和维修性)与战备完好性和保障资源要求间的相互关系。这些与后勤有关的设计参数用使用值而不是用固有值表示,并与装备系统战备完好性目标和保障费用有着特定的关系。
它涉及与后勤有关的设计参数(如可靠性和维修性)与战备完好性和保障资源要求的相互关系。这些与后勤有关的设计参数应采用使用值而不应采用固有值表示,它与装备系统战备完好性目标和保障费用有着特定的关系。
有关保障性的设计参数(如可靠性和维修性)与战备完好性及保障资源要求之间的相互关系。这些保障性设计参数应该用使用值表示,并与战备完好性目标和保障费用有特定的关系。
3、Loose Coupling
松耦合的基本概念是:允许改变或者当问题发生在“电线的一端时”来避免影响到其他的端点。也就是说,改变或者供应者或者服务的问题不能影响到用户----或者用户的问题不应影响到供应者或者服务。举例来说,如果服务的新版本被推出的话,服务的用户就不必非要去修改,不必非要去改变路线,甚至不必经历停滞期----因为它(服务的新版本被推出)能清楚地向他们显示出来。相对而言,如果服务的一个用户决定改变他们正在使用的供应者(可能有了一个更低价格的服务供选择),这不需要用户应用必须要被重新编码,甚至是中断来做这样的改变。作为提供松耦合的必备基本要素,Web服务管理代理经常使用在用户和供应者之间。松耦合的目标是最小化依赖。松耦合这个概念主要用来处理可伸缩性、灵活性和容错这些需求。
在本次结对项目中,我们用了MVC模型开发,在不同层都用到了接口的设计,并不需要在很多地方修改。
四、计算模块接口的设计与实现过程。
五、单元测试与效能分析
//测试题目是否可用并更改题目的可用状态 boolean testQuestion() throws MyException { Box box1 = this.box; questionTest.setResults(getResult(box1)); if(questionTest.getResults()>0&&!(questionTest.getResults()==20180323)){ questionTest.getResults(); questionTest.setUseful(true); } return questionTest.isUseful(); } //获取运算后的答案 int getResult(){ return questionTest.getResults(); } //遗留的未实现方法 public Question fixQuestion(){ return questionTest; } } //策略模式--------------------------------------------| class Function{ Box run(Box box,int[] m) throws MyException{ return box; } } //乘法运算部分 class Multiplication extends Function { @Override Box run(Box box,int[] m)throws MyException{ if((box.listN.get(box.listC.indexOf('*')) * box.listN.get(box.listC.indexOf('*') + 1))>m[0]&&(box.listN.get(box.listC.indexOf('*')) * box.listN.get(box.listC.indexOf('*') + 1))<m[1]) { box.listN.set(box.listC.indexOf('*'), box.listN.get(box.listC.indexOf('*')) * box.listN.get(box.listC.indexOf('*') + 1)); box.listN.remove(box.listC.indexOf('*') + 1); box.listC.remove(box.listC.indexOf('*')); }else { throw new MyException("无法使用该题目"); } return box; } }
六、计算模块部分异常处理说明。
private class ButtonListener implements ActionListener { public void actionPerformed(ActionEvent e) { try { n1 = Integer.parseInt(n.getText()); if (n1 <= 0 || n1 > 10000) { n.setText("输入数字错误,请输入0到10000的数字哦"); return; } flag0 = 1; } catch (Exception a) { n.setText("不对哦,请重新输入数字哦"); } try { m11 = Integer.parseInt(m1.getText()); if (m11 <= 0 || m11 > 100) { m1.setText("输入数字错误,请输入0到100的数字哦"); return; } flag1 = 1; } catch (Exception a) { m1.setText("不对哦,请重新输入数字哦"); } try { m22 = Integer.parseInt(m2.getText()); if (m22 < 50 || m22 > 1000) { m2.setText("输入数字错误,请输入50到1000的数字哦"); return; } flag2 = 1; } catch (Exception a) { m2.setText("不对哦,请重新输入数字哦"); } try { o1 = Integer.parseInt(o.getText()); if (o1 <= 0 || o1 > 10) { o.setText("输入数字错误,请输入1到10的数字哦"); return; } flag3 = 1; } catch (Exception a) { o.setText("不对哦,请重新输入数字哦"); }
七、界面模块的详细设计过程。在博客中详细介绍界面模块是如何设计的,并写一些必要的代码说明解释实现过程。
1、Command:出题界面,按要求输入想要获得的题目条件;
2、GUI:所有GUI界面的设计;
3、Operation系列:根据接受要求实现生产运算式,并判断正误,得出结果,并计时;
4、Symbol:运算符生成;
5、Prior:优先级的判断。
public class Prior { public static int prior(char c) { if (c == '(') return 0; if (c == '+' || c == '-') return 1; if (c == '*' || c == '÷') return 2; return -1; } }
八、界面模块与计算模块的对接。
九、两人在讨论的结对照片。
十、说明结对编程的优点和缺点。同时指出结对的每一个人的优点和缺点在哪里 (要列出至少三个优点和一个缺点)。
1、结对项目
优点:效率更高,思路更开阔,遇到问题能马上得到一定的解决,有时候可能只是突然脑袋短路,而同伴会马上提醒,就不必一直纠结在一个非常简单的小错误里。而且成果能吸取两个人的优点,弥补个人的不足之处。遇到困难有同伴的陪伴心理压力比一个人小。
缺点:因为每个人的特点不同,需要一段时间来磨合,这段时间效率不太高;还有时间问题,需要找到两个人都有时间有一定的难度。
2、个人
冯舒怡:
优点:认真负责,耐心,能想到特别的点子
缺点:做事较拖沓
我:
优点:沉着冷静,态度积极,细心
缺点:代码能力欠佳
十一、PSP各个模块上实际花费的时间。
PSP |
任务内容 |
实际完成的时间(min) |
Planning |
计划 |
60 |
· Estimate |
· 估计这个任务需要多少时间, 并规划大致工作步骤 |
60 |
Development |
开发 |
2995 |
· Analysis |
· 需求分析 (包括学习新技术) |
220 |
· Design Spec |
· 生成设计文档 |
40 |
· Design Review |
· 设计复审 (和同事审核设计文档) |
15 |
· Coding Standard |
· 代码规范 (为目前的开发制定合适的规范) |
20 |
· Design |
· 具体设计 |
160 |
· Coding |
· 具体编码 |
2000 |
· Code Review |
· 代码复审 |
120 |
· Test |
· 测试(自我测试,修改代码,提交修改) |
420 |
Reporting |
报告 |
130 |
· Test Report |
· 测试报告 |
80 |
· Size Measurement |
· 计算工作量 |
20 |
· Postmortem & Process Improvement Plan |
· 事后总结, 并提出过程改进计划 |
30 |