结对作业

仓库源地址  : https://git.coding.net/zcy0521/pair_programming.git

 

 

测试url地址:http://localhost:8080/pairwork/Login.jsp

 

 

 

 一、PSP表格

 

PSP2.1

任务内容

计划共完成需要的时间(min)

实际完成需要的时间(min)

Planning

计划

60

 

·        Estimate

·   估计这个任务需要多少时间,并规划大致工作步骤

30

 

Development

开发

120

 

·        Analysis

·         需求分析 (包括学习新技术)

60

 

·        Design Spec

·         生成设计文档

30

 

·        Design Review

·         设计复审 (和同事审核设计文档)

45

 

·        Coding Standard

·         代码规范 (为目前的开发制定合适的规范)

30

 

·        Design

·         具体设计

180

 

·        Coding

·         具体编码

300

 

·        Code Review

·         代码复审

120

 

·        Test

·         测试(自我测试,修改代码,提交修改)

60

 

Reporting

报告

120

 

·         Test Report

·         测试报告

60

 

·         Size Measurement

·         计算工作量

30

 

·         Postmortem & Process Improvement Plan

·         事后总结, 并提出过程改进计划

30

 

 

 

二、接口设计

(一)Informatica Hiding

1、什么是信息隐藏

 

信息隐藏指在设计和确定模块时,使得一个模块内包含的特定信息(过程或数据),对于不需要这些信息的其他模块来说,是不可访问的。

信息隐藏,信息封装是结构化与面向对象设计的基础。

 

信息隐藏(Information hiding)是程序设计过程中的一种隔离原则,可以防止用户接触到一个类的某些部分。一个程序模块可以将它的信息隐藏起来,对外仅仅展现出一种接口。当这个模块的具体实现发生改变时,只要保证它的接口不发生变化,则就算不修改模块外的其他代码,程序依旧可以正确执行。这种接口的设计保证了整个工程的稳定性。

 

2、为什么要信息隐藏

 

(1)隐藏复杂度:这样你就不用再去应付它,除非你要特别关注的时候;

(2)隐藏变化源:这样当变化发生时,其影响就能被限制在局部范围内。复杂度的根源包括复杂的数据类型、文件结构、布尔判断以及晦涩的算法等等。

 

3、信息隐藏体现了面向对象编程中的封装原则,在具体的实现过程中可以用以下方式实现:

(1) 多层设计中的层与层之间加入接口层;
(2) 所有类与类之间都通过接口类访问;

(3)类的所有数据成员都是private,所有访问都是通过访问函数实现的;

 

4、在我们的代码中

在我们的“四则运算”软件开发中,时时都在使用 Information Hiding原则。我做前端,不需要看后端的工程文件,不需要看后端的代码,只需要鲁后端给我提供一个DLL还有一份接口说明。后端维护计算核心,只需要将接口维护好,前端的设计、布局、用户交互等不需要考虑。我们通过一份“接口协议”结合为一个高效率的团队,这正是信息隐藏原则的意义。所以我们在进行信息隐藏时,认真地研究各个模块的接口的设计,设计得越恰当,当需要修改模块的实现时会显得更加容易。

 

 

(二)Interface Design

接口设计(Interface design)主要考虑的就是两个模块之间连接和发送信号的方式。

 

接口(英文:Interface),在JAVA编程语言中是一个抽象类型,是抽象方法的集合,接口通常以interface来声明。一个类通过继承接口的方式,从而来继承接口的抽象方法。


接口并不是类,编写接口的方式和类很相似,但是它们属于不同的概念。类描述对象的属性和方法。接口则包含类要实现的方法。

 

界面设计能够使得软件的交互更为人性化,同时使得软件更易于使用。在设计交互界面时,应当充分考虑程序的合法输入以及用户的需求。

 

interface design,接口设计,是一个项目可以划分为不同部分的基础。我们之所以可以一个负责前端一个负责计算核心将这个软件完成,最重要的一点就是我们有良好的接口设计。我们约定好生成算式参数设置接口、生成算式接口、计算接口、检验答案接口,在编写代码中又加入了异常抛出约定以及极端情况约定。我们设计了良好的接口,大大方便了我们的分工协作,最大程度保证了我们工作的独立,不受搭档代码情况影响。

