结对作业
一、Coding.Net项目地址:https://git.coding.net/lvgx/majx.git
二、PSP展示
PSP | 任务内容 | 计划共完成需要的时间(min) | 实际完成需要的时间(min) |
Planning | 计划 | 2*60 | 3*60 |
Estimate | 估计这个任务需要多少时间,并规划大致工作步骤 | 2*60 | 3*60 |
Development | 开发 | 22*60 | 27*60 |
Analysis | 需求分析 (包括学习新技术) | 5*60 | 7*60 |
Design Spec | 生成设计文档 | 60 | 60 |
Design Review | 设计复审 (和同事审核设计文档) | 30 | 30 |
Coding Standard | 代码规范 (为目前的开发制定合适的规范) | 60 | 60 |
Design | 具体设计 | 5*60 | 6*60 |
Coding | 具体编码 | 8*60 | 10*60 |
Code Review | 代码复审 | 30 | 30 |
Test | 测试(自我测试,修改代码,提交修改) | 60 | 60 |
Reporting | 报告 | 2*60 | 2*60 |
Test Report | 测试报告 | 60 | 60 |
Size Measurement | 计算工作量 | 30 | 30 |
Postmortem & ProcessImprovement Plan | 事后总结, 并提出过程改进计划 | 30 | 30 |
三、接口设计
Information Hiding(信息隐藏):信息隐藏是指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。
参见:https://blog.csdn.net/gongchuangsu/article/details/53895916
Interface Design(界面设计):界面设计(即UI设计)是人与机器之间传递和交换信息的媒介。
接口设计的要求有:
①稳定性:接口必须相对稳定,否则将导致接口的使用者和提供者为了适应新接口而不断修改接口的实现,可能重复进行无用功,严重时影响整个软件开发进度。首先,接口的语义必须明确。包括接口调用方法、接口名称、参数的类型和名称。抽象的接口名称或者参数名称容易使人困惑或者理解错误。其次,采用版本定义来区分接口的差异。比如提供接口版本查询功能,接口实现着提供接口版本的查询功能。
②易用性:接口是提供给第三方使用的,较难使用的接口会导致接口使用者的抱怨。
③规范性:主要是接口设计的代码规范,这是最基本的要求。可移植性:对于需要在多平台实现的接口需要考虑接口本身的可移植性,因此最少使用对于系统依赖的类型作为接口的参数类型或者返回值类型。
④鲁棒性:接口需要有适度的鲁棒性,主要是指能够在多种情况下接口都能实现统一的效果,不会随着调用者传入的参数的变化而导致接口的输出出现违背接口语义的情况出现。
⑤安全性:接口定义时需要严格限制参数的读写权限,如果只能是只读的参数一定要设置成const,以免出现非法使用。
⑥兼容性:这是接口扩充的原则,必须保证同一个接口实现后向兼容前一版本的使用。扩充的同类接口也能兼容老接口的实现。
参见:https://www.cnblogs.com/MuYunyun/p/6037262.html
Loose Coupling(松耦合):松耦合系统通常是基于消息的系统,此时客户端和远程服务并不知道对方是如何实现的。客户端和服务之间的通讯由消息的架构支配。只要消息符合协商的架构,则客户端或服务的实现就可以根据需要进行更改,而不必担心会破坏对方。
参见:https://blog.csdn.net/zhao8155363/article/details/1818681
在结对编程中,对接口设计时,我们进行了模块化,开始不是就逐条录入计算机语句和指令,而是首先用主程序、子程序、子过程等框架把软件的主要结构和流程描述出来,并定义和调试好各个框架之间的输入、输出链接关系,以此降低程序复杂度,使程序设计、调试和维护等操作简单化。
四、模块接口的设计与实现过程
共用到9个类,12个函数
gui调用suan,suanfa,suanfa1,suanfa2;
suan函数调用test,suan1,panduan;
suanfa函数调用suan1,panduan;
suanfa1函数调用suan1,panduan;
suanfa2函数调用suan1,panduan;
Command。
运用GUI,图形用户界面(简称 GUI,又称图形用户接口)是指采用图形方式显示的计算机操作用户界面,与早期计算机使用的命令行界面相比,图形界面对于用户来说在视觉上更易于接受,然而这界面若要通过在显示屏的特定位置,以”各种美观而不单调的视觉消息“提示用户”状态的改变“,势必得比简单的消息呈现花上更多的计算能力。
运用监听器,监听器是一个专门用于对其他对象身上发生的事件或状态改变进行监听和相应处理的对象,当被监视的对象发生情况时,立即采取相应的行动,监听器其实就是一个实现特定接口的普通java程序,这个程序专门用于监听另一个java对象的方法调用或属性改变,当被监听对象发生上述事件后,监听器某个方法立即被执行。
五.模块接口部分的性能改进
六.模块部分单元测试展示
根据作业中的链接学习了如何进行单元测试,并对项目进行了测试test
public class test { private static int i=10; private static int j1=1; private static int j2=50; private static int p=4; private static int n=0; private static String s="11+(43-(35-(14+26)))"; public static void main(String[] args) { System.out.println(suanfa.suanfa(i, j1, j2, n, p)); //题目函数一 System.out.println(suanfa.suanfa(i, j1, j2, n, p)); System.out.println(suanfa.suanfa(i, j1, j2, n, p)); gui.main(null); // 中文界面 } }
覆盖率截图:
七.模块部分异常处理说明
在我们的项目中,我们共设计了四种异常处理,分别是出题数量异常处理,数值左边界异常处理,数值右边界异常处理和运算符数量异常处理。
- 出题数量异常处理
当用户输入的出题数量的数值不在[1,10000]范围内时,提醒用户当前输入的数值不合法,要求用户重新输入。
代码展示:
try { n1 = Integer.parseInt(n.getText()); if (n1 <= 0 || n1 > 10000) { n.setText("不可以哦,要在1至10000之间"); return; } flag0 = 1; } catch (Exception a) { n.setText("格式不正确,请重新填写!"); }
对应场景:
2.数值左边界异常处理
当用户输入的出题数值左边界不在[1,100]范围内时,提醒用户当前输入的数值不合法,要求用户重新输入。
代码展示:
try { m11 = Integer.parseInt(m1.getText()); if (m11 <= 0 || m11 > 100) { m1.setText("不可以哦,要在1至100之间"); return; } flag1 = 1; } catch (Exception a) { m1.setText("格式不合法,请重新填写!"); }
对应场景:
3.数值右边界异常处理
当用户输入的出题数值右边界不在[50,1000]范围内时,提醒用户当前输入的数值不合法,要求用户重新输入。
代码展示:
try { m22 = Integer.parseInt(m2.getText()); if (m22 < 50 || m22 > 1000) { m2.setText("不可以哦,要在50至1000之间"); return; } flag2 = 1; } catch (Exception a) { m2.setText("格式不合法,请重新填写!"); }
对应场景:
4.运算符数量异常处理
当用户输入的运算符数量不在[1,10]范围内时,提醒用户当前输入的数值不合法,要求用户重新输入。
代码展示:
try { o1 = Integer.parseInt(o.getText()); if (o1 <= 0 || o1 > 10) { o.setText("不可以哦,要在1至10之间"); return; } flag3 = 1; } catch (Exception a) { o.setText("格式不合法,请重新填写!"); }
对应场景:
八.界面模块的详细设计过程
1.用GUI设计的出题界面
public GUI() { 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);
2.输入出现异常,报错并提示修改(同八)
3.答题界面
if (flag0 == 1 && flag1 == 1 && flag2 == 1 && flag3 == 1) { final long t1 = Calendar.getInstance().getTimeInMillis(); // 获取开始时间 JFrame TiMuFrame = new JFrame(); TiMuFrame.setTitle("题目"); TiMuFrame.setSize(100, 200); TiMuFrame.setLocationRelativeTo(null); TiMuFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); TiMuFrame.setVisible(true); JPanel panel2 = new JPanel(); final JTextField text = new JTextField(10); panel2.setLayout(new GridLayout(3, 2, 5, 5)); label.setText(addProblem()); panel2.add(label); panel2.add(new JLabel("")); panel2.add(new JLabel("你的结果:"));
4.整理页面
message = question + ", " + "你的结果:" + result + ", " + "正确答案: " + Approach.sum + ", 分数: " + ifRight;
5.上传文件
九.界面模块与计算模块的对接
1.用GUI设计的出题界面
2.输入出现异常,报错并提示修改(同八)
3.答题界面
4.整理页面
5.上传文件
十.结对过程描述
在这次结对项目中,和队员私下在寝室里共同讨论了这次项目的设计过程,并对代码的编写与测试都提出了各自的建设性意见。
下图为我们在讨论研究时的图片:
十一.结对编程的优缺点与结对成员优缺点
(1)结对编程的优点:
- 在开发层次,结对编程能提供更好的设计质量和代码质量,两人合作解决问题的能力更强。两人合作,还有相互激励的作用,工程师看到别人的思路和技能,得到实时的讲解,受到激励,从而努力提高自己的水平,提出更多创意。
- 对开发人员自身来说,结对工作能带来更多的信心,高质量的产出能带来更高的满足感。
- 在企业管理层次上,结对能更有效的交流,相互学习和传递经验,分享知识,能更好地应对人员流动。
(2)结对编程的缺点:
1.对于有不同习惯的编程人员,可以在起工作会产生麻烦,甚至矛盾。 有时候,程序员们会对一个问题各执己见(代码风格可能会是引发技术人员口水战的地方),争吵不休,反而产生重大内耗。
2.两个人在一起工作可能会出现工作精力不能集中的情况,程序员可能会交谈一些与工作无关的事情,反而分散注意力,导致效率比单人更为低下。
3.面对新手,有经验的老手可能会觉得非常的烦躁,他们更喜欢单兵作战,找个人来站在他背后看着他可能会让他感到非常的不爽,最终导致编程时受到情绪影响,反而出现反作用,导致团队的不和谐。
4.新手在面对有经验的老手时会显得非常的紧张和不安,甚至出现害怕焦虑的的精神状态,从而总是出现低级错误,而老手站在他们后面不停地指责他们导致他们更加紧张,出现恶性循环。最终导致项目进展效率低下,并且团队貌合神离。
(3)结对成员马佳欣的优缺点:
优点:1.算法能力很强,对于项目所需的技术很擅长;
2.任劳任怨,踏实勤奋,对于这次结对项目认真负责;
3.阳光开朗,积极乐观,能够给予队友鼓励与支持;
缺点:对于java语言不是很擅长。
(4)结对成员杨有存的优缺点:
优点:1.勤奋好学,积极上进,对于不懂的知识点能够认真学习;
2.踏实认真,耐心专注,对工作任务认真负责;
3.平易近人,性格随和,能够认真听取队友的意见。
缺点:动手实践能力不是很好,而且对于项目所需的技术也不是很熟练。
十二.PSP表格记录(见上文第二条目)