结对项目
一、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模型开发,在不同层都用到了接口的设计,并不需要在很多地方修改。
四、计算模块接口的设计与实现过程。
五、单元测试与效能分析
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 | //测试题目是否可用并更改题目的可用状态 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 |
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· ASP.NET Core 模型验证消息的本地化新姿势
· 对象命名为何需要避免'-er'和'-or'后缀
· SQL Server如何跟踪自动统计信息更新?
· AI与.NET技术实操系列:使用Catalyst进行自然语言处理
· 分享一个我遇到过的“量子力学”级别的BUG。
· C# 中比较实用的关键字,基础高频面试题!
· .NET 10 Preview 2 增强了 Blazor 和.NET MAUI
· 为什么AI教师难以实现
· 如何让低于1B参数的小型语言模型实现 100% 的准确率
· AI Agent爆火后,MCP协议为什么如此重要!