本文VS Code + GCC工具集为主要环境编译调试menu课程项目,并结合代码分析其中的软件工程方法、规范或软件工程思想。
案例地址:https://github.com/mengning/menu
参考资料:https://gitee.com/mengning997/se/blob/master/README.md#代码中的软件工程
1.C++环境搭建
之前已经安装了MinGW,输入gcc -v可以查看版本号
2.VSCode环境搭建
在vscode中打开menu项目,点击运行和调试后生成了lunch.json和task.json两个文件
对两个文件进行配置
对hello.c进行编译
运行hello程序
模块化程序设计是指在进行程序设计时,将一个大程序按照功能划分为若干小程序模块,每个小程序模块完成一个确定的功能,然后在这些小程序模块之间建立必要的联系,通过这些小程序模块的互相协作,完成整个大程序功能的程序设计方法。
模块化设计的设计原则:
模块独立
模块完成独立的功能,与其他模块的联系应该尽可能得简单
模块的规模要适当
模块的规模不能太大,也不能太小。如果模块的功能太强,可读性就会较差,若模块的功能太弱,就会有很多的接口。
模块之间的依赖程度称为耦合度,模块内部各元素之间的依赖程度称为内聚度,由于模块化设计的设计原则使得一个模块只做一件事,模块之间不需要知道具体实现的过程,在使用时只需要调用即可。因此,模块化设计的系统总体满足高内聚低耦合的特性。
在menu项目中,主要有linktable模块、menu模块、test模块:
linktable模块中定义了LinkTable,并写了对LinkTable增删改查的方法来供调用
menu模块中调用LinkTable模块实现了对menu的各种操作,menu模块并不需要知道LinkTable内方法的具体实现过程,从而menu只需要关注自身方法的具体实现。
test模块使用了menu的SetPrompt、MenuConfig和ExecuteMenu方法
这样设计降低了程序设计的复杂性,即只需要关注特定功能的具体实现,由于在用到时只需要调用即可,因此提高了代码的重用性,并且在修改时只需要对模块内进行修改而不影响到模块外的部分,因此易于维护和扩充其他功能。
接口是互相联系的双方共同遵守的一种协议规范,一般通过定义一组API函数来约定软件模块之间的联系方式。一方面,接口定义了软件模块对外提供了怎样的服务,另一方面,又告诉外部如何访问所提供的服务。
在软件设计中接口的定义决定了模块间的耦合度,如果我们想实现实现低耦合的程序,就需要可重用的接口设计,需要底层模块,与当前业务需求解耦。
在menu中将链表相关的接口定义在linktable.h文件中,在linktable.c文件中实现源代码,做到了两个模块的解耦。
在linktable.h文件中声明了SearchLinkTableNode接口
tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode, void * args), void * args)
这个接口是找到链表中的一个节点,其中传入的参数里有一个返回值为int的Condition函数,这里Condition作为Callback函数,需要两个函数接口,一个是call-in方式函数,如SearchLinkTableNode函数,其中有一个函数作为参数,这个作为参数的函数就是callback函数,如代码中Conditon函数。
利用callback函数参数使Linktable的查询接口更加通用,提高了接口的可重用性。
可重入函数:可重入函数主要用于多任务环境中,一个可重入的函数可以在这个函数执行的任何时刻中断它,转入OS调度下去执行另外一段代码,而返回控制时不会出现什么错误;而不可重入的函数由于使用了一些系统资源,比如全局变量区,中断向量表等,所以它如果被中断的话,可能会出现问题,这类函数是不能运行在多任务环境下的。
在LinkTable中,为了保证在多线程的任务下数据的一致性,使用pthread_mutex_lock线程锁来互斥访问临界资源
例如AddLinkTableNode函数,在对pLinkTable修改前要加pthread_mutex_lock锁使得同一时刻只有该线程能对pLinkTable修改,在修改完数据后,使用pthread_mutex_unlock释放资源,这样保证了程序在多线程的环境中数据的一致性。
通过menu项目源代码的分析,使我对模块化设计、可重用接口、线程安全等软件工程设计思想的理解有了跟深层次的理解,让我明白了这些思想如何正确运用到实际的工程实践中。
原文:https://www.cnblogs.com/ma-xx/p/13933902.html