一、Github地址

https://github.com/S-TRAVELER/WC

实现的功能:

  •   支持 -c
  •   支持 -w
  •   支持 -l
  •   支持 -s
  •   支持 -a
  •   图形界面
  • 多参数(文件名或通配符表达式)
  •   跨系统平台
  •   多种编程语言
  •   支持中文

  

二、PSP表格

PSP2.1 Personal Software Process Stages 预估耗时(分钟) 实际耗时(分钟)
Planning 计划 20 20
· Estimate · 估计这个任务需要多少时间 20 20
Development 开发 1370 1405
· Analysis · 需求分析  80 80
· Design Spec · 生成设计文档 60 50
· Design Review · 设计复审  30 45
· Coding Standard · 代码规范 20 30
· Design · 具体设计 60 60
· Coding · 具体编码 900 950
· Code Review · 代码复审 100 90
· Test · 测试(自我测试,修改代码,提交修改) 120 100
Reporting 报告 150 140
· Test Report · 测试报告 60 50
· Size Measurement · 计算工作量 30 20
· Postmortem & Process Improvement Plan · 事后总结, 并提出过程改进计划 60 70
Total  总计 1540 1565


三、解题思路

由于之前开发基本是在Linux上,看到题目提到exe,于是就计划在Linux平台上开发完基本功能,再兼容Windows平台。

3.1 跨平台

由于考虑了跨平台(Linux+Windows),所以选择了CMake+Qt 的组合;用CMake来实现跨平台的编译,Qt实现跨平台图形界面显示。

  在源码中,除了Gui是Qt实现不需要自己考虑跨平台,其他的功能的实现均需要自己进行系统判断,再进行相应平台的操作。

3.2 程序基本实现

为了提高程序的可扩展性,对命令、选项解析、统计器分别进行了松耦合的处理;使得选项解器、统计器可以不同需求进行策略替换;命令通过继承的方式进行装饰,以增强命令的功能。然后,再构建一个单例的命令注册器,对命令进行管理(看到这里,你大概可以猜到命令注册器让这个程序可以同时支持多个命令,而不仅仅是一个wc命令),提高了可扩展性。

3.2 通配符的支持

通配符的实现思路是把通配符表达式转化为正则表达式,然后实现目录轮询器,然后进行递归遍历,把符合通配符的文件名作为参数进行回调。注:由于Linux的终端和Windows的CMD会对通配符进行解析,所以需要用双引号(Windows的是单引号)把通配符表达式括起来。

3.3 图形界面

图形界面是使用Qt来实现,Qt提供了比较美观的用户界面。

3.4 多语言支持(自定义为-L)

这个功能算是对统计注释行、代码行的选项(-a)的扩展。在实现题目要求的功能时,认识到不同语言具有不同的注释方式,可以让用户进行语言选择,然后再根据用户选择的语言的注释语法进行统计。

通过配置文件的方式,读入不同语言的注释语法,实现了在不需要重新编译的情况下对语言种类进行扩展。

3.5 支持中文

  在写完Gui后,意识到原本写的Counter对中文不友好,于是重写了Counter的代码。由于中文占用多个字节(Linux占用3个,Windows占用2个),所以需要分系统使用正则表达式进行统计,以同时支持中文和英文。


四、设计实现

五、测试运行

程序在终端运行时,输出的内容依次为:行数、词数/字数、文件大小(B)、注释行、空行、文件名

5.1 文件测试

文件依次为(注:为了方便呈现效果,故在测试时输出文件内容):

  • 空文件
  • 只有一个字符的文件
  • 只有一个词的文件
  • 只有一行的文件
  • 一个典型的源文件

5.2 输入不存在的文件

Linux:

Windows:

5.3 不选择文件

Linux:

Windows:

5.4 无选项测试

Linux:

Windows:

5.5 多文件测试

Linux:

Windows:

5.6 通配符测试

Linux:

Windows:

5.7 递归目录

Linux:

Windows:

 5.8 图形界面测试

Linux:

Windows:

5.9 查看帮助

5.10 代码覆盖率

六、项目总结

  本次项目选用C/C++作为开发语言、CMake+Qt作为开发工具、GCov\LCov做代码覆盖率检查。

  本次开发努力遵循使用面向对象的思想解决问题,不断地考虑软件模块的层次,尽量降低模块的耦合度。在设计软件模块方面花的时间比较多。此外,本次开发兼容了Linux和Windows两个系统,在写兼容代码的部分也花了比较多的时间。

这次开发过程中也采用了基于对象的编程思想,以及使用比较多的回调函数,以提高代码的复用率,这也是自己比较满意的地方;但是还是存在不足,代码冗余度还是比较高。

 

