合作者:201631062625 201631062127

代码地址:https://gitee.com/yzpdegit/ts

本次作业链接:https://www.cnblogs.com/yang-01/p/9806459.html

1.结对的PSP表格

PSP2.1

PSP阶段

预估耗时

(分钟)

实际耗时

(分钟)

Planning

计划

60

55

· Estimate

· 估计这个任务需要多少时间

1200

900

Development

开发

110

134

· Analysis

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

60

80

· Design Spec

· 生成设计文档

50

70

· Design Review

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

60

100

· Coding Standard

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

60

50

· Design

· 具体设计

100

130

· Coding

· 具体编码

90

120

· Code Review

· 代码复审

30

50

· Test

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

60

50

Reporting

报告

40

60

· Test Report

· 测试报告

30

30

· Size Measurement

· 计算工作量

10

10

· Postmortem & Process Improvement Plan

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

25

25

合计

785

934

2.代码复审

(1)发现的问题:

    1.组合的时候发现需要改动的代码很大,有很多累赘的,不需要的或者有的完全是多余的,改起来非常的繁琐,有的方法组合起来有一定问题
2.组合好以后测试的数据自己的可以在自己的这边适用,但是对方的测试数据在自己这边就不适用
3.代码的风风格上还是有部分的差距,对方有的代码有点问题看不明白,需要一起讨论后才能解决

(2)分析:

      根据这些问题我觉得最主要的是团队合作的意识还是不怎么强烈,以前团队合作的时候是三个人以上或者更多,所以要讨论的次数很多,当两个人合作的时候发现有一点随意,另一方面,在一开始编程的时候讨论的代码规范还不够完善导致组合调试的时候或多或少会出现一些问题,还有就是功能的分工不是很明确,每个功能对应一个接口这方面做的不是太好,耦合度有点高

(3)解决办法:

       我觉得能够解决的最好办法就是首先要形成一个很好的编程规范并且统一起来,另外,一起开发的时候代码的耦合度一定要低,每个方法对应的功能一定要单一,不然的话会导致代码的逻辑性混乱,另外还要加强与团队成员的沟通交流

3.代码设计

(1)功能和结构



主类:Main 功能:实现对输入的命令的判断,将命令分解为字符串数组并传入与之对应的函数中

UI界面:UI 功能:实现高级功能,图形化界面,单独处理一个命令

工具类:tool 功能:提供接口给主类进一步判读字符串,并且将一些多次出现的方法封装起来

方法类:function 功能:执行命令,并且将得到的数据保存在该类中

(2)类的关系结构图

(3)流程图

4.代码说明

代码注释:

在这段代码中的主要功能是分辨高级和初级扩展功能的分割,同时对命令初步分割有没有指定存放和过滤文本

if(array.length>2)
{
if(tool.compare(array,"-e")&&tool.compare(array,"-o"))//都存在
{
file=new File(array[tool.getPosition(array,"-o")+1]);
if(file.exists())
{
file.delete();
}
tool.setCount(array,array[array.length-5]);
}else if(tool.compare(array,"-e")||tool.compare(array,"-o"))//只存在一个
{
if(tool.compare(array,"-o"))
{
file=new File(array[tool.getPosition(array,"-o")+1]);
if(file.exists())
{
file.delete();
}
}
else
{
file=new File("result.txt");
if(file.exists())
{
file.delete();
}
}
tool.setCount(array,array[array.length-3]); }else//都不存在
{
file=new File("result.txt");
if(file.exists())
{
file.delete();
}
tool.setCount(array,array[array.length-1]);
}
}else
{
UI u=new UI();
u.createAndShowGUI();
} }

代码注释

这个方法的主要作用是处理递归,将所有要递归的文本文件取出来后挨个执行

public static void getPath(File file1,String[] array,function fun,String path,int count) throws IOException//是否解析子目录
{
File[] file=file1.listFiles();
for(File f: file)
{
if(f.isDirectory())
{
getPath(f,array,fun,path,count);
}
else
{
if(Pattern.matches(path,f.getName()))
{
ready(array, f.getAbsolutePath(), fun,count);
read(array, fun,f.getName());
}
}
}
}

代码注释

