代码中的软件工程-menu项目

前言

学习了孟老师的这几节课程,我学习了如何搭建一个简单的命令行menu小程序,于是将一些学到的东西总结如下。

编译环境的配置

之前安装过MinGW-w32,之后通过cmd执行gcc -v查看安装是否成功:

安装完成之后我们打开VScode,在扩展部分添加C/C++插件:

之后打开终端,输入code.命令,即可生成三个配置文件task.json,launch.json,c_cpp_propertities.json,完成配置运行

二、软件工程一般原理分析

2.1代码规范和代码风格

  • 文件头部注释

    注释和版权信息:注释也要使用英文,不要使用中文或特殊字符,要保持源代码是ASCII字符格式文件;
    不要解释程序是如何工作的,要解释程序做什么,为什么这么做,以及特别需要注意的地方;
    每个源文件头部应该有版权、作者、版本、描述等相关信息。
  • 程序块头部注释


    正如linktabe.c中程序块头部添加注释将函数功能、各参数的含义和输入/输出用途等一一列举,这往往是模块的对外接口,以方便自动生成开发者文档。
  • 代码风格规范总结
    命名:合适的命名会大大增加代码的可读性;
    类名、函数名、变量名等的命名一定要与程序里的含义保持一致,以便于阅读理解;
    类型的成员变量通常用m_或者_来做前缀以示区别;
    一般变量名、对象名等使用LowerCamel风格,即第一个单词首字母小写,之后的单词都首字母大写,第一个单词一般都表示变量类型,比如int型变量iCounter;
    类型、类、函数名等一般都用Pascal风格,即所有单词首字母大写;
    类型、类、变量一般用名词或者组合名词,如Member
    函数名一般使用动词或者动宾短语,如get/set,RenderPage;
    注释和版权信息:注释也要使用英文,不要使用中文或特殊字符,要保持源代码是ASCII字符格式文件;
    不要解释程序是如何工作的,要解释程序做什么,为什么这么做,以及特别需要注意的地方;
    每个源文件头部应该有版权、作者、版本、描述等相关信息。

2.2模块化设计

软件设计中的模块化程度便成为了软件设计有多好的一个重要指标,一般我们使用耦合度(Coupling)和内聚度(Cohesion)来衡量软件模块化的程度。
*耦合度是指软件模块之间的依赖程度,一般可以分为紧密耦合(Tightly Coupled)、松散耦合(Loosely Coupled)和无耦合(Uncoupled)。

*内聚度是指一个软件模块内部各种元素之间互相依赖的紧密程度。理想的内聚是功能内聚,也就是一个软件模块只做一件事,只完成一个主要功能点或者一个软件特性(Feather)。
*.h文件实现对接口的声明,.c文件实现对接口的调用。

2.3可重用设计

*在软件设计时,需要尽可能地使用可重用接口,让接口能处有更加丰富地应用场景。
*实例分析
在lab3中,其查询数据结构为一个链表,定义如下:

在lab4中,新增了一个数据结构tLinkTable,只表示链表的链接,不包含数据内容,其定义如下:

在lab5中,还有另一种方法:

2.4线程安全

*线程安全问题都是由全局变量及静态变量引起的。若每个线程中对全局变量、静态变量只有读操作,而无写操作,一般来说,这个全局变量是线程安全的;若有多个线程同时执行读写操作,一般都需要考虑线程同步,否则就可能影响线程安全。
`int DelLinkTableNode(tLinkTable *pLinkTable,tLinkTableNode * pNode)
{
if(pLinkTable == NULL || pNode == NULL)
{
return FAILURE;
}
pthread_mutex_lock(&(pLinkTable->mutex));
if(pLinkTable->pHead == pNode)
{
pLinkTable->pHead = pLinkTable->pHead->pNext;
pLinkTable->SumOfNode -= 1 ;
if(pLinkTable->SumOfNode == 0)
{
pLinkTable->pTail = NULL;
}
pthread_mutex_unlock(&(pLinkTable->mutex));
return SUCCESS;
}
tLinkTableNode * pTempNode = pLinkTable->pHead;
while(pTempNode != NULL)
{
if(pTempNode->pNext == pNode)
{
pTempNode->pNext = pTempNode->pNext->pNext;
pLinkTable->SumOfNode -= 1 ;
if(pLinkTable->SumOfNode == 0)
{
pLinkTable->pTail = NULL;
}
pthread_mutex_unlock(&(pLinkTable->mutex));
return SUCCESS;
}
pTempNode = pTempNode->pNext;
}
pthread_mutex_unlock(&(pLinkTable->mutex));
return FAILURE;
}

/*

  • Search a LinkTableNode from LinkTable
  • int Conditon(tLinkTableNode * pNode);
    */
    tLinkTableNode * SearchLinkTableNode(tLinkTable *pLinkTable, int Conditon(tLinkTableNode * pNode, void * args), void * args)
    {
    if(pLinkTable == NULL || Conditon == NULL)
    {
    return NULL;
    }
    tLinkTableNode * pNode = pLinkTable->pHead;
    while(pNode != NULL)
    {
    if(Conditon(pNode,args) == SUCCESS)
    {
    return pNode;
    }
    pNode = pNode->pNext;
    }
    return NULL;
    }`

三、总结

通过对menu项目的迭代更新,我学习到了如何让代码写的更加简洁明了高效,了解到了接口、模块化设计,提高代码的效率。

posted @ 2020-11-10 21:50  阿木木木L  阅读(117)  评论(0编辑  收藏  举报