结对项目

一、【Coding.Net项目地址】https://git.coding.net/verde/Pair_Work.git

二、【对接口进行的设计】

看教科书和其它资料中关于Information Hiding, Interface Design, Loose Coupling的章节,说明你们在结对编程中是如何利用这些方法对接口进行设计的。

如下图SRC的目录结构:

如图一共有以下四个包:

  •  Information Hiding,Interface Design,Loose Coupling的实现:

 

1.信息隐藏:  

 

   项目中多个实体类封装数据,例如:Users类,Lists类,由于经过封装,信息访问只可通过get,set方法,对项目操作者是不可见的,实现了信息隐藏。主要体现在以下两方面:

 

       用户类封装了用户的个人信息,限定范围private直接联系到数据库。

 

       题目,结果,和算式分别在实体类Lists中建立三个LinkedList链表,expArr,resArr,addArr,在前台获取算式各种参数时只需要调用linkedList类的各种方法,例     如:get,set,get(index)操作简单,暴露信息少。

 

2.接口设计

 

     当初有了解过一些有关于框架的知识,所以这次项目结构设计也借鉴了一些接口思想:

 

           1.只有一个类(Function类)与前台交互使用实现接口,前台信息接受方便、只需创建一个对象,同时也保证了代码干净整洁。

 

           2.项目使用了面向对象思想,避免在jsp中加入过多的java代码,而是把各种功能写在类中的各种方法中,在jsp页面中直接调用方法。

 

           4.Tests类在后台功能实现的过程中边写代码边测试,在于前台交接之前一直使用junit代替前台传入的参数,这点使我们节省了时间。

 

2.松耦合

 

     java类的原则:“高内聚,低耦合”:每个类中功能健全,类与类间尽量减少关联

 

           生成式子等操作直接引用了上次作业的Main类的一些代码,DBUtil只与UsersOperation类有关;Operation包中getResult类、getExpression类,ToolDemo类只与Function类有关;Tests类只用于测试Function的方法,实体类只实现封装,只由Function类和jsp页面调用,类与类之间划归清晰,面向对象编程也大大实现了代码的重用性。

 

    

 

三、【计算模块接口的设计与实现过程】

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

(图片较小,右击图像 ---> 查看图像即可看大图):

 

 

 

四、【计算模块接口部分的性能改进】

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

 

消耗最大的函数:

复制代码
      /** 得到算式,得到答案* 这个方法是把所有的整个式子,算式和结果分别放入三个ArrayList中* 新建树并产生用户获取到数目的算式,分别存放List中* 实现了逐个遍历* *///获取三个listpublic LinkedList<String> createList(int num,int symNum){ GetExpression bTree; for(int i=0;i<num;i++){ //构造树 bTree = new GetExpression(symNum); bTree.buildBTree(); //设置list类里面的expression,result String expression = bTree.toString(); String result = bTree.CalAndVal(); Lists l = new Lists(expression,result); //把expression和result获取出来  Lists.expArr.add(expression); Lists.resArr.add(result); Lists.addArr.add(l.toString()); } return Lists.expArr; }
复制代码

 

 

 

 

 

五、【计算模块部分单元测试展示】

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