个人项目-WC(C/C++ 兼容Linux和Windows)的更多相关文章

  1. phantomjs的使用+Java代码+依赖js(兼容Linux和windows版本)

    1.  在使用phantomjs的时候需要下载phantomjs,网上有window版本和Linux版本.将phantomjs放在Linux上的指定位置之后(如下面的/home/tpl/phantom ...

  2. java中构建同时兼容linux和windows程序时遇到的文件路径分割符问题解决方案

    最近在做一个自动上传文件的客户端,因为 file.getAbsolutePath()  在Mac和linux下的分割符是“/”,而在windows操作系统下的分割符则是“\”,我们程序中固然可以通过调 ...

  3. java读properties的通用类,兼容linux和windows

    package util; import java.io.IOException; import java.io.InputStream; import java.util.Properties; / ...

  4. Linux和Windows兼容

    1. 介绍 我们知道Linux上的应用程序是ELF格式的,而Windows则是PE格式 所以要解决这个问题首先二进制加载问题:其次,就是API问题,两者的API完全不同要实现兼容,就需要构建一个虚拟层 ...

  5. paip.log4j兼容linux windows 路径设置

    paip.log4j兼容linux windows 路径设置 作者Attilax  艾龙,  EMAIL:1466519819@qq.com  来源:attilax的专栏 地址:http://blog ...

  6. Java项目打包在CMD或者Linux下运行

    Java项目打包在CMD或者Linux下运行 1.在CMD下运行 在eclipse中将项目export成jar包,然后用压缩软件解压

  7. shell脚本兼容linux/unix与windows/cygwin的基础(注意处理好CR, LF, CR/LF 回车 换行的问题)

    shell脚本兼容linux/unix与windows/cygwin的基础 :统一文本格式为:unix文本格式,即于LF为换行符(推荐方案) 在notepad上设置:编辑->档案格式转换-> ...

  8. 如何将项目部署到远程的Linux机器上的tomcat上

    下面来练习一下如何将本地的一个项目部署到远程的Linux机器上去. 第一步:将要部署到Linux机器上的项目打成一个war包 war包有一个好处tomcat可以自动解压 第二步:将打好的war上传到L ...

  9. 【转】前后端分离的项目如何部署发布到Linux

    前后端分离的项目如何部署发布到Linux 前期准备 1.服务器的基本配置信息2.本机远程连接服务器的工具(xshell.xftp或者mobaXterm等等,看你自己喜欢) 第一步:部署环境 1.安装j ...

随机推荐

  1. Androi O Automotive 介绍

    最近由于工作需要对android o 中的 automotive源码进行了深入的学习,现总结如下: Android O Vehicle之架构介绍 Android O Vehicle之Car Servi ...

  2. flask项目统一捕获异常并自定义异常信息

    背景:      在日常编写了一些flask项目,主要用于测试方面的mock场景,但迭代到后期发现有时候会抛出各种乱七八糟的异常或者直接500且没有任何异常信息,这种情况一般都是某个代码块没有用try ...

  3. Markdown 使用误区

    新手写 Markdown 容易犯这么个错: 为了美观,使用标记. 例如 为了让一句话显示粗体,使用标题. 嫌 3 级标题字体太大,2 级标题子标题使用 4 级. 强调一个词,使用行内代码. -- 每个 ...

  4. 【转载】Docker registry仓库历史镜像批量清理

    前言 在jenkins CI/CD流水线中以自动打包并push镜像的方式运行了一段时间之后, docker registry中堆积的历史镜像数量极多,磁盘空间告急,为此,有必要定期做镜像的清理,并释放 ...

  5. 一起学SpringMVC之异常处理

    在系统开发过程中,异常处理是不可避免,如果异常处理不好,会给用户造成很差的体验,本文主要讲解在SpringMVC开发过程中,异常处理的相关知识点,仅供学习分享使用,如有不足之处,还请指正. 概述 在S ...

  6. js-04-函数学习

    一.什么为函数? 函数是用来执行某些特定功能的代码,为了减少代码的重复使用,将函数作为代码使用,在需要时随时调用使用. 二.函数的声明(函数名严格区分大小写) 1.function命令 functio ...

  7. UI_DEV_Environment 之 StoryBook

    写在前面 由于本文主要集中关注与工具使用,所以不可能完全介绍工具的所有功能,所以要想了解更多,可以自己去各自官方网站上查看. github examples 什么是UI开发环境 UI开发环境专注于用户 ...

  8. 安装完dlib以及face_recognition,但是在python IDE中无法导入的问题

    在dlib以及face_recognition通过pip安装成功之后(如何通过pip进行安装,在博主的上一篇随笔中有提及),在pycharm中无法导入. 在综合完网上的各种说法之后,发现了原因,在下边 ...

  9. 3.华为路由交换技术_IP子网划分

    IP地址组成 地址包含两部分:网络号+主机号 比如:深圳市(网络号)宝安区坂田华为基地A10(主机号) 约定黄色部分为网络号. D类地址作为组播,E类地址保留使用(用于研究) 路由器只关心IP地址的网 ...

  10. C++ std::vector 基本用法

    #include <iostream> #include <vector> using namespace std; int main() { // 初始化的方式 std::v ...