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

实践最简单的项目: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. 吴恩达机器学习笔记61-应用实例:图片文字识别(Application Example: Photo OCR)【完结】

    最后一章内容,主要是OCR的实例,很多都是和经验或者实际应用有关:看完了,总之,善始善终,继续加油!! 一.图像识别(店名识别)的步骤: 图像文字识别应用所作的事是,从一张给定的图片中识别文字.这比从 ...

  2. 磁盘阵列raid类型及含义

    raid0: 多块盘同时进行读写: 优点是读写效率高,缺点是没有数据冗余: 最少需要两块盘. raid1: 将数据盘都做镜像: 优点是有数据冗余:缺点是读写效率低,磁盘利用率低: 最少需要两块盘. r ...

  3. js判断参数是否为非数字

    isNaN() 函数用于检查其参数是否是非数字值.

  4. .NET Core微服务之基于MassTransit实现数据最终一致性(Part 1)

    Tip: 此篇已加入.NET Core微服务基础系列文章索引 一.预备知识:数据一致性 关于数据一致性的文章,园子里已经有很多了,如果你还不了解,那么可以通过以下的几篇文章去快速地了解了解,有个感性认 ...

  5. PopupMenuDemo【popupMenu的简单使用】

    版权声明:本文为HaiyuKing原创文章,转载请注明出处! 前言 本文主要将PopUpMenu和ToolbarDemo[Toolbar作为顶部导航栏的简单使用]进行搭配使用,实现toolbar的溢出 ...

  6. 【Python3爬虫】斗鱼弹幕爬虫

    在网上找到了一份斗鱼弹幕服务器第三方接入协议v1.6.2,有了第三方接口,做起来就容易多了. 一.协议分析 斗鱼后台协议头设计如下: 这里的消息长度是我们发送的数据部分的长度和头部的长度之和,两个消息 ...

  7. Angular动态创建组件之Portals

    这篇文章主要介绍使用Angular api 和 CDK Portals两种方式实现动态创建组件,另外还会讲一些跟它相关的知识点,如:Angular多级依赖注入.ViewContainerRef,Por ...

  8. 基于Log4Net本地日志服务简单实现

    背景 项目开发中,我们或多或少会使用诸如NLog,Log4Net,Kafka+ELK等等日志套件: 基于关注点分离原则,业务开发的时候不应该关注日志具体实现:并且后续能方便切换其他日志套件: 这里先实 ...

  9. RDIFramework.NET V3.3 Web版角色授权管理新增角色对操作权限项、模块起止生效日期的设置

    在实际应用在我们可能会有这样的需求,某个操作权限项(按钮)或菜单在某个时间范围内可以让指定角色访问.此时通过我们的角色权限扩展设置就可以办到. 在我们框架V3.3 Web版本全新增加了角色权限扩展设置 ...

  10. DS控件库 DSLed控件呈现滚动字幕效果

    滚动字幕效果在DSled上可以使用偏移来实现,代码如下 运行效果