(编程和软件工程作业系列)

实践最简单的项目:WC

实践是理论的基础和验证标准,希望读者贯彻“做中学”的思想,动手实现下面的项目,并和别人的成绩相比较,分析产生差距的原因。

1. 实现一个简单而完整的软件工具(源程序特征统计程序)。
2. 进行单元测试、回归测试、效能测试,在实现上述程序的过程中使用相关的工具。
3. 进行个人软件过程(PSP)的实践,逐步记录自己在每个软件工程环节花费的时间。
4. 使用源代码管理系统 (GitHub,  Coding.net, 等); 并使用项目管理系统,练习使用其中的事件跟踪功能(选用TFS,Bugzilla 或者Trac, 等工具,了解其原理)。
5. 进行最简单的项目管理系统的定制,这个留给一部分能力较强的同学参与。(选用TFS 或别的项目管理系统,了解原理并实现定制。)

1 WC 项目要求

wc.exe 是一个常见的工具,它能统计文本文件的字符数、单词数和行数。这个项目要求写一个命令行程序,模仿已有wc.exe 的功能,并加以扩充,给出某程序设计语言源文件的字符数、
单词数和行数。当然,我们假设读者都已经通过之前的练习,建立了源代码控制工具并有基本的实践经历。
实现一个统计程序,它能正确统计程序文件中的字符数、单词数、行数,以及还具备其他扩展功能,并能够快速地处理多个文件。
具体功能要求:
程序处理用户需求的模式为:

wc.exe [parameter] [file_name]

基本功能列表:

wc.exe -c file.c     //返回文件 file.c 的字符数
wc.exe -w file.c //返回文件 file.c 的词的数目
wc.exe -l file.c //返回文件 file.c 的行数

扩展功能:
    -s   递归处理目录下符合条件的文件。

-a   返回更复杂的数据(代码行 / 空行 / 注释行)。

-f   说明这个文件是哪一种语言的。  例如: C/Java/C++/JavaScript/Python/HTML,  如果看不出属于任何语言, 就输出 TXT

空行:本行全部是空格或格式控制字符,如果包括代码,则只有不超过一个可显示的字符,例如“{”。

代码行:本行包括多于一个字符的代码。

注释行:本行不是代码行,并且本行包括注释。一个有趣的例子是有些程序员会在单字符后面加注释:

} //注释
在这种情况下,这一行属于注释行。

[file_name]: 文件或目录名,可以处理一般通配符。

高级功能:

-x 参数。这个参数单独使用。如果命令行有这个参数,则程序会显示图形界面,用户可以通
过界面选取单个文件,程序就会显示文件的字符数、行数等全部统计信息。

需求举例:
  wc.exe -s -a *.c

返回当前目录及子目录中所有*.c 文件的代码行数、空行数、注释行数。

2. 工作的细分

正如谚语所说:不能一口吃成个胖子。罗马不是一天建成的。同样,一个功能完备的程序也不是一蹴而就的。在这里,我们讨论如何把大任务划分为可操作的小任务,以及任务的次序。
读完项目的要求后,首先请估计完成整个项目需要多少时间?把估计记下来,并且写成PSP 的形式。其次,如何逐步分解一个项目的需求?在这个项目中,各种需求已经通过各种参数表达得比较清楚了。

基本功能
扩展功能
高级功能

详细地了解了需求后,我们再估计需要的时间并记录 [ 估计值2]。
最后,列出各类功能下面的详细需求。

基本功能

支持 -c
支持 -w
支持 -l

扩展功能

支持 -s -f -a 参数
支持各种文件的通配符(*,?)

高级功能

基本的Windows GUI 程序操作
支持通过图形界面选取文件
支持通过图形界面展现文件的信息

请在这个时候把每一个详细功能所需的时间列出来,然后再把它们相加,得到 [ 估计值 3]。

同学相互之间比较估计值1、估计值2 和估计值3,看看差距是多少,有什么规律?对此有兴趣的同学请参看本书第8 章“计划和估计”一节。

3 如何保证质量— 回归测试

如何保证在加入新功能的过程中,已有的功能可继续工作?这就要求我们有一套标准的测试来保证基本功能的正确性。
写这样的程序,用项目本身的源文件来做测试应该是比较酷的,但是源文件本身在不断地变动,并不是一个很好的测试样本,我们要建立起一系列测试文件。如下:

空文件
只有一个字符的文件
只有一个词的文件
只有一行的文件
一个典型的 C 语言源文件
一个典型的 Java 语言源文件
一个典型的 HTML 语言源文件
一个典型的 C# 语言源文件

一个典型的 JavaScript 语言源文件

如何为这个程序做有效的测试,有以下几种方法,自动化程度由低到高。

1. 手动测试,手工比较。
2. 要做到不断地测试,可以把WC 的主要功能封装成一个类,然后测试程序调用这一个类的主要函数,得出结果并与标准作比较。
3. 更进一步,把测试文件和正确的测试结果保存在文件中,测试驱动程序只要比较测试的输出和标准结果就能得出答案。
4. 再进一步,把自动构建脚本和构建验证测试(Build Verification Test)结合起来。每一次构建之后,就自动运行测试,然后记录出现的Bug。
了解测试的需求后,每人估计需要的时间并记录 [估计值4]。

4 标准测试集,正确性和速度评比

