结队项目报告
- Coding.Net项目地址
项目地址:https://git.coding.net/gemyty/team.git
伙伴博客地址:http://www.cnblogs.com/benmatt/p/8765601.html
- 计划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
信息隐藏(Information Hiding)
什么是信息隐藏
-
- 信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。
- 信息隐藏是软件的首要技术使命中格外重要的一种启发式方法,因为它强调的就是隐藏复杂度。
信息隐藏在设计的所有层次上都有很大作用:从用具名常量代替字面常量,到创建数据类型,再到类的设计、子程序的设计以及子系统的设计等等。
为什么要隐藏?
-
- 隐藏复杂度:这样你就不用再去应付它,除非你要特别关注的时候;
- 隐藏变化源:这样当变化发生时,其影响就能被限制在局部范围内。复杂度的根源包括复杂的数据类型、文件结构、布尔判断以及晦涩的算法等等。
接口设计(Interface Design)
设计接口:是传统的后勤保障的一种要素也是一种后勤功能。
它涉及与后勤有关的设计参数(如可靠性和维修性)与战备完好性和保障资源要求的相互关系。这些与后勤有关的设计参数应采用使用值而不应采用固有值表示,它与装备系统战备完好性目标和保障费用有着特定的关系。(防务采办术语-98)
与后勤有关的设计参数(如可靠性和维修性)与战备完好性和保障资源要求间的相互关系。这些与后勤有关的设计参数用使用值而不是用固有值表示,并与装备系统战备完好性目标和保障费用有着特定的关系。(DoDD5000.39-83、防务采办术语-89)
有关保障性的设计参数(如可靠性和维修性)与战备完好性及保障资源要求之间的相互关系。这些保障性设计参数应该用使用值表示,并与战备完好性目标和保障费用有特定的关系。(GJB1371-92)
对于接口,除了之前学JAVA的时候很草率地了解了“接口”,其余也没有特别的懂,所以在学习这方面的知识时,我们查看了一些博客:
https://blog.youkuaiyun.com/h8135/article/details/307205
https://blog.youkuaiyun.com/lingshaoxia/article/details/21097839
松耦合(Loose Coupling)
松耦合:允许改变或者当问题发生在“电线的一端时”来避免影响到其他的端点。也就是说,改变或者供应者或者服务的问题不能影响到用户----或者用户的问题不应影响到供应者或者服务。举例来说,如果服务的新版本被推出的话,服务的用户就不必非要去修改,不必非要去改变路线,甚至不必经历停滞期----因为它(服务的新版本被推出)能清楚地向他们显示出来。相对而言,如果服务的一个用户决定改变他们正在使用的供应者(可能有了一个更低价格的服务供选择),这不需要用户应用必须要被重新编码,甚至是中断来做这样的改变。作为提供松耦合的必备基本要素,Web服务管理代理经常使用在用户和供应者之间。
松耦合的目标:最小化依赖,主要用来处理可伸缩性、灵活性和容错这些需求。
在本次项目中,对于用户而言,只需要设置自己的参数,得到相应的题目,因为用户不会关心题目是如何生成的,只需要调用这个方法,所以可以将生成题目这一模块设计成接口,计算模块也是一样。
在模块的优化过程中,保证接口不变,我们只需要修改接口的实现,并不需要对其他地方进行修改,程序也可以正常运行。
对于本次项目来说,采用mvc模式开发,所以在不同的层都会用到设计的接口。
- 模块接口的设计与实现过程
- 单元测试与效能分析
单元测试分三个:Tester、Maker、Outer
Tester:用于测试者的测试,测试题目是否可用并生成答案
Maker:用于制造题目的测试
Outer:用于输出者的测试,规范输出题目
列出一个单元测试及其样例:
对于n
case "-n": { try { n = Integer.parseInt(args[i + 1]); if (n < 1 || n > 1000) { System.out.println("对不起,请注意题目数量为1-1000!"); return; } } catch (ArrayIndexOutOfBoundsException e) { //未输入数字时args[i+1]会数组越界 System.out.println("您未输入题目数量!"); return; }catch (NumberFormatException e) { //输入非数字字符等 System.out.println("对不起,请输入1-1000的数字!"); return; } break; }
@Test public void main() throws Exception { String[] args1 = {"-n","0","-m","99","60","-o","9"}; Command.main(args7); String[] args2 = {"-n","a","-m","99","60","-o","9"}; Command.main(args8); String[] args3 = {"-n"}; }
- 关于异常
抛出异常的条件:
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("不对哦,请重新输入数字哦"); } ………………
}
异常时的面板展示:
- 界面模块的详细设计过程
Command——出题界面,按要求输入想要获得的题目条件;
GUI——所有GUI界面的设计;
Operation、Operation1、Operation2——根据接受要求实现生产运算式,并判断正误,得出结果,并计时;
Symbol——运算符生成;
Prior——优先级的判断。
展示部分面板:
部分代码:
private JButton jbtRight = new JButton("开始做题"); private JButton developer = new JButton("上传文件"); private JCheckBox jchkCentered = new JCheckBox("有乘除法"); private JCheckBox jchkBold = new JCheckBox("有括号"); private JTextField n = new JTextField(8); private JTextField m1 = new JTextField(8); private JTextField m2 = new JTextField(8); private JTextField o = new JTextField(8); private JLabel label = new JLabel(); private static JLabel label0 = new JLabel(); private static JButton jbnext = new JButton("下一题"); private static JButton jbsubmit = new JButton("完成");
JPanel p1 = new JPanel(); p1.setLayout(new GridLayout(4, 2, 5, 5)); p1.add(new JLabel("请输入题目数量[1,10000]:")); p1.add(n); p1.add(new JLabel("请输入数字最小值[1,100]:")); p1.add(m1); p1.add(new JLabel("请输入数字最大值[50,1000]:")); p1.add(m2); p1.add(new JLabel("请输入运算符个数[1,10]:")); p1.add(o);
public String addProblem() { Font font = new Font(Font.DIALOG, Font.PLAIN, 20); label.setFont(font); String problem; if (b == 1 && c == 1) { flag4 = 1; problem = Operation.Operation(n1, m11, m22, c, o1); } else if (b == 0) { flag4 = 0; problem = Operation1.Operation(n1, m11, m22, c, o1); } else { flag4 = -1; problem = Operation2.Operation(n1, m11, m22, c, o1); } label.setText(problem); return "题目:" + problem + "="; }
- 界面模块与计算模块的对接
部分面板展示:
- 结对过程
- 关于结对编程
http://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html
-
- 结对项目的优点:效率更高,思路更开阔,遇到问题能马上得到一定的解决,有时候可能只是突然脑袋短路,而同伴会马上提醒,就不必一直纠结在一个非常简单的小错误里。而且成果能吸取两个人的优点,弥补个人的不足之处。遇到困难有同伴的陪伴心理压力比一个人小。
- 结对的缺点:因为每个人的特点不同,需要一段时间来磨合,这段时间效率不太高;还有时间问题,需要找到两个人都有时间有一定的难度。
- 个人优缺点:
冯舒怡:
优点:认真负责,耐心,能想到特别的点子
缺点:做事较拖沓,喜欢延迟到DDL
郭腾岳:
优点:沉着冷静,态度积极,细心热情
缺点:代码能力欠佳
- 实际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 |
这一次的作业真的耗时特别特别久,整个过程从很被动,带有抗拒的心理逐渐转变成平和、细心调节,和队友一起完成这个项目体验还是很好的,虽然我们两个能力有限,但是在不断学习的过程中有新的收获产生,这一次对单元测试有了实质性的接触,但是效能分析这一块还比较薄弱。因为清明节有很大的事回了一趟家,所以和队友在时间上的安排不是很能调节在一起,结队让自己知道,自己不是一个人在战斗,可能这也就是结队能带给自己最大的感触吧。
注:在本次结队项目的博客中,我和队友的流程图和设计图是共同完成的,所以两者一起用的并没有分开