高软-menu项目学习笔记

       经过这几节课的学习,对项目的编程设计思想上,有了一点了解。本博客本着学习的思想,参考老师的代码和上课ppt,跟着学习资料自己做下,加深理解,顺便写下学习总结。

     项目案例链接:https://github.com/mengning/menu 

    参考资料链接:  https://gitee.com/mengning997/se/blob/master/README.md#%E4%BB%A3%E7%A0%81%E4%B8%AD%E7%9A%84%E8%BD%AF%E4%BB%B6%E5%B7%A5%E7%A8%8B

一、C/C++编译调试环境配置

       (1)安装Visual Studio Code

  (2)安装Microsoft C / C ++ extension

       在vs code的侧边栏的“扩展”里面搜索“C/C++”,点击下载即可。

                     

  (3)C / C ++编译器和调试器

          C / C ++编译器和调试器的编译器和调试器有很多,这里选择Mingw-w64/GCC and GDB,下载链接

在下载完成后,进行安装,安装过程一路“next”即可。在安装完成后,还要配置一下“环境变量”(老生常谈了。。。在PATH下进行添加路径,添加到MInGW\bin文件路径下)。

  安装完成后,打开CMD,输入命令gcc -v,查看是否安装成功。

       

 

(4)配置VSCode

此时,点击Run按钮。程序仍然是无法进行编译运行的。如下图:

 

 

 点击上图中的“Run and Debug”,如何跟着提示走,就会生成 launch.json文件 和 tasks.json。

在当前文件是C、C++的情况下,tasks.json文件告诉vs代码如何构建(编译)程序,而launch文件用来执行编译好的文件。

在终端输入以下命令,可看到输出正常。

 

 

vscode提供了丰富的第三方插件,敲命令行不免麻烦。下载插件“Code Runner”,一键运行。

 

点击右上角的运行按钮,运行如图:

 

 

二、代码分析
学习menu菜单小程序,从孟老师的代码演变中,分析代码设计的思想。
(1)lab1 
    lab1中的menu.c文件,给出了menu菜单功能设计的基本思路。即,通过输入字符串,如何进行字符串比较,若比较相同,即认为用户发出了某种请求,如“help”。如何进行相应操作。这部分未体现出软工的设计的精妙。
(2)lab2
lab2中的menu.c文件,完成了“help”功能 和“quit”功能,使代码具有初步的功能。
(3)lab3.1
 lab3.1中进行了初步的代码分离,将"help"和"quit"命令的功能单独的放到单独的函数中取,体现了接口和模块化的思想,降低了代码间的耦合性。这样做的好处是:假如输入help时,程序出错,可以很快定位到出错的代码部分。而且一个地方出错,尽可能少的波及到其他部分。而且第三部分,通过创建结点数据结构tDataNode,将程序提高的menu命令放入结点列表内,每次输入命令与结点列表进行比较,简化了代码,形成了代码执行流程框架。
(4)lab3.2
lab3.2中将第创建的tDataNode结点的操作进行封装,封装成函数方便代码的重用,以及后期的修改维护。
(5)lab3.3
 写到lab3.2时,我们发现我们代码逻辑上已经很丰富了。我们设计了tDataNode数据结构,用来存储代码中提供的menu菜单命令;我们写了完成这些命令的方法代码,还有主函数的代码。。。假设,我们menu菜单命令再进行扩充的话,那该menu.c文件将会是很庞大。而且也很不利于维护和继续扩充。那么模块化和接口就发挥作用了,我们把单一的功能给拉出来,形成模块。然后通过接口调用。这样代码的逻辑就清楚了很多。正如老师总结的:
  • 一行代码只做一件事
  • 一个块代码只做一件事
  • 一个函数只做一件事
  • 一个软件模块只做一件事
 lab3.3中,就很清楚的体现出了模块化。将对链表的定义放到linklist.h,将对链表的操作放在linklist.c,而menu.c中只存放主逻辑程序的代码。
 
(6)lab4
 
 lab4的代码结构做了一些改变,引入了新的结构体 LinkTable,代码的编写框架也基本确定。在menu功能上来说,也基本已经完善,比较成熟。对文件模块进行分析如下:
linktable.h 进行链表数据结构的定义,以及定义了相关函数接口。
linktable.c 中实现了linktable中定义的方法
menu.c      负责主要的代码逻辑

(7)lab5.1

   在这部分给Linktable增加Callback方式的接口。

  首先,什么是call in? 什么是 call back?

tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode));

如上行代码,为linktable.h中定义的一个接口。那么给Linktable增加Callback方式的接口,需要两个函数接口,一个是call-in方式函数,如SearchLinkTableNode函数,其中有一个函数作为参数,这个作为参数的函数就是callback函数,如代码中Conditon函数。简单的来说,一个包含call back的接口名是这样的: 返回类型 cal_in_function(call_back_function): 然后在函数体内,call_back_function在适当时候被激活。

call back接口的好处:

      利用callback函数参数使Linktable的查询接口更加通用,有效地提高了接口的通用性。 我们还通过将linktable.h中不是在接口调用时必须内容转移到linktable.c中,这样可以有效地隐藏软件模块内部的实现细节,为外部调用接口的开发者提供更加简洁的接口信息,同时也减少外部调用接口的开发者有意或无意的破坏软件模块的内部数据。通过接口进行信息隐藏已经成为面向对象编程语言的标准做法,使用public和private来声明属性和方法对于外部调用接口的开发者是否可见。

   (8)lab5.2

lab5.2中增加了Makefile文件。

为什么需要Makefile?

   作为一个可重用的子系统,其他程序员在重用这个软件子系统时应该不需要了解这个子系统内部代码的组织方式,只需要了解调用接口和生成的目标文件,就可以方便的将子系统集成到自己的软件中。因此,menu子系统还需要有自带的构建系统。

什么是Makefile?

    Makefile 文件,可以告诉make命令需要怎么样的去编译和链接程序。makefile关系到了整个工程的编译规则。一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,makefile定义了一系列的规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂的功能操作,因为makefile就像一个Shell脚本一样,其中也可以执行操作系统的命令。makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。

Makefile代码如下所示:

#
# Makefile for Menu Program
#

CC_PTHREAD_FLAGS             = -lpthread
CC_FLAGS                     = -c 
CC_OUTPUT_FLAGS                 = -o
CC                           = gcc
RM                           = rm
RM_FLAGS                     = -f

TARGET  =   menu
OBJS    =   linktable.o  menu.o

all:    $(OBJS)
    $(CC) $(CC_OUTPUT_FLAGS) $(TARGET) $(OBJS)

.c.o:                        //.c.o,表示表示所有的 .o文件都是依赖于相应的.c文件的
    $(CC) $(CC_FLAGS) $<

clean:
    $(RM) $(RM_FLAGS)  $(OBJS) $(TARGET) *.bak

(9)lab7

  lab7.1对代码进行进一步分离,新增加文件menu.h,将对menu的操作的接口放到menu.h中。逻辑更加清楚,模块化思想很清晰。

lab7.2 增加了 readme.txt 文件,为用户提供了使用指南,menu项目结束。

 
 

 

posted @ 2020-11-09 15:57  天空下晓雨  阅读(137)  评论(0)    收藏  举报