C语言项目开发-项目架构和编程命名规范

一个项目的流程:

1、公司市场人员与客户交流,了解客户、引导客户使用公司最优资源并产出一份市场需求文档

2、公司需求人员(BA)与客户交流,了解客户需求并产出一个软件需求文档

3、项目经理、开发小组成员、需求人员(BA)一起开一个需求评审会议,对不合理的地方,

   打回给BA,再由BA与客户沟通

4、程序员接到和充分了解软件需求文档后产生软件设计文档(包括概要设计文档和详细设计文档,

   涉及到数据库的还需要进行数据库的设计)

5、程序员根据设计文档进行编码、调试、打包发布。如果编写的函数库,还可能编写一份接口使用文档,

   如果程序是直接运行的软件,还需要编写一份用户使用手册,包括各种操作步骤和配置参数说明

6、软件发布后,客户可能进行一段时间的测试、或者将其投入运营。这期间会发现一些问题,还需要

   程序员进行修复,这已经进行维护阶段了,这个阶段的周期很长,可能5年,也可能10年,或者更长

 

之所以写了软件项目的流程,只是想强调,软件最花费时间的是维护阶段。这个阶段,维护人员可能是

原来的开发人员,但更可能是非原开发人员来维护的。在中国,IT从业人员流动性太大,一个项目的维护

更可能是之前没接触过这个项目的程序员。如果这个时候,文档不齐全,将是一件很蛋疼的事情。

对一个程序员来说,这还不是一个最悲剧的事情。程序员要维护项目,最终还是要阅读项目源代码,

此时如果项目架构设计得很糟糕和代码写得乱七八糟的,想必维护人员在修改项目代码时肯定会咒骂

原来的架构师和开发人员,正因为架构师的低水平设计,业务代码、数据库代码、控制代码深深耦合在

一起,改动一处总害得别人担惊受怕,这因为开发人员没有添加该有的注释,命名的变量不能让人见命思意,

编写的代码过渡冗余,重复的代码多处使用,让维护程序员改了这个地方却不知道还有一个地方有相同的代码

没有修改,此时难保证维护程序员不砸了他的电脑。

 

每个公司都有自己的一套项目流程,自己的编程命名规范,

渐渐的,慢慢也形成了自己的编码风格和命名风格。在此总结一下。这里主要总结C语言的,

因为Java在这方面较C、C++做得相对够好,就不啰嗦了,不过都有参考价值。

1、尽量不用全局变量

  全局很容易破坏软件的结构,增加代码的耦合度,将模糊业务代码、数据库代码、控制代码的界限,

  害得维护人员在阅读代码时,第一要务就是要追踪全局变量在哪里,由于设计得不好,基本项目的

  所有源代码文件都涉及修改了全局变量,这一追踪下来,不是一天半会能够摸索清楚你要了解的某个

  功能,尽管这个功能很小,你还是要看完这整个项目,太浪费时间了,不值得啊。

2、少用全局变量

  有些项目由于硬件资源的限制,比如嵌入式开发,你不得不使用全局变量。在这种不可避免的情况下,

  我们只能尽量减少使用全局变量。

3、别忘记加上static

   如果你使用到的全局变量仅仅是某个源文件(模块)使用到,别忘记给这个全局变量加上static。

4、别忘记加上const

  如果你设计的接口(函数)有入参,而你不想修改这个入参,别忘记加上const。

5、明确哪些结构体、枚举、联合体、宏、常量需要全局使用,哪些需要全局使用

  如果有的结构体、枚举、联合体、宏、常量仅仅是某个模块需要使用,就没必要放置在公共的头文件中

  如果结构体、枚举、联合体是需要公用的,就要考虑是否需要仅仅在公用头文件中声明,在某个源文件中

  实现,这样可以避免某些类型重复定义的错误。