(三)Loose Coupling

loose coupling,松耦合。松耦合的目标是最小化依赖,实现可伸缩性、灵活性和容错。我们的项目中,前端与后端都有很强的可伸缩性与灵活性与容错。比如,前端可以自由选择从用户获取信息的方式,用户交互方式而无需顾虑后端的实现,后端可以自由选择解决问题的算法,变量的使用,而无需考虑前端的实现方式。前后端只需要遵守同一套“接口协议”就可以保证正常运行。后端提供的DLL文件可以不断更新,而不影响前端开发,这也体现了松耦合的理念。

 

耦合降低了软件在结构上的相互依赖程度,通过以接口的方式实现软件模块间的调用使得部分模块在发生改变时软件的其他部分可以保持不变。为了实现松耦合可以编写专门的接口类,降低不同类之间的耦合度

 

当一个类为了使另一个类做出一些改变而包含一个指向它的指针的时候,这两个类是强耦合的。在这种情况下,当后者发生改变时,前者很难保持不变。而如果一个类包含的指针指向的不是类而是一个接口,当实现这个接口的类的具体实现发生改变时,由于接口没有改变,则不需要修改引用接口的类,程序依旧可以正确运行。松耦合的接口设计使得程序设计的可拓展性大大增强。新设计的类通过实现某个接口,可以轻轻松松地替换当前的某个类,而无需修改调用这些接口的类。

 

四、计算模块接口的设计与实现过程:设计包括代码如何组织,比如会有几个类,几个函数,他们之间关系如何,关键函数是否需要画出流程图?说明你的算法的关键(不必列出源代码),以及独到之处。

Command.java文件是主要的,首先会有定义一个command()函数来判断符号的优先级计算,接下来是定义一个gcd()函数用来判断求取最大公因数,然后是最重要的函数,定义了一个create()函数,通过调用前两个函数来生成用户所需要的四则运算的运算式。

 

五、计算模块接口部分的性能改进 :记录在改进计算模块性能上所花费的时间,描述你改进的思路,并展示一张性能分析图,并展示你程序中消耗最大的函数。

 

    在计算模块接口的部分,首先,在计算模块需要有接收用户在前端页面输入的题目数,运算符数,题目范围等参数的接口,接受到用户的需求,并对该需求作出响应,生成相应的符合要求的题目,其次,在前端页面的题目页面需要有接收后端生成的题目的文件的接口,使题目文件在题目页面显示,用户可以在题目页面进行答题,答题完毕后点击提交按钮就会进入答案页面,答案页面也是由后台提供,所以后台需要有一个接口获取前端用户的答题页面,并且提供给前端一个答案页面。

  计算模块后台获取前端的生成题目需求是通过request对象

 

所花时间:共4小时(查找模块1小时,改进3小时)

 

 

 

六、计算模块部分单元测试展示 :展示出项目部分单元测试代码,并说明测试的函数,构造测试数据的思路。并将单元测试得到的测试覆盖率截图,发表在博客中。只需要测试命令行部分,且该部分覆盖率到90%以上,否则单元测试部分视作无效。

 

 

 

七、计算模块部分异常处理说明 :在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景。

 常是程序中的一些错误,但并不是所有的错误都是异常,并且错误有时候是可以避免的。

比如说,你的代码少了一个分号,那么运行出来结果是提示是错误 java.lang.Error;如果你用System.out.println(11/0),那么你是因为你用0做了除数,会抛出 java.lang.ArithmeticException 的异常。

异常发生的原因有很多,通常包含以下几大类:

  • 用户输入了非法数据。
  • 要打开的文件不存在。
  • 网络通信时连接中断,或者JVM内存溢出。

这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。-

