以VS Code + GCC工具集为主要环境编译调试课程项目案例https://github.com/mengning/menu 仔细阅读分析源代码,结合代码分析其中的软件工程方法、规范或软件工程思想。
一、Windows下在vscode中配置c++
1、下载mingw64并配置
mingw64是c/c++得编译器,下载安装完成后配置环境变量,在系统环境变量Path中添加新的变量值,即mingw的安装目录下的bin文件夹路径,如d:\mingw\bin
2、下载vscode
直接官网下载
3、配置vscode的相关设置
在extensions中下载c/c++ tools插件,新建一个cpp文件,点击左侧Run,自动生成lanuch.json配置文件
修改如下内容:
模块化(Modularity)是在软件系统设计时保持系统内各部分相对独立,以便每一个部分可以被独立地进行设计和开发。这个做法背后的基本原理是关注点的分离 (SoC, Separation of Concerns),是由软件工程领域的奠基性人物Edsger Wybe Dijkstra(1930~2002)在1974年提出,没错就是Dijkstra最短路径算法的作者。 关注点的分离在软件工程领域是最重要的原则,我们习惯上称为模块化,翻译成我们中文的表述其实就是“分而治之”的方法。 关注点的分离的思想背后的根源是由于人脑处理复杂问题时容易出错,把复杂问题分解成一个个简单问题,从而减少出错的情形。
尽管已经做了初步的模块化设计,但是分离出来的数据结构和它的操作还有很多菜单业务上的痕迹,我们要求这一个软件模块只做一件事,也就是功能内聚,那就要让它做好链表数据结构和对链表的操作,不应该涉及菜单业务功能上的东西;同样我们希望这一个软件模块与其他软件模块之间松散耦合,就需要定义简洁、清晰、明确的接口。 这时进一步优化这个初步的模块化代码就需要设计合适的接口。定义接口看起来是个很专业的事情,其实在我们生活中无处不在,比如我们看的电视剧中“天王盖地虎,宝塔镇河妖”就是黑社会接头定义的接口,比如两个人对话交流沟通使用的就是汉语普通话或标准英语这么一个接口规范。
接口就是互相联系的双方共同遵守的一种协议规范,在我们软件系统内部一般的接口方式是通过定义一组API函数来约定软件模块之间的沟通方式。换句话说,接口具体定义了软件模块对系统的其他部分提供了怎样的服务,以及系统的其他部分如何访问所提供的服务。 在面向过程的编程中,接口一般定义了数据结构及操作这些数据结构的函数;而在面向对象的编程中,接口是对象对外开放(public)的一组属性和方法的集合。函数或方法具体包括名称、参数和返回值等。
接口规格是软件系统的开发者正确使用一个软件模块需要知道的所有信息,那么这个软件模块的接口规格定义就必须清晰明确地说明正确使用本软件模块的信息。一般来说,接口规格包含五个基本要素: 接口的目的; 接口使用前所需要满足的条件,一般称为前置条件或假定条件; 使用接口的双方遵守的协议规范; 接口使用之后的效果,一般称为后置条件; 接口所隐含的质量属性。
2、可重用接口
将通用的Linktable模块集成到我们的menu程序中:
通用Linktable模块的接口参见linktable.h,对应的实现代码linktable.c 有关Linktable模块的写法可以参考menu4-1.mp4。在使用通用的Linktable模块之后menu程序业务代码变得复杂了一些,使用起来比较繁琐,这部分代码的写法参考menu4-2.mp4。
给Linktable增加Callback方式的接口:
给Linktable增加Callback方式的接口,需要两个函数接口,一个是call-in方式函数,如SearchLinkTableNode函数,其中有一个函数作为参数,这个作为参数的函数就是callback函数,如代码中Conditon函数。 这一部分代码的编写可以参考menu5-1.mp4。callback接口方式非常像谍战剧里派遣卧底,这里SearchLinkTableNode函数派遣了一个卧底Conditon并指定了卧底负责收集的情报范围tLinkTableNode * pNode,一旦发现目标情报卧底就被激活return pNode。
利用callback函数参数使Linktable的查询接口更加通用:
前面的方式中用户程序定义了卧底SearchCondition,这个卧底函数需要向基地查询目标信息,也就是使用了全局变量cmd。与现实世界的情况类似这样会大大增加卧底暴露的风险,为了降低风险增加了args参数,这样在派遣卧底的同时指定了目标情报的内容,卧底在行动过程中就不需要和基地建立联系,只有在搜集到目标情报args时才向基地报道完成任务。利用callback函数参数使Linktable的查询接口更加通用,有效地提高了接口的通用性。 我们还通过将linktable.h中不是在接口调用时必须内容转移到linktable.c中,这样可以有效地隐藏软件模块内部的实现细节,为外部调用接口的开发者提供更加简洁的接口信息,同时也减少外部调用接口的开发者有意或无意的破坏软件模块的内部数据。通过接口进行信息隐藏已经成为面向对象编程语言的标准做法,使用public和private来声明属性和方法对于外部调用接口的开发者是否可见。 这一部分代码的编写可以参考menu5-2.mp4。
原文:https://www.cnblogs.com/wang0p/p/13927279.html