将 停词表所有的单词取出来再去执行命令过滤相同的单词

   public static void ready(String[] array,String path,function f,int count) throws IOException {
count--;
f.init();
if(compare(array,"-e"))
{
String path1=array[getPosition(array,"-e")+1];
InputStreamReader input1=new InputStreamReader(new FileInputStream(path1));
BufferedReader br1=new BufferedReader(input1);
List<String> list1=new ArrayList<>();
while (br1.read() != -1) {
String s = br1.readLine();
if(s!=null)
{
String[] s1 = s.split(",| ");
for (int j = 0; j < s1.length; j++)
{
if (!s1[j].equals(""))
{
list1.add(s1[j]);
}
}
}
}
input1.close();
for(;count>0;count--)
{
f.readCommand(array[count],path,list1);
}
}else
{
for(;count>0;count--)
{
f.readCommand(array[count],path,null);
}
}
}

代码注释

执行-w命令将文本一行行读入到字符串,再将其按照单词的划分规则分成字符串数组,判断是否要和停词表比较,最后统计数目

public String commandW(InputStreamReader input,BufferedReader br,List<String> list1) throws IOException {
List<String> list=new ArrayList<>();
while(br.read()!=-1)
{
String s=br.readLine();
if(s!=null) {
String[] s1 = s.split(",| ");
for (int i = 0; i < s1.length; i++) {
if (!s1[i].equals("")) {
list.add(s1[i]);
word++;
}
}
}
}
if(list1!=null) {
String[] str=(String[])list.toArray(new String[list.size()]);
String[] str1=(String[])list1.toArray(new String[list1.size()]);
for(int i=0;i<str.length;i++)
{
for(int j=0;j<str1.length;j++)
{
if(str[i].equalsIgnoreCase(str1[j]))
{
word--;
break;
}
}
}
}
return "单词数"+word;
}

代码注释

执行-a命令,将所有数据从文本中读取出来,按照指定的条件进行统计

public void commandA(InputStreamReader input,BufferedReader br) throws IOException {
int code1=0,zhushi=0,empty=0;
while(br.read()!=-1)
{
int k=0,m=0;
String string=br.readLine();
if(string!=null) {
String[] s1 = string.split("//");
char s[] = s1[0].toCharArray();
for (int i = 0; i < s.length; i++)
{
if (s[i] > 32 && s[i] < 128)
{
k++;//读取到代码行的一个合法字符
m = i;//保存改合法字符位置
}
}
if (s.length == 0)
{
if (s1.length == 1)
empty++;
else
zhushi++;
}
else
{
if (k > 1)
code1++;
if (k == 1 && s[m] > 32 && s[m] < 127)
{
if (s1.length == 1)
empty++;
else
zhushi++;
}
if (k == 0) empty++;
}
}
}
code=code1+"/"+empty+"/"+zhushi;
}

初级功能:wc.exe -l -w -c 1.txt

扩展功能:wc.exe -c -w -l -a -s *.c -e 1.txt -o end.txt

高级功能:wc.exe -x

5.总结

    通过这次和队友一起合作完成了项目感触良多,虽然这个项目的工作量不大并且难度系数相对而言也比较简单,但是重要的并不是结果而是过程,我学到的并不是技术方面的能力,而是团队开发合作的能力,一个人的技术再强,给一个很大型的项目也不可能完成的,但是人多就会很容易完成,以前的团队开发不怎么注重编程规范,以及代码里类的名字,接口的设计等等,导致吃了很大的亏,以前的代码虽然代码完成但是和队友对接一旦出现问题就很麻烦,双方都看不懂别人的代码,想要改错难上加难,出了代码规范的约束还有就是团队开发工具git了,以前的团队项目都是在QQ上面互相传播,局限很大,不太好清楚别人的开发进度和文档的改动情况,但是利用这个工具的话解决了开发中的很多难题,非常的实用。总而言之,这次的学习让我明白了很多实际开发要注意的事项,以前的开发态累了。