要理解Java异常处理是如何工作的,你需要掌握以下三种类型的异常:

    • 检查性异常:最具代表的检查性异常是用户错误或问题引起的异常,这是程序员无法预见的。例如要打开一个不存在文件时,一个异常就发生了,这些异常在编译时不能被简单地忽略。
    • 运行时异常: 运行时异常是可能被程序员避免的异常。与检查性异常相反,运行时异常可以在编译时被忽略。
    • 错误: 错误不是异常,而是脱离程序员控制的问题。错误在代码中通常被忽略。例如,当栈溢出时,一个错误就发生了,它们在编译也检查不到的。
    •  1 try {
       2             //n = Integer.parseInt(args[0]);// 命令行输入
       3             if (n <= 0)
       4                 System.out.println("输入的不是正整数,请重新输入!");
       5         } catch (Exception e) {
       6             System.out.println("输入的不是正整数,请重新输入!");
       7         }
       8         try {
       9             PrintStream ps = new PrintStream("../result.txt");// 生成文件
      10             System.setOut(ps);
      11         } catch (Exception e) {
      12             System.out.println("文件生成错误");// 提示
      13         }
      14         //System.out.println("2016012063");

      在我们的这次项目中,我们有两个异常处理,一个是对于用户输入题目数的错误的异常处理,当用户输入的题目数是负数或分数时,这是不符合标注准的,是不会生成相应的题目数的,这就属于异常情况,所以需要进行异常处理。

    •  

      另一个是对于生成result.txt文件的错误异常处理,当result.txt文件生成错误时,会使答案页面不能生成,导致用户无法对自己进行评估,所以这就属于异常情况,需要进行异常处理。

    •  

八、界面模块的详细设计过程 :

(一)、登录界面

 首先登录界面是一个JSP页面,主要用HTML和CSS代码写在JSP文件当中实现页面的部分,首先是登录的部分,打开网页版的程序,首先会看到 一个登录页面,登录界面的背景是星空的图案,在登录界面中,会有两个白色的文本框,一个为输入用户名的文本框,另一个是输入密码的文本框,用户只需输入自己的用户名和密码即可,再输入完用户名和密码过后,你会看见在文本框下面看见一个蓝色的按钮,上面写着登录,所以输入用户名和密码然后点击登录按钮即可提交表单,处罚ACTION的行动,进入下一个界面。

(二)、欢迎界面

  当你在登录界面点击了蓝色的登录按钮过后,触发了ACTION的动作,就进入了欢迎界面,在欢迎界面你会看见背景是白色为主的,上面有数学公式和多彩的运算符的以及一个小人的团,在该界面,你会看到在页面的正中央的上面有加加粗的深蓝色的大字“欢迎来到四则运算小程序!~”,在该界面的标题的正下方,你会看到一个蓝色的“开始答题”的按钮,当你想要开始答题时,只需点击按钮进入下一页面即可。

(三)、主界面

  当你在欢迎界面点击了“开始答题~”的蓝色按钮之后,你就会进入下一个页面,主页面,界面包括各个系统功能选择项,包括题目数的选择,运算符个数的选择,题目范围的选择,以及生成题目的按钮。首先题目数的选择输入是以文本框,由用户输入想要生成的题目的数量,接下来是运算符个数的选择,考虑到是小学生的四则运算,所以我们的题目运算符个数不能太多,所以我给用户提供了四个选择,分别为“一个运算符” 、“两个运算符” 、“三个运算符”  、 “四个运算符” ,是以一个下拉框的形式出现在页面上的,最后是生成题目按钮,当你点击按钮,表单内的题目数 、运算符数 、题目范围等参数就会传给后台,后台就会执行生成题目这一动作。

 

 

 1 <p  style="color: #FFFFFF !important ; font-size :30px">题目数</p>
 2 </td>
 3 <td>
 4 <div class="input_outer1">
 5 
 6 <input name="n1" class="text1" style="color: #FFFFFF !important" type="text" placeholder="请输入题目数">
 7 </div>
 8 </td>
 9 </tr>
10 
11 
12 
13 <tr>
14 <td>
15 <label  style="color: #FFFFFF !important ; font-size :30px">运算符数</label>
16 </td>
17 <td>
18 <select  class = "sel" style = " padding-right: 14px;" name = "m1">
19 <option value = "1">一个运算符</option>
20 <option value = "2"  selected = "selected">二个运算符</option>
21 <option value = "3">三个运算符</option>
22 <option value = "4个">四个运算符</option>
23 </select>
24 </td>
25 </tr>

 

 

 