6、让C代码带上面向对象的思想

  不像C++这样即面向过程又面向对象的语言,更不像Java、C#这样完全面向对象的语言,C语言仅仅是面向

  过程的,但是我们可以为C语言设计的项目插上面向对象的翅膀。

  1、面向对象的命名

               如我们在开发一个GUI库,设计到GUI的初始化、加载字体、设置背景色、设置前景色等等操作,

    如果是没有代码面向对象的命名,可以这样:

    Init、LoadFont、SetBgColor、SetFgColor

    如果是带上面向对象的命名,则可以这样:

    Gui_init、Gui_LoadFont、Gui_SetBgColor、Gui_SetFgColor

    这样命名有个很好的好处,便于程序员记忆,我们在想到需要用到GUI的接口时,只需要打上Gui,

    好的集成开发环境就能快速提示所有的GUI库函数,这无论对新接触GUI这个库,还是熟悉GUI库的

    老牛们大大的提高效率。

  2、为仅在一个模块内使用的全局变量加上static

    配合【1】的命名、Gui_Init、Gui_LoadFont、Gui_SetBgColor、Gui_SetFgColor等函数操作这个模块内的全局变量,

    这个时候,GUI犹如一个类,模块内的全局变量犹如C++、Java、C#等面向对象语言的GUI类的成员变量,Gui_Init等GUI库函数

    犹如GUI类的成员函数。

  3、设计纯洁的接口

    如代码:

    void func(int *iResult)

         {

              *iResult = g_Val*10000 + 1000; // 使用了全局变量参数复杂运行的代码

        }

    以上的代码就需要以来g_Val这个全局变量,这种写法已经污染了这个接口

   如果是纯洁的接口,应当

       void func(int *iResult, const int iVal)

         {

              *iResult = iVal*10000 + 1000;

    }

    调用时:

    int iResult,g_val;

    func(&iResult, g_Val);

    这样这个函数就不至于严重以来全局变量,你可以传全局变量进来,也可以传局部变量进来,

    纯洁的接口并不关心这个。

7、命名规范

   1、全局变量加前缀g_,如定义一个全局变量int g_iVal;

   2、static变量加前缀s_,如定义一个模块全局变量static int s_iVal;

   3、结构体变量加前缀st_,如COMM_PARA是一个已经定义好的结构体,则COMM_PARA stCommPara;

   4、枚举变量加前缀e,如ENUM_SEX是一个已经定义好的枚举,则ENUM_SEX eSex;

   5、int类型变量加前缀i,如int iRet;

   6、unsinged int类型加前缀ui,如unsigned int uiRetCode;

   7、float类型变量加前缀f,如float fVal;

      其实有了double类型,可以不用float,就尽量使用double。

   8、unsinged float类型变量加前缀uf,如unsinged float ufVal;

   9、double类型变量加前缀d,如double dVal;

   10、unsinged double类型变量加前缀ud,如unsinged double udVal;

   11、short int类型变量加前缀si,如short siVal;

   12、unsinged short类型变量加前缀usi,如unsinged short usiVal;

   13、如果定义一个bool类型的变量加前缀b,如int bFlag;char bFlag;

   14、如果定义的是一个字符串类型char[],

      如果字符串是需要以0结束符的字符串,则char szCountry[11+1];

      这种情况下的字符数组的大小写法是字符个数+1的

      如果字符串不需要以0结束符的,则char sCountry[11];

   15、如果定义的是一个字符串类型char *,

      如果字符串是需要以0结束符的字符串,则char pszCountry[11+1];

      这种情况下的字符数组的大小写法是字符个数+1的

      如果字符串不需要以0结束符的,则char psCountry[11];

   16、如果是一个指针类型,

      如果指针变量是通过malloc动态获取内存的,则int * piValPtx;

      Ptx代表这个变量是需要动态释放内存

      如果指针变来那个不是动态获取内存的,则int piValPtr;

      如果带上了Ptr或者Ptx的后缀,则前缀的p可省略

   17、项目的命名

      在公司内唯一

   18、文件的命名

      如果某些文件是项目唯一使用的,文件名称加上“项目名称简写”+ “_“作为前缀

   19、接口函数命名

      如果写的是库,则库接口则应该是库名称加上“项目名称简写”+ “_“作为前缀

   20、防止头文件重复使用宏命名

      项目名称简写”+ “_“ + “文件名" + “_“ + “H"


