论代码中的软件工程 ——Menu项目

 

代码中的软件工程

课上,孟宁老师向我们讲述了有关软件工程的思想方法,加以实例介绍,让我深刻认识到软件工程在实际编程工作项目中的重要性,并有了许多体会。

本文主要总结老师课上讲述的知识,并基于Menu项目进行代码中软件工程项目的案例分析。非常感谢孟宁老师的教学指导。

一.完成编译和调试环境配置

在本次实验项目中,我们采用Vscode+gcc的模式进行实现,因此需要完成相关环境的配置。

 

首先我们需要下载Vscode

进入Vscode官方网站下载:https://code.visualstudio.com/docs/setup/windows

 

 

下载完成后,我们进入Vscode界面,建议先在商店中下载中文扩展包。(在搜索界面输入Language,第一项就是)

 

 

 

接下来我们需要配置C/C++的扩展包,在商店中查找C/C++(搜索C++ extension),并下载安装,重启Vscode即可。

 

 

 

 

由于Vscode只是一个单纯的文本编译器,无法直接执行C/C++文件,因此我们需要下载跨平台的编译器和调试器,在本文中我们选择的是运用广泛的MinGW-w64编译器。

MinGW(Minimalist GNU for Windows), 是一个适用于微软 windows 应用程序的极简开发环境。MinGW 提供了一个完整的开源编程工具集,适用于原生 MS-Windows 应用程序的开发,并且不依赖于任何第三方 C 运行时 DLL。MinGW 主要供在 MS-Windows 平台上工作的开发人员使用,也可以跨平台使用。Mingw-w64 是原始 mingw.org 项目的升级版,该项目旨在支持 Windows 系统上的 GCC 编译器。它在 2007 年进行了分支,以便为 64 位和新 API 提供支持。从那以后,它得到了广泛的使用和分发。

 

首先去MinGW官方网址进行下载:https://sourceforge.net/projects/mingw-w64/files/?source=navbar

若是挂有外网VPN,可以直接下载;没有则最好下载离线压缩安装包。在此笔者选择下载压缩包。

 

 

解压完成后,我们需要在电脑中配置环境变量:

 

 

 我们将minw64中的bin文件配置到系统变量Path的路径下:

 

 

 这样我们就完成了MinGW编译环境的配置。

 

在控制台键入

gcc -v

查看Gcc版本,即可看到当前版本号与版本信息。

 

 

 

接下来,我们打开Vscode,并选择环境配置:

 

 

 

我们创建一个工作文件夹VS_TEST,并拖拽入Vscode中

 

 

 

 我们发现在VS_TEST文件目录下生成了launch.json、settings.json、tasks.json三个文件

 

 

接下来我们打开launch.json文件,并更改工作区配置如下。

 

 

 

 

新建一个C++文件,执行:

 

即可在控制台终端看到输出结果。这样第一个程序即在Vscode上运行成功了。

 

 

 

 

 

二.Menu项目代码中软件工程思想的理解分析

首先我们下载孟宁老师的Menu项目,并将它拖入我们的工作区中。

 

 

 

1.模块化设计

模块化程序设计是指在进行程序设计时将一个大程序按照功能划分为若干小程序模块,每个小程序模块完成一个确定的功能,并在这些模块之间建立必要的联系,通过模块的互相协作完成整个功能的程序设计方法。

模块化程序设计的基本思想是自顶向下、逐步分解、分而治之,即将一个较大的程序按照功能分割成一些小模块,各模块相对独立、功能单一、结构清晰、接口简单。通常采用内聚度和耦合度来衡量模块化的程度。

模块化设计控制了程序设计的复杂性;提高了代码的重用性;易于维护和功能扩充;有利于团队开发。
 
 
在孟宁老师的Menu项目lab3中,比较lab3.1和lab3.2中的menu.c,我们发现lab3.1中的代码非常冗余,可读性很差,而且变量之间关系太过紧密,代码难以改动,很难进行更高层面的修改。
 
于是在lab3.2中,孟宁老师讲查找函数和显示函数单独分离出来,通过函数调用的方式来达成对应功能 ,我们想要对相应功能进行修改,只需要在函数体内部进行’操刀’即可,很大程度提高了代码的可读性和易维护性,使下一代程序员工作效率提高。实现了高内聚低耦合的软件工程思想。

 

 

与此同时,我们可以发现lab3.2和lab3.3是实现了近乎相同的功能,但lab3.3划分得更为细致,将链表结构独立成单独的c文件linklist,将menu3实现的函数封装在linklist.h中,并在linklist.c中对这些功能进行实现,这样就能通过不同模块接口,进行相互之间的调用。我们将原本较为复杂的主程序进行了模块化的划分,主程序中只包含了while循环,将其余复杂的问题以模块、接口的方式提供给主程序,更方便我们进行代码维护。
 
而且链表的操作非常有利进行添加和删除,不需要对其他模块进行相应改动,其中也深刻包含了软件模块化的工程思想。
 

 

 

linklist.h文件

 

 

2.可重用接口设计

接口具体定义了软件模块对系统的其他部分提供了怎样的服务,以及系统的其他部分如何访问所提供的服务。在面向过程的编程中,接口一般定义了数据结构及操作这些数据结构的函数;而在面向对象的编程中,接口是对象对外开放的一组属性和方法的集合。

我们希望这一个软件模块与其他软件模块之间松散耦合,就需要定义简洁、清晰、明确的接口,在Menu项目中,同样有接口的运用。

在lab4的linktabel.h中,即对各个函数接口进行了相关的定义。同时增加了testlinktable.c开发者指南程序,告诉用户和其他开发者怎么使用linktable,方便对整个项目进行延伸扩展。

lab4定义了一组链表的操作,并独立成函数,完成了数据结构与操作数据结构的函数与具体实现的解耦。

 

其中一个函数具体实现部分:

 

 

而在menu.c中,只调用了了“linktable.h",其余具体的实现

 

 

 

 

 

 

 

 在lab5.1中,孟宁老师采用了callback机制为其他程序员提供了一个遍历链表的函数接口linktable.h,用户可以直接去主程序中关注实现即可。

 

利用callback函数参数使Linktable的查询接口更加通用,这样可以有效地提高接口的通用性.这样可以有效地隐藏软件模块内部的实现细节,为外部调用接口的开发者提供更加简洁的接口信息,同时也减少外部调用接口的开发者有意或无意的破坏软件模块的内部数据。

 

 

 

 

 
 

 

 

posted @ 2020-11-10 17:07  天涯箫客  阅读(114)  评论(0)    收藏  举报