(四)题目页面

  当你在主页面内输入了你想要的题目数,运算符数,题目范围等点击了生成题目的按钮,那么这些参数就会通过Request对象传给后台,后台接收到你的请求,生成相应的题目,输出到前端页面,用户可在前端的题目页面上进行答题操作,后台会实时记录你答题的时间,但你答题结束后,你会在页面的右下方看见一个蓝色的提交按钮,点击该按钮,提交你的答案。在按钮的右侧,你会看见,一个计时器,当你进入该页面,计时器就会开始计时,当你答题结束,你就可以点击计时器右侧的stop按钮,在计时器上就记录了你的答题时间。

 

(五)答案页面

  当你在题目页面点击了提交按钮,提交了表单后,你的题目和答案会一起提交到后台,后台的计时器会停止计时,并且后台会对你的题目进行分析判断,最后提交给你一份答案页面,以及你的正确率,以及你答题所用的时间信息。当你检查完题目,觉得要结束这个答题程序了,你可以点击离开按钮,提交表单,AVTION回到登录页面,离开该程序。但如果你对于刚才自己的表现不满意,想要再做一次,可以选择点击右下方的另一个蓝色的按钮,再来一次,选择在一次挑战自己,点击该按钮后,你就会进入主页面,重新选择你想要做的题目的类型的。

 

 

 

九、界面模块与计算模块的对接

  用户可以在主页面输入本人想要的题目数、运算符数、数值范围、几个参数,这几个参数会通过Request对象请求传值到后端,后端根据用户输入的参数生成相应的题目在题目页面,用户可以在题目页面进行答题,答完题后用户可以点击提交按钮,提交自己的题目,页面就会调到答案页面,在答案页面你会看见刚刚自己所做的题目的所有答案文件,该文件是有后端传来,用户可以了解检查到自己刚刚所做的题目的正确与否。

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

十、描述结对的过程

(照片)

 

