代码中的软件工程—menu项目

一、配置环境

1.下载vscode并且安装好c++配件

 

 

2.安装Mingw-64

Step1.下载并安装

 

Step2.配置环境变量

  右键“我的电脑”-> "属性"->"高级系统设置"->"环境变量"->选中"path"进行编辑

值得注意的是:这里配置环境变量的时候要把安装目录中的bin目录包含进去

 

Step3.查看是否安装成功

   打开控制台输入 gcc -v ,若成功配置好控制台会弹出相关的版本信息:

 

 

3.用vscode运行一个简单的cpp程序

 

 运行结果如下:

 值得注意的是:尽量在安装mingw时候不轻易改动原本配置路径,若改动了后续仍需在 1 launch.json 和2 c_pp_properties.json 两个配置文件中更改相关属性,例如includePath和运行.exe所在目录等等,不然头文件的引入和命名空间会出现很多错误。(本人的惨痛教训。。)

 

好了,到此为此我们vscode已经能成功运行cpp程序了。说明我们已经具备能力使用vscode来学习优秀的项目以及其源代码。接下来不妨以一个菜单功能小程序来作为我们的入门练习。

 

 

二、菜单小程序的“成长”

1.背景

本文所叙述的代码实现了一个菜单小程序,其最终目标是可以实现不同的项目中都可以重用

最终项目:https://github.com/mengning/menu

“成长”阶段:https://gitee.com/mengning997/se/tree/master/src

 

2."成长"过程

Step1.打开“成长”阶段的网址,我们可以看到本项目的发展历程。

 

Step2.阅读labx的源码

(一)lab1:menu.c的源码是对菜单功能的一个概述

 

初步思想带有一个 help功能以及others功能

 

(二)lab2:menu.c在lab1基础上实现了模拟功能

 此时我们输入"help"控制台已有相应动作,且能区分不是“help”的未定义命令

 

(三)lab3:实现了软件工程中模块化的设计方法

 1)封装了基本的命令方式,使得用户输入命令时,我们可以通过遍历命令链表来判断执行相应的操作

 值得注意的是:封装成对象后,以后需要添加命令只需增加实体即可,不用每次都重定义

 

2)定义了一组目前可执行的命令

 

 3)定义了各命令的具体操作(以quit命令为例子)

 

(三)lab3.2:在lab3.1的基础上简化了main函数的脉络,将遍历命令的过程提取到了main函数外

 

(四)lab3.3:将命令定义以及操作放到了.h文件和.c文件中,以后有扩展项目时可使用同一套命令格式,不用重新定义一套新的命令格式

 

(五)lab4:提供了一套方法给用户,用于动态建立链表且将命令和链表之间操作进行分离

 

(六)lab5.1:定义了一个 SearchCondition函数来传入搜索条件

 

(七)lab5.2:通过在SearchLinkTableNode函数和callback函数中各增加一个参数args,来避免两个函数都调用全局变量cmd,使得这两个模块耦合性降低并增加安全性。

 

 

(八)lab7.1:通过对临界区加锁来增加了对读写操作的安全性,例:删除结点时需上锁,若不上锁,可能正在删除某结点的时候,有线程需要读该结点,若在读的同时节点删除了,会出现不一致的情况。

 

(九)lab7.2:7.1基础上增加了一些接口,使得整个项目的封装性更好。

 

Step3.通过菜单程序的成长来学习软件系统设计方法

  通过对labx的源码分析,我们可以从一个刚出生的“婴儿”程序逐渐“成长”,直到最终的“成人”小菜单程序。而里面的更新版本更有许许多多东西值得我们学习。

模块化设计:

  我们可以看到在lab3.1分析中,源码作者已经开始分离将命令的数据结构和它的具体操作分离。这样做的好处就是当我们需要添加新的命令,或者修改某个命令的具体操作时,只需修改某个模块的代码,而我们提供的供外调用的接口并没有发生变化。

  虽然3.1中已经有初步的模块化设计思想,但总体代码仍放在同一个文件中,显得代码冗余且逻辑划分不清,而在3.3中已经将其命令的定义和操作定义在.h文件中,大大增加了逻辑的清晰性。

可重用函数:

  在5.2中,源码作者已经注意到多个函数共享全局变量的危险性,所以在原本共享全局变量的函数中增加了一个参数来停止危险操作。

线程安全:

  在4.0中,源码作者通过加入互斥量mutex来实现互斥。而保证线程安全,源码作者则是在7.1版本通过进行加锁和解锁操作来实现,这样可以保证在任一时刻,都只有一个线程能访问该对象,从而保证了线程安全。

 

三、总结

  通过阅读菜单程序的各个版本的源代码,并仔细思考每个版本相较于前版本的差别,令我对程序设计的工程化思想有了更深的理解。以前的我做项目仅仅是为了做项目而做,毫无规范性和相关安全思想,导致现在的我再打开本科所完成的项目时,已经完全不记得当时如何完成的,令很多所学的知识都只停留在表面上。通过这次的学习,本人在以后的项目设计中,更多的会参考本次的学习结果。谢谢阅读。

   

posted @ 2020-11-10 14:06  龙俊霖🎐  阅读(146)  评论(0)    收藏  举报