既然大家的程序都写得差不多了,那就拉出来遛遛,看看是骡子是马。以子目录的形式把目前所有同学的程序都集中在一个总的测试目录下,作为测试集合。然后大家看看各自的程序要花
多少时间才能正确并且较快地完成任务。 在这里,同学们要记下满足了标准测试集之后,每人实际花费的时间 [ 实际值],并且按照本章PSP 的表格统计自己在软件开发的各个阶段所花费的时间。

5 扩展,从源代码服务器上读文件

请看这个文章,你能实现类似的功能么? https://www.ybrikman.com/writing/2018/08/12/the-10-to-1-rule-of-writing-and-programming/

软件工程作业 - word count的更多相关文章

  1. 软件工程作业——Word Counter

    github地址 https://github.com/Pryriat/Word_Counter 项目说明 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数.这个项目要求写一个命 ...

  2. Java --本地提交MapReduce作业至集群☞实现 Word Count

    还是那句话,看别人写的的总是觉得心累,代码一贴,一打包,扔到Hadoop上跑一遍就完事了????写个测试样例程序(MapReduce中的Hello World)还要这么麻烦!!!?,还本地打Jar包, ...

  3. 个人项目作业-Word Count

    个人项目作业 1.Github地址 https://github.com/CLSgGhost/SE_work 2.项目相关需求 wc.exe 是一个常见的工具,它能统计文本文件的字符数.单词数和行数. ...

  4. Hive Word count

    --https://github.com/slimandslam/pig-hive-wordcount/blob/master/wordcount.hql DROP TABLE myinput; DR ...

  5. mac上eclipse上运行word count

    1.打开eclipse之后,建立wordcount项目 package wordcount; import java.io.IOException; import java.util.StringTo ...

  6. MapReduce工作机制——Word Count实例(一)

    MapReduce工作机制--Word Count实例(一) MapReduce的思想是分布式计算,也就是分而治之,并行计算提高速度. 编程思想 首先,要将数据抽象为键值对的形式,map函数输入键值对 ...

  7. Word Count作业

    Word Count作业 一.个人Gitee地址:https://gitee.com/Changyu-Guo 二.项目简介 该项目主要是模拟Linux上面的wc命令,基本要求如下: 命令格式: wc. ...

  8. Word Count

    Word Count 一.个人Gitee地址:https://gitee.com/godcoder979/(该项目完整代码在这里) 二.项目简介: 该项目是一个统计文件字符.单词.行数等数目的应用程序 ...

  9. [Hive_add_6] Hive 实现 Word Count

    0. 说明 Hive 通过 explode()函数 和 split()函数 实现 WordConut 1. Hive 实现 Word Count 方式一 1.1 思路 将每一行文本变为 Array 数 ...

随机推荐

  1. python基础-函数(9)

    一.函数的介绍 如果在开发程序时,需要某块代码多次,但是为了提高编写的效率以及代码的重用,所以把具有独立功能的代码块组织为一个小模块,这就是函数 函数的语法格式: def 函数名(): 函数的功能代码 ...

  2. 以前的博客内容迁至CSDN,博客名不变,以后博客将在两个平台同步更新

    为了更好的利用博客园和csdn这两个博客家园,今天把博客园中的内容迁至csdn,博客名称还是使用cooldream2009,以后的文章将同步在博客园和csdn发表,特此声明.

  3. Ubuntu 安装yii2 advanced版 遇到的坑

    1.安装 Composer https://www.yiichina.com/doc/guide/2.0/start-installation通过 Composer 安装 curl -sS https ...

  4. 《前端之路》之二:数据类型转换 && 隐式转换 || 显式转换

    目录 02:数据类型转换 && 隐式转换 || 显式转换 02:数据类型转换 && 隐式转换 || 显式转换 在上一个章节中,我们介绍了 JavaScript 的基本的 ...

  5. Ubuntu:命令行下浏览网页

    前述 兴起,试一下不用图形化界面浏览 安装w3m 直接进入root账号 apt-get install w3m 检验是否成功 w3m www.baidu.com 就这样成功的进入baidu了,纯文本模 ...

  6. [翻译] EF Core in Action 关于这本书

    Entity Framework Core in Action Entityframework Core in action是 Jon P smith 所著的关于Entityframework Cor ...

  7. Python编程从入门到实践笔记——变量和简单数据类型

    Python编程从入门到实践笔记——变量和简单数据类型 #coding=gbk #变量 message_1 = 'aAa fff' message_2 = 'hart' message_3 = &qu ...

  8. springcloud情操陶冶-springcloud config server(一)

    承接前文springcloud情操陶冶-springcloud context(二),本文将在前文基础上浅析下ConfigServer的工作原理 前话 根据前文得知,bootstrapContext引 ...

  9. DSAPI 字符串和文件转Md5字符串

    方法列表: 字符串转MD5字符串(ByVal 要转换的字符串 As String, Optional 转换格式 As MD5格式 = MD5格式.小写32位) As String 文件转MD5字符串( ...

  10. DSAPI.网络.网卡信息属性表

    DSAPI.网络.网卡信息属性表 其中,带有ReadOnly的属性只可读不可改,不带ReadOnly的属性即可读也可直接修改,如IP地址,Mac地址等 丢弃接收数据包数: 0 丢弃发送数据包数: 0 ...