复制代码
 1 package Function;
 2 
 3 import org.junit.Test;  4  5 import Entity.Lists;  6  7 public class Tests {  8  9  @Test 10 public void getList(){ 11 Function fun = new Function(); 12 fun.setSybNum(3); 13 Lists list = new Lists(); 14 fun.createList(100,fun.getSybNum()); 15  System.out.println(list.getExpArr()); 16  }//由于没有和前台交互,这时候随便传了几个参数 17 18  @Test 19 public void getFile(){ 20 Function fun = new Function(); 21 fun.ReadFile("C://Users//apple//Desktop//ttt.txt","C://Users//apple//Desktop//www.txt");; 22  }//获取文件 23 }
复制代码

六、【计算模块部分异常处理说明】

 在博客中详细介绍每种异常的设计目标。每种异常都要选择一个单元测试样例发布在博客中,并指明错误对应的场景

java异常主要分为以下这些种类,比较常见的有空指针异常,溢出异常,找不到类,找不到文件

由于我们的项目包含数据库,相对应的数据库操作的异常处理也很多.


 

 

复制代码
   /*
*增加用户
*/
@Testpublic void insertUsers(String nickname ,String password,String email) { Users users = new Users(); try { Class.forName(DRIVER); connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); String sql = "INSERT INTO db_user(nickname,password,email) VALUE(?,?,?)"; ps = connection.prepareStatement(sql); ps.setString(1, nickname); ps.setString(2, password); ps.setString(3, email); ps.execute(); } catch (Exception e) { System.out.println(e.getStackTrace()); } finally { try { connection.close(); ps.close(); } catch (SQLException e) { System.out.println(e.getStackTrace()); } } }
复制代码
复制代码
     /** 读取文件* */@Testpublic void ReadFile(String fromUrl,String toUrl){ try { BufferedWriter bw = new BufferedWriter(new FileWriter(toUrl)); BufferedReader br = new BufferedReader(new FileReader(fromUrl)); String s = null; for(int i=1;i<=100;i++){ s = String.valueOf(Math.random()); bw.write(s); bw.newLine(); } bw.flush(); while((s=br.readLine())!=null){ System.out.println((String)s); System.out.println("下一行"); } bw.close(); br.close(); } catch (IOException e) { e.printStackTrace(); }
复制代码
复制代码
    /*
*查询所有的用户
*/
    @Testpublic List<Users> queryAllUsers() {Connection connection = null;PreparedStatement ps = null; ResultSet rs = null; List<Users> list = new ArrayList<Users>(); try { Class.forName(DRIVER); connection = DriverManager.getConnection(URL, USERNAME, PASSWORD); String sql = "SELECT * FROM db_user"; ps = connection.prepareStatement(sql); rs = ps.executeQuery(); while(rs.next()){ Users users = new Users(); users.setId(rs.getInt("id")); users.setNickName(rs.getString("nickname")); users.setPassword(rs.getString("password")); users.setEmail(rs.getString("email")); list.add(users); } } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); }finally { try { if (rs != null) { rs.close(); } if (ps != null) { ps.close(); } if (connection != null) { connection.close(); } } catch (SQLException e){ e.printStackTrace(); } } return list; }
复制代码

 

七、【界面模块的详细设计过程】

  在博客中详细介绍界面模块是如何设计的,并写一些必要的代码说明解释实现过程。(5')

  我们用的是网页端来展示界面模块,所以主要是html,css,js来实现的界面模块设计,主要分为注册页面、登录页、主页面、做题页面、错题页面,

登录页

主页面

 

 

  做题页面

八、【界面模块与计算模块的对接】
  最为核心的做题页面采用的是jsp代码由主页面homePage.jsp传参到做题页面doYourAnswer.jsp,然后用户输入答案后,通过循环将answer进行判断,判断结束后,记录错题的题号,并通过URL传值进入错题页wrongQuestion.jsp,部分代码如下:

 <form action="doYourAnswer.jsp" method="post"><table><tr><td><input type="text" name="myAnswer"/></td><td><input type="submit" value = "提交"></td><td><%String myAnswer = request.getParameter("myAnswer");String answer = Lists.resArr.get(num);if (myAnswer == answer){out.print(num + "right");}else{out.print(num + "wrong");QuesNum[wrongNum]=num;wrongNum++;}}%></td></tr></table></form><a href="wrongQuestion.jsp?<%for ( int i=0 ;i<=wrongNum;i++ ) {%>re[]=<%=QuesNum[i] %><%}%>&&wrongNum=<%=wrongNum %>">查看错题</a>

九、描述结对的过程

  结对过程:我的队友是杨帆,十分感谢他在本次作业中的帮助,我们两人之前都是主学后台,由于我对前台略懂所以我的代码任务主要是负责页面,另外就是Jsp的页面完成前后台对接,对于用户管理的数据库操作和Java工具类的实现是队友协助完成的。做这个项目时,出现了不少Bug,

  结对照片:

十、【结对编程的优点和缺点】

看教科书和其它参考书,网站中关于结对编程的章节,例如:

http://www.cnblogs.com/xinz/archive/2011/08/07/2130332.html