更新关注:http://weibo.com/hanjunqiang  新浪微博!手机加iOS开发者交流QQ群: 446310206


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/396633.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ajax登录验证的原理,ajax用户登录验证-get和post提交方式,与工作原理—2018-8-15...

ajax用户登录验证:实例html>Ajax实战:表单验证用户登录邮箱: 密码: 提交let btn document.getElementsByTagName(button)[0];btn.onclick function () {//1.创建xhr对象let xhr new XMLHttpRequest();//2.监听响应状态xhr.onreadystatechange function(){// …

将Python脚本打包成可执行文件

Python是一个脚本语言,被解释器解释执行。它的发布方式: .py文件:对于开源项目或者源码没那么重要的,直接提供源码,需要使用者自行安装Python并且安装依赖的各种库。(Python官方的各种安装包就是这样做的&a…

float foo=42e1为什么错_为什么重写了equals()也要重写hashCode()

小Hub领读:虽然是很基础的一篇文章,但是对于equals、hashcode两个方法,相信很多人都与其中的规则不熟悉,来跟着小Hub花个8分钟回顾一下!作者:不学无数的程序员https://my.oschina.net/u/4030990/blog/31341…

ssh客户端_一款基于TAS框架的SSH客户端蠕虫

TEA是一款基于TAS框架的SSH客户端蠕虫,从本质上说,它是一个仿冒的SSH客户端,它能够修改tty输入/输出来实现任意命令执行,或通过SSH连接来上传自身以实现渗透感染。为了实现该工具的正常功能,远程主机需要满足以下条件&…

Selenium入门11 滚动条控制(通过js)

这一节要有js基础。做web端的UI自动化必须要有html,css,javascript前端基础。 滚动条控制: 1 移动垂直滚动条 document.documentElement.scrollTop 2 移动垂直滚动条 document.documentElement.scrollLeft 3 找到某个元素,移动到可…

Qt之QNetworkInterface

简述 QNetworkInterface类负责提供主机的IP地址和网络接口的列表。 QNetworkInterface表示了当前程序正在运行时与主机绑定的一个网络接口。每个网络接口可能包含0个或多个IP地址,每个IP地址都可选择性地与一个子网掩码和/或一个广播地址相关联。这样的列表可以通过…

第二周计划

上周计划回顾 3.5 ~ 3.11 数据: 评师网爬取,完成:2k条记录 finished后端 数据结构 技术选型 学校API封装未完成:后端负责人出差 工作暂停产品 功能设计:主要功能提交:原型图 几个页面 每个页面大概功能完成…

python编程软件排行榜_PYPL 9月编程语言排行榜发布 Python一枝独秀

开发者可以将 PYPL 作为一个参考,决定学习何种语言或 IDE,或者在新的软件项目中使用何种语言或数据库。9 月份的榜单如下:前五名分别是 Python、Java、JavaScript、C# 与 PHP。相比去年 9 月份的数据,除了 Python 大幅上涨了 4.5%…

分享到系统面板_win7电脑没有nvidia控制面板怎么办【解决方法】

我们在使用电脑的时候,当电脑显卡出现问题导致屏幕画面不清晰时,可以使用win7系统自带nvidia控制面板,它能够对显卡进行设置,提升显卡功能,不过很多电脑用户点击nvidia控制面板时却提示nvidia显示设置不可用&#xff0…

Python之数据加密与解密(hashlib、hmac、random、base64、pycrypto)--转载

本文内容 数据加密概述Python中实现数据加密的模块简介hashlib与hmac模块介绍random与secrets模块介绍base64模块介绍pycrypto模块介绍总结参考文档提示: Python 2.7中的str是字节串,而Python 3.x中的str是字符串。本文中的代码都是通过Python 2.7实现的…

day3-文件操作之基本操作

一、文件的基本操作 文件内容: Somehow, it seems the love I knew was always the most destructive kind 不知为何,我经历的爱情总是最具毁灭性的的那种 Yesterday when I was young 昨日当我年少轻狂1、read() 当read()函数中传入整数(int)参数&#…

QT连接多种数据库f方法及测试

QT提供了对多种数据库的访问支持,对SQL Server也可以通过ODBC来进行访问。要想顺利访问SQL Server。 首先要保证以下几点:1. QT编译时已经编译了QtSql2. 编译了ODBC插件。可以通过 configure -plugin-sql-odbc来保证,也可以单独编译~/src/plu…

服务器如何实现电脑无线桥接,无线路由器WDS桥接成功副路由器下电脑无法上网怎么办【解决方法】...

摘 要无线WDS桥接设置完成后,在副路由器管理面,运行状态 无线状态 中,WDS状态显示成功,但电脑通过副路由无法上网。该问题可能与主、副路由器的设置有关,如下图所示: 解决办法: 排查一&#xff…

spad 探测器_从光到光子—“单光子”探测器

光电探测器光电探测器是指在光辐射作用下将其非传导电荷变为传导电荷的一类器件。在电子学中,二极管是一种具有不对称传输特性的双端电子元件,在一个方向上对电流具有低(理想为零)电阻,在另一个方向上具有高(理想为无限)电阻。最常见的类型如…

天地图专题五:在天地图上绘制电子区域并保存数据

版权声明:本文为博主原创文章,转载请注明出处。 上一文章讲了如何在天地图上显示坐标轨迹。 本文介绍如何在天地图上绘制电子区域(电子范围或电子栅栏),并且,我们要将我们绘制的电子区域的坐标数据保存到数…

Mysql中natural join和inner join的区别

假设有如下两个表TableA,TableB TableA TableB Column1 Column2 Column1 Column3 1 2 1 3TableA的Column1列名和TableB的Column1列名相同。 SELECT * FROM TableA INNER JOIN TableB USING (Column1) SEL…

微信和支付宝的服务器在哪里,手机恢复出厂设置,里面支付宝与微信怎么办?原来数据在这里...

当手机使用一段时间之后,因为硬件落后会出现卡顿、内存不足等情况,这个时候提高手机速度最直接的一个办法就是恢复出厂设置,虽然不能从根源上解决问题,但是还是可以凑合个半年时间的。那么这个时候就出现一个问题,手机…

python线上编辑问题_python django - static文件处理与线上部署测试

static文件相关操作涉及:a. 文件位置与访问路径映射b. setting.py与static相关配置STATIC_URLSTATIC_ROOTSTATICFILES_DIRSc. html中对于static文件引用方式d. python manage.py collectstatic1. 开发环境-目录结构2. setting.py 设置STATIC_URL /static/# STATIC_…

android arcgis 绘制圆_arcgis for android 定位 圆

不多说直接代码 ,群里人共享的方法一: /*** 绘制圆,配合 cleargraphicLayer()清除** param center 圆心* param radius 半径* param alpha 填充的透明度 0-100* param fillColor 填充的颜色*/public void DrawCircle(Point center, double radius, int a…

CreateSolidBrush

[声明] WINGDIAPI HBRUSH WINAPI CreateSolidBrush(COLORREF color); [功能] 初始化一个指定颜色的画刷。画笔可以随后被选为任何设备上下文的当前刷子。 [参数表] color 画刷的颜色[返回值] Long,如函数执行成功,就返回指向新画笔的一个句柄&#xff1b…