十一、结对编程的优点和缺点

 

    结对编程的优点

  1、互相学习编程技巧:在编程中,相互讨论,可以更快更有效地解决问题,互相请教对方,可以得到能力上的互补。可以发散思  维,两个人一个小时能讨论出来的东西,或许一个人一个星期都没法想出来,两个人合作编程,就可以让两个人的智慧和能力共同  发挥出来,来完成一个人难以单独办到的事。

  2、可以让编程环境有效地贯彻Design。

  3、多双眼睛,少点 bug:增强代码和产品质量,并有效的减少BUG,当一个人写出一段代码的时候,另一个人作为旁观者往往更  容易发现其中的问题。

  4、降低学习成本。一边编程,一边共享知识和经验,有效地在实践中进行学习。

  5、在编程中,相互讨论,可能更快更有效地解决问题。

  6、可以培养和训练新人:让资深开发者和新手一起工作,可以让新人更快上手。

  7、互相鼓励,不容易沮丧:团队工作能增加成员的工作积极性。因为在面对问题的时候,会有人一起分担,共同尝试新的策略。

  8、如果两个人合作,平均每个人的工作量就可以减少一半。而且,由于两个人的思维不同,可以互相取长补短。两个人擅长的方  面不同,所以分工合作就可以同时发挥两个人的优点。

 

  当然,结队编程也会有一些不好的地方:

 

  1、对于有不同习惯的编程人员,可以在起工作会产生麻烦,甚至矛盾。

  2、有时候,程序员们会对一个问题各执己见(代码风格可能会是引发技术人员口水战的地方),争吵不休,反而产生重大内耗。

  3、两个人在一起工作可能会出现工作精力不能集中的情况。程序员可能会交谈一些与工作无关的事情,反而分散注意力,导致效  率比单人更为低下。

  4、结对编程可能让程序员们相互学习得更快。有些时候,学习对方的长外,可能会和程序员们在起滋生不良气氛一样快。比如,  合伙应付工作,敷衍项目。

  5、面对新手,有经验的老手可能会觉得非常的烦躁。不合适的沟通会导到团队的不和谐

  6、有经验的人更喜欢单兵作战,找个人来站在他背后看着他可能会让他感到非常的不爽,最终导致编程时受到情绪影响,反而出   现反作用。

  7、结对编程的缺点有主观性的也有客观性的。客观性主表现在两个人电脑程序可能存在不兼容现象,导致一个人的程序无法在另  一个人的机器上运行,但这个问题可以通过程序的升级而轻易解决。

  8、主观性表现在两个人性格不合,不能友好相处,因此合作的效率也受影响。人际交往的障碍是妨碍合作编程的重大问题,而且  难以在短时间内解决,所以应当引起重视。

 

  对方性格评价:

  1、是个友善的人,愿意合作与交流,在与我的合作学习和探究活动中,能选择自己擅长的方式(语言、文字、图表等)表述研究过程和  结果;主动提供自己的资料和想法,与我分享自己智慧,思路,体验合作的愉快。能倾听和尊重我提出的不同观点和评议,能对研究过程  和结果进行评议,并与我交换意见,充分体现结对编程的价值。

  2、是个谦逊的人,在与我的合作交流中,我们做到相互尊重,相互信赖,认真倾听对方意见,勇于承认自己的不足,有虚心向对方学习  请教的良好风尚,能在合作交流中正确地评价自己和他人,学会分享他人成功的喜悦。能够在合作交流中明确自己的责任,并履行自己  承担的职责。具有与他人进行合作交流的态度与能力。

  3、有集体责任感,善于合作。在合作学习中充分发挥自己的特长,为实现集体目标作出了贡献。积极搜索资料,善于彼此分享交流,有  无私的精神。尊重并理解他人,具有创新精神和动手操作能力,养成了合作交流的习惯。

  4、热情乐于助人。在合作过程中表现出非常突出。当我在发言时,认真倾听;在交流时,你能把自己的想法和知道的信息都说出来了;  在工作中能否主动地承担活动项目;当我需要帮助时,能提供热情的帮助;认真倾听意见与观点,活动后参加整理材料,有很好的学习  习惯。

  5、在结对合作学习过程中,能创造和谐的气氛,促进小组成员之间和谐的共同的完成各自任务,为养成健全人格奠定了基础。能为研究  活动准备、计划,全面统筹的能力得到了锻炼;能总结“‘共同解决了什么问题、小组还有什么问题没有解决?”“我们小组做得最好的是哪  些人?还有哪方面他们能够做得更好?”

  6丶有很强的组织能力。你做事认真,力求完美,在合作中你的适应能力很强,活泼开朗,我们相处融洽,你很有感染力;遇事有你独到  的见解,解决问题时你没有骄傲,失败时你没有气馁,你用坚强的信念和不懈的努力去面对它们。

  8、你善于思考问题,渴望得到更多的知识。你能完成好结对编程分配给你的一切任务,是一个勤学、善问的好学生,跟你结对工作体验  到了合作、成功的喜悦。

 

 

 

十二、psp表格

 

 

 

PSP2.1

任务内容

计划共完成需要的时间(min)

实际完成需要的时间(min)

Planning

计划

60

120

·        Estimate

·   估计这个任务需要多少时间,并规划大致工作步骤

30

60

Development

开发

120

700

·        Analysis

·         需求分析 (包括学习新技术)

60

145

·        Design Spec

·         生成设计文档

30

60

·        Design Review

·         设计复审 (和同事审核设计文档)

45

105

·        Coding Standard

·         代码规范 (为目前的开发制定合适的规范)

30

60

·        Design

·         具体设计

180

540

·        Coding

·         具体编码

300

1800

·        Code Review

·         代码复审

120

240

·        Test

·         测试(自我测试,修改代码,提交修改)

60

145

Reporting

报告

120

175

·         Test Report

·         测试报告

60

90

·         Size Measurement

·         计算工作量

30

45

·         Postmortem & Process Improvement Plan

·         事后总结, 并提出过程改进计划

30

60

posted @ 2018-04-10 07:42  郑春雨  阅读(262)  评论(2编辑  收藏  举报