说明结对编程的优点和缺点。同时指出结对的每一个人的优点和缺点在哪里 (要列出至少三个优点和一个缺点)。(5')

       结对编程的优点:

       1.  取长补短,也许很多时候一个人想不到的东西结合两人的想法也许就能产生非凡的效果

    2.相互学习的机会,使两人共同进步,能促进同学间友好交流

       3.体验合作的快乐

       缺点:有时意见可能会不统一

 

       我的优缺点:

       优点:比较有耐心,坚持做好一件事,善于搜索信息,比较细心 。  

       缺点:有时不断坚持处理事情会稍不灵活。

 

       队友(杨帆)的优缺点:

       优点:认真自信,富有责任心,吃苦耐闹,处理事情比较灵活。

       缺点:比较。。。呃呃呃,感觉没啥毛病,大家一起合作,虽然有时会有一种修复Bug的无力感,但是至少谁也没有相互抱怨过,都是尽自己最大可能去互相帮助。

    

      

十一、【实际花费的时间】

PSP任务内容计划共完成需要的时间(min)实际完成需要的时间(min)
Planning计划 8 10
Estimate估计每个阶段的时间成本,并规划大致工作步骤 8 10
Development开发30004000
 Analysis 需求分析 (包括学习新技术) 60 60
 Design Spec 生成设计文档 40 50
 Design Review 设计复审 (和同事审核设计文档) 40 45
 Coding Standard 代码规范 (为目前的开发制定合适的规 范) 30 40
 Design 具体设计 120 100
 Coding 具体编码 180 200
 Code Review 代码复审 150 150
 Test 测试(自我测试,修改代码,提交修改) 90 90
Reporting报告 200 230
Test Report 测试报告 120 150
Size Measurement 计算工作量 20 20
 Postmortem & Process Improvement Plan 事后总结, 并提出过程改进计划 60 60

 

转载于:https://www.cnblogs.com/liuz100/p/8769857.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/367386.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

amd 安装 linux驱动怎么安装教程,请教,怎么在ubuntu里安装amd显卡驱动

AMD发布新版本时fglrx-updates驱动就会自动升级&#xff0c;但其实并不总是这样&#xff0c;因为Ubuntu的源的更新老是会有延迟。所以&#xff0c;你可以自己安装指定版本的专有驱动。准备开始吧&#xff0c;在终端敲入以下命令&#xff1a;sudo apt-get install build-essenti…

node.js中exports与module.exports的区别分析

前言 关于Node.js中的exports和module.exports&#xff0c;很多时候都比较容易让人混淆&#xff0c;弄不清楚两者间的区别。那么我们就从头开始理清这两者之间的关系。 来源 在开发Node.js应用的时候&#xff0c;很多模块都是需要引入才能使用&#xff0c;但是为什么exports…

Java反射教程

在本教程中&#xff0c;我主要编写一些示例来介绍Java反射可以做什么。 希望它可以给您这个概念的概述。 请留下您的评论以寻求建议。 什么是反射&#xff1f; 简而言之&#xff0c;反射是程序在运行时检查和修改对象的结构和行为的能力。 这种概念有时与内省混合在一起。 自…

NFS网络共享文件系统

1、nfs服务端配置操作 1.1 创建所需的共享目录--源 mkdir /data/rw #rw代表同步的数据可读可写 1.2 对共享目录进行授权 chown -R nfsnobody.nfsnobody /data/rw #非必需&#xff0c;根据业务需求 1.3 修改nfs服务配置文件 vim /etc/exports /data/rw 172.16.1.0/…

国家开放大学形成性考核 统一资料 参考试题

试卷代号&#xff1a;1174 水工钢筋混凝土结构&#xff08;本&#xff09;参考试题 一、选择题&#xff08;每小题2分&#xff0c;共20分&#xff0c;在所列备选项中&#xff0c;选1项正确的或最好的作为答案&#xff0c;将选项号填入各题的括号中&#xff09; 1.钢筋混凝土结…

两个向量之间的夹角公式_向量的内积

向量的内积也叫向量的数量积、点积。我们定义两个向量的内积是一个数: 其中 是这两个向量的夹角。 对于向量的内积,最重要的一个结论是: 定理1:两向量垂直的充分必要条件是它们的内积为 0,即 这个定理我们几乎不用证明了,因为从定义来看,如果两个向量都不零向量,则只能…

Go strings.Builder

Go strings.Builder 字符串拼接操作优化 最开始的时候&#xff0c;可能会使用如下的操作&#xff1a; package mainfunc main() {ss : []string{"sh","hn","test",}var str stringfor _, s : range ss {str s}print(str) }与许多支持string类型…

springcloud 入门 10 (eureka高可用)

eureka高可用: 说白了&#xff0c;就是加一个实例作为原实例的备份&#xff0c;然后一起对外提供服务。这样可以保证在一台机器宕机的时候&#xff0c;整个系统不会死掉。保证其继续对外服务。 eureka的集群化&#xff1a; 服务注册中心Eureka Server&#xff0c;是一个实例&am…

为什么REST如此重要

这篇文章致力于REST&#xff0c;一种塑造Web服务的体系结构风格&#xff0c;以及IT历史上最容易被误解的概念。 这篇文章针对的是那些正在设计Web服务api的人&#xff0c;他们并未完全了解REST的实际含义。 我想给你个主意。 这篇文章也发给了那些想知道REST意味着什么的人&…

string类有可以调换方向的函数吗_String类中常用的操作

一、获取:1、获取字符串的长度(注意是方法&#xff0c;不是跟数组的属性一样的)int length();1 public static void getLength(){2 String s "java01";3 int len s.length();4 System.out.println(len);5 }2、根据位置&#xff0c;获取该位置的那一个字符(只能是单…

你真的懂js获取可视区宽高吗

可能你会觉得获取可视区宽高不是很简单吗 原生js获取高度不就是就window.innerHeight一句话的事&#xff0c;可是真的这么简单吗 来看个测试页面,如果页面带有横向纵向的滚动条&#xff0c;我们打印出各个高度进行查看对比 顺便你也可以看看document.body和document.documentEl…

工作第七天

今天完成了一个简易的oauth服务器&#xff0c;通过login跳转到oauth保存uri和client_id&#xff0c;等待用户登录判断是否能get到user同时判断用户名和密码是否匹配&#xff0c;重定向到uri同时增加code参数&#xff0c;通过判断是否有code重定向回oauth&#xff0c;如果有code…

网上linux实验平台,Linux操作系统实验教程

第一部分 Linux操作系统基本原理.第1章 Linux操作系统简介1.1 Linux的渊源和发展简史1.2 Linux的基本特性1.3 Linux内核的开发模式与内核版本号1.4 Linux发行版介绍1.5 Linux内核源代码组织结构1.6 学习Linux的辅助软件介绍第2章 Linux的进程管理2.1 进程与进程描述符2.2 进程状…

詹金斯的Maven报告

代码质量是一个敏感的话题。 它会影响您的维护成本以及客户满意度。 更不用说您的开发人员使用代码的动力。 谁想要修复难看的代码&#xff0c;对吗&#xff1f; 讨论代码质量总是需要事实和数字&#xff01; 因此&#xff0c;这是一个简短的教程&#xff0c;介绍如何创建一些…

python实现矩阵叉乘_矩阵乘法的纯Python实现 | 离开Python库!!

点击关注我哦一篇文章带你了解矩阵乘法的纯Python实现在《这篇文章》中&#xff0c;我们有简单提到“矩阵乘法”的相关知识&#xff0c;如果你不记得了&#xff0c;可以复习一下这张图片。想起来了没&#xff1f;本篇文章将深入探讨在没有机器学习库的情况下如何从零实现矩阵乘…

Github Actions:再次改变软件开发

本文转自 FEPulse 公众号&#xff08;微信搜索 FEPulse&#xff0c;精选国内外最新前端资讯&#xff0c;为你把握前端脉搏&#xff09;。 Github Actions 是 GitHub Universe 大会上发布的&#xff0c;被 Github 主管 Sam Lambert 称为“再次改变软件开发”的一款重磅功能&…

为别人软件加入广告或者密码(特别思路)

洪雨的的这款软件比较奇特&#xff0c;是忽然想到一个思路&#xff0c;然后实现了一下。 exe文件都有一个很有趣的地方&#xff0c;只要内部完整&#xff0c;就可以运行。比如一个exe文件&#xff0c;我们运行的时候&#xff0c;电脑知道他是exe所以可以直接运行。假如洪雨将它…

c free语言自定义函数,C 语言free函数的工作原理

今天在网上看到了这样一个问题&#xff0c;“如果malloc 了一块字符串的内存&#xff0c;然后&#xff0c;它改变了这个字符串的大小&#xff0c;问会不会有一部分内存没有被释放掉。”这个问题&#xff0c;以前的确没有仔细想过。当然&#xff0c;我觉得是肯定会释放掉的&…

Django 错误跳转页面

原网站&#xff1a;https://blog.csdn.net/goupper1991/article/details/50736826 django404&#xff0c;500错误自定义页面&#xff1a; 将 改为 1.修改settings文件DEBUG FalseALLOWED_HOSTS [127.0.0.1, localhost]或者ALLOWED_HOSTS [*]2.配置urls文件from django.conf.…

ElasticSearch-Hadoop:从Hadoop到ElasticSearch的产品视图计数索引和客户顶部搜索查询...

这篇文章涵盖了如何使用ElasticSearch-Hadoop从Hadoop系统读取数据并在ElasticSearch中对其进行索引。 它涵盖的功能是在最近n天中为每个客户的产品浏览量计数和热门搜索查询编制索引。 分析的数据可以进一步在网站上使用&#xff0c;以显示最近浏览过的客户&#xff0c;产品浏…