wordcontent结对编程的更多相关文章

  1. 结对编程--基于android平台的黄金点游戏

    游戏内容: 阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫“黄金点”的游戏: N个同学(N通常大于10),每人写一个0~100之间的有理数 (不包括0或1 ...

  2. 结对编程-地铁续(有种上个学期OO的既视感)

    我们组比较特殊..三人结对 github:https://github.com/qingchanghan/WPFUI_Metro po一张照片: 石浩然,韩青长.陈彦吉 (台式机真的很高端,分屏贼帅) ...

  3. 结对编程项目——四则运算vs版

    结对编程项目--四则运算vs版 1)小伙伴信息:        学号:130201238 赵莹        博客地址:点我进入 小伙伴的博客 2)实现的功能: 实现带有用户界面的四则运算:将原只能在 ...

  4. 关于软件工程结对编程作业 PairProject : Elevator Scheduler(电梯调度算法的实现与测试)的总结

    1)结对编程队友 1106xxxx 张扬 1106xxxx 杨军 其中,此项目的编程实现主要由前者完成. 2)关于结对编程 结对编程的优点: 最直接的一点:在结对编程中,由于有另一个人在你身边和你配合 ...

  5. 结对编程—黄金点游戏WinForm单机版

    本小游戏场景来自邹欣老师的<移山之道>一书: "阿超的课都是下午两点钟,这时班上不少的同学都昏昏欲睡,为了让大家兴奋起来,阿超让同学玩一个叫"黄金点"的游戏: ...

  6. Week4 结对编程

    1.照片 1.1  结对编程参与者:李文涛.黎柏文 1.2  展示照片 2.结对编程的优点&缺点 2.1 优点 2.1.1.两人分工合作,减少了工作量 2.1.2.结对编程的伙伴往往能提供不同 ...

  7. 结对编程——关于Fault、Error、Failure程序设计

    一.问题描述:         构造程序,分别是:         •不能触发Fault         •触发Fault,但是不能触发Error         •触发Error,但是不能产生Fai ...

  8. GUI、模块化与结对编程(homework-03)

    摘要: 在本次作业博客里,我将主要阐述作业3的收获.作业3表面是将之前的程序转换为图形界面(之前程序见http://www.cnblogs.com/shone/p/3348372.html),然而本质 ...

  9. BJDP结对编程活动

    7月21日参与了 BJDP北京的活动 在北京首次参与能够参与动手编程活动,感觉挺不错的. 本次活动共有三项内容 1.      金锐分享单元测试的Mocking技术,20 mins 2.      伍 ...

随机推荐

  1. 郑晔谈 Moco 框架的开发:写一个好的内部 DSL ,写一个表达性好的程序

    作者:张龙 出处:http://www.infoq.com/cn/news/2013/07/zhengye-on-moco 郑晔谈Moco框架的开发:写一个好的内部DSL,写一个表达性好的程序 作者  ...

  2. IOS - [UIDevice currentDevice] name/model/localizedMode/systemName/systemVersion...../userInterfaceIdiom

    + (UIDevice *)currentDevice; @property(nonatomic,readonly,retain) NSString    *name;              // ...

  3. 题解 P3377 【【模板】左偏树(可并堆)】

    所谓的左偏树,是一种可并堆的实现. 这种数据结构能够支持高效的堆合并,但是不支持查询节点等操作,因此不同于平衡树,它的结构是不平衡的. 左偏树满足如下两条基本性质: 1. 堆的性质 这也就是说左偏树每 ...

  4. 关于nodejs的线程模型可以看这篇文章

    虽然还是有一些没有讲全,但是整体还是讲的很不错的. http://www.ruanyifeng.com/blog/2014/10/event-loop.html

  5. 求第K大的数字

    除了用最大堆(求最小的K个数)或最小堆(求最大的K个数) 可以用partition,然后直到返回index为k为止.参数可以是实际下标.然后返回index,就是partition的pivot的位置.

  6. POJ 1286

    Burnside定理. 可以用Euler函数优化. #include <iostream> #include <cstdio> #include <cstring> ...

  7. EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER

    EMERGENCY! EUREKA MAY BE INCORRECTLY CLAIMING INSTANCES ARE UP WHEN THEY'RE NOT. RENEWALS ARE LESSER ...

  8. 【MFC设置静态文本框背景为透明】

    视图类中加入OnCtlColor()函数: IDC_STATIC1为静态文本框ID HBRUSH CAngleView::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT n ...

  9. poj2965 The Pilots Brothers&#39; refrigerator(直接计算或枚举Enum+dfs)

    转载请注明出处:http://blog.csdn.net/u012860063? viewmode=contents 题目链接:http://poj.org/problem? id=2965 ---- ...

  10. 使用wpa_supplicant连接WIFI

    让树莓派可以开机就连接制定的wifi, 可以通过wpa_supplicant来实现. 在 /etc/wpa_supplicant 下写一个配置文件: wpa_supplicant.conf 内容如下: ...