寒假作业2/2

|这个作业属于哪个课程|2021春软件工程实践|W班 (福州大学)|
| :-----| :---- | :---- |
|这个作业要求在哪里|寒假作业2/2|
|这个作业的目标|1.阅读《构建之法》并提问;2.完成词频统计个人作业|

目录:

1. 任务一

2. 任务二

1.任务一:阅读构建之法并提问

1.关于两人合作

我一直觉得代码要自己一个人完成,因为只有自己的代码自己才能看的懂,想到要开发大型项目时,那么多的命名,每个开发人员都要记住别人的命名方式,比如有些人喜欢全写有些喜欢简写。虽说代码规范是一定的,但是多人合作甚至是百人合作难免会出现类似的困难。这究竟是怎么解决的?

2.关于面向对象分析

自从上了这门课我就十分纳闷,同样是涉及多人方面。课堂上每个人画的图都是不一样的,每个人都有自己的考量,但是却要合作一起做项目的时候,难免会出现两人之间的代码没办法完美匹配。甚至是类的想法都有区别,特地弄这种容易出现分歧的构思方式并且还难想到特别是大项目究竟能不能起到加快开发等作用?

3.关于结队

第四章讲到两人合作的不同阶段,但是我想也是之前有想过的,两个人一起编程会不会出现程序基本都由一个人完善的情况。实力比较弱的看不出来的往往都会被另一个大佬看出来,最后代码的完善会不会直接把实力较差的人的代码基本否决,从而编程“一个人编程”的情况。

4.还是结队

第四章的不同阶段中的磨合,让我总结之前的又想到一个问题,自己的代码和别人代码的不同,在开发较小的项目时,会不会出现开发效率不如个人开发的情况。

5.关于PSP表格

第八章的计划和估计,在开始编程之前就计划好自己要在多长时间内完成,但事实上编程是偶尔遇到的小问题都可能拖延你甚至半天时间,在这种编程时间基本无法确定的情况下,编写这个PSP表格究竟有什么作用?督促自己?

2.任务二:WordCount编程

项目地址

+ hear

PSp表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 20 30
• Estimate • 估计这个任务需要多少时间 20 30
Development 开发 240 300
• Analysis • 需求分析 (包括学习新技术) 120 120
• Design Spec • 生成设计文档 30 40
• Coding Standard • 代码规范 (为目前的开发制定合适的规范) 30 30
• Design • 具体设计 60 90
• Coding • 具体编码 180 240
• Test • 测试(自我测试,修改代码,提交修改) 120 180
Reporting 报告 70 80
• Test Repor • 测试报告 30 40
• Size Measurement • 计算工作量 10 30
• Postmortem & Process Improvement Plan • 事后总结, 并提出过程改进计划 10 20
合计 330 410

解题思路:

根据题目要求,每个模块分开解决。一个操作对应一个方法放进一个类中。
分别为:打开文件、读取文件、计算字符、计算行数、计算单词数、保存单词并排序、文件写入。

  • 关于文件操作没什么值得注意的,在文件开启失败的时候加入了控制台的提醒。
  • 计算字符:只要把文件字符读取遍历即可。因为中文不纳入其中,因此加入了字符范围在0~127的条件。
  • 行数计算:用缓冲流按行读取,去掉非有效行即可
  • 计算单词总数数:自己写了一个判断单词的条件,用split分割空格,将分割出来的词语变为小写并存入数组中,计算数组大小。并在这一步操作创建map,将符合单词条件的词语存入map
  • 单词排序和计算:实现构造好了map。因为排序条件有两个,单词和数量,因此将map转为列表list。重载比较器对列表list里的单词进行排序,最后输出前十个。

代码编程规范

+ hear

设计与实现过程

  • 文件操作:读取文件output存在时切打开成功,在input不存在时自动创建input否者操作失败。
        if(operable&&!writefile.exists())
        {
            boolean temp=writefile.createNewFile();
            if(temp) {
                System.out.println("输入文件不存在,已创建\n");
            }
            else {
                System.out.println("输入文件不存在,创建失败\n");
                operable=false;
            }
        }
  • 字符读取:事先把文件内容读入缓冲流并保存到str中计算str的字符数。
public void CharsNumberCount()
    {
        charnum=0;
        char[] ch = str.toString().toCharArray();
        for(int i = 0; i < ch.length; i++) {
            if(ch[i] >= 0 && ch[i] <= 127) {
                charnum++;
            }
        }
    }
  • 行数读取:用readline获取所有行数,并减去无效行
public void LinesNumberCount() throws IOException {
        reader = new BufferedReader(new FileReader(readfile));
        String line;
        while((line = reader.readLine()) != null)
        {
            if(!line.equals("") )
            {
                linenum++;
            }
        }
    }
  • 单词判断:判断单词由简单的if语句组成,并且为了防止重复读取在这一步中将单词保存进map,不存在直接put,存在则key值加一
for(int i=0;i<str.length;i++)
                {
                    if(str[i].length()>3&&str[i].charAt(0)>'9'&&str[i].charAt(0)>'0')
                    {
                        wordnum++;
                        if(map.get(str[i])==null){
                            map.put(str[i],1);
                        }
                        else{
                            map.put(str[i],map.get(str[i])+1);
                        }
                    }
                }
  • 单词排序:重写比较器compare,先判断单词出现频率再比较单词本身
list = new ArrayList<Map.Entry<String,Integer>>((Collection<? extends Map.Entry<String, Integer>>) map.entrySet());
        Collections.sort(list,new Comparator<Map.Entry<String,Integer>>() {
            public int compare(Map.Entry<String, Integer> o1,
                               Map.Entry<String, Integer> o2) {
                if(o1.getValue()-o2.getValue()!=0)
                {
                    return o2.getValue()-o1.getValue();
                }
                else {
                    return o1.getKey().compareTo(o2.getKey());
                }
            }
        });

优化改进思路:

运用缓冲流,尽量减少读取文件的次数。
计算单词的方法中混入了将单词存入数组的步骤,虽说这是为了防止重复执行读取操作。或者也可以引入一个判断的参数,可选择是否执行保存单词到map的操作。但似乎由不规范。。。

单元测试:代码如下

static public void main(String arg[]) throws IOException {
        Lib wc=new Lib();
        wc.SetPath("output.txt","input.txt");
        wc.Open();
        wc.Read();
        wc.CumberCount();
        wc.WordsNumberCount();
        wc.linesNumberCount();
        wc.WordSort();
        wc.show();
    }
  • 整体测试几个空缺的部分分别是判断语句跳过和另一个开发过程中用于在控制台输出的show方法没有执行

异常

在打开文件操作中加入了文件是否存在的判断,并在控制台中输出异常。

心得总结

  • 第一次使用git因为自己英语水平很差,所以对使用git十分抵触。导致一度拖拉最终无法在deadline前提交。尽管如此在学会使用git之后心里还是挺高兴的。
  • 久违的又用java写了一次程序,本来打算用数组存储并排序单词列表,但在参考了别人的作业后,自己上网学习,掌握了map和map相关的排序重载。这是我一开始没想到的。
  • 在写这个作业之前重来没有接触过代码覆盖率,也不知道这东西是干嘛的。如今清楚了。
  • 以前从来没有特别注意过自己代码的书写风格,此次作业完成后,自己的代码风格也确定了,后续的程序编写也会保持下去。
posted @ 2021-03-07 19:10  要记得吃饭啊  阅读(135)  评论(10编辑  收藏  举报