代码中的软件工程

代码中的软件工程

本篇文章主要基于孟宁老师上课的内容以及实验代码完成。我在本科期间没有系统学习过软件工程这门课程,就算了解过也是一知半解,在上了孟老师这门高级软件工程课后,我对软件工程有了更深刻的认识和理解,故借此机会总结这几次上课内容。

本次总结首先对老师给的源代码进行阅读分析,并且结合代码分析其中的软件工程方法、规范或软件工程思想。

一、环境配置(win10)

第一步,vscode中安装 C/C++扩展

第二步,安装C/C++编译器和调试器
因为在vscode中c/c++扩展部分不包含C++编译器调试器,所以你需要安装这些工具。为了在不同环境保持一致,我们选择了MinGW,具体安装链接是MingGW下载

安装好后添加环境变量,之后在cmd中执行gcc -v检查是否安装成功,若成功则会出现下图提示

第三步,
在桌面创建新的项目文件夹advanceSE,并且在该文件夹内打开powershell输入code .来打开VScode,此时VScode没有任何文件如下图所示

在该空白项目中创建hello.cpp,并且输入测试内容,如下图所示

之后打开Debug调试,具体步骤如下

当点击第三步C++(GDB/LLDB)后会弹出下图框,点击g++.exe即可

之后可以看到调试过程中成功输出“Hello,world”

而在项目目录中,多出了.vscode文件夹,文件夹下多出launch.json以及tasks.json两个json文件,如下图所示

二、项目运行(linux)

在linux上安装好gcc,安装gcc命令为yum -y install gcc gcc-c++ kernel-devel,安装好在从前面链接中下好的项目menu-mastermake编译构建,如下图所示,再输入./test即可运行

三、项目代码分析

1、模块化设计

模块化(Modularity)是在软件系统设计时保持系统内部各部分相对独立,以便每一个部分都可以被独立地进行设计和开发。模块化软件设计的方法如果应用的比较好,最终每一个软件模块都将只有一个单一的功能模块,并相对独立于其他软件模块,使得每一个软件模块都容易理解容易开发。

在本次命令行菜单项目中,将存储命令的数据结构以及操作单独放到linklist.h/linklist.c文件中,而在linklist文件内又对外开放接口,menu.c利用接口实现菜单的业务逻辑功能,最后实现如下图所示的模块化

2、可重用接口

在软件开发中,由于不同的环境和功能要求,我们可以通过对以往成熟软件系统的局部修改和重组,保持整体稳定性,以适应新要求。这样的软件称为可重用软件。目的是节约软件开发成本,真正有效地提高软件生产效率。

重用分为消费者重用和生产者重用,消费者重用是指软件开发者在项目中重用已有的一些软件模块代码,以加快项目工作进度。生产者重用需要重点考虑设计通用的模块,通用的接口等因素。

此外,接口还包含了五大要素,分别是:1)接口的目的;2)接口使用所需满足的前置条件或假定条件;3)使用接口的双方遵守的协议规范;4)接口使用之后的效果,一般称为后置条件;5)接口所隐含的质量属性

下面是menu的一个接口例子

3、可重入函数与线程安全

可重入函数指可以被多个任务并发使用,而不必担心数据发生错误。与之相反的不可重入函数则要求不能超过一个任务来共享,除非能保证函数的互斥。而线程安全又与可重入密切相关,为了保证线程安全,我们在必要时需要通过“上锁”来保护临界资源。

那么对于我们的menu项目,有哪些是可重入函数、哪些不可重入呢?下面为这些函数一一分析
1)CreateLinkTable

上图函数的主要功能是创建链表结构,不同线程之间创建链表结构、并且申请空间是相互不冲突的,所以该函数是可重入函数。
2)AddLinkTableNode

上图函数的功能是在链表中添加新节点,我们可以看到该函数有一段加锁pthread_mutex_lock和解锁pthread_mutex_unlock的过程,该过程能保证在链表中添加节点时不会有其他也准备改变链表的线程干扰,其他线程会因为加锁而被阻塞,由此可见
AddLinkTableNode是可以被多个线程访问的,故为可重入函数。除该函数外,类似的还有DeleteLinkTableDelLinkTableNoded等对链表修改的函数都为可重入函数。
3)SearchLinkTableNode

该函数功能为从链表中查找相应节点,只读不写,故该函数为可重入函数,类似的还有GetLinkTableHeadGetNextLinkTableNode

四、总结

以上是我通过阅读menu项目源码得到的总结,在我们平常的代码编写中合理的注释、简洁易读的代码风格将有助于程序员们的阅读和理解,同时能帮助我们沟通;模块化以及接口化可以让我们的代码不会显得冗余、臃肿,它们能让我们代码的各功能分工更明确、更容易排错;可重入以及线程安全保证我们程序数据安全又能共享进行。总之这次课程收获很大,不仅仅是代码规范、安全,更重要的是对于代码的理解和思维,在这里再次感谢孟宁老师为我们精心准备的高软课程。

posted @ 2020-11-05 11:05  XieCong1997  阅读(146)  评论(0编辑  收藏  举报