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

简介: 一个项目的流程:1、公司市场人员与客户交流,了解客户、引导客户使用公司最优资源并产出一份市场需求文档2、公司需求人员(BA)与客户交流,了解客户需求并产出一个软件需求文档3、项目经理、开发小组成员、需求人员(BA)一起开一个需求评审会议,对不合理的地方,   打回给BA,再由BA与客户沟通4、程序员接到和充分了解软件需求文档后产生软件设计文档(包括概要设计文档和详细设计文档,   涉及到数据库的还需要进行数据库的设计)5、程序员根据设计文档进行编码、调试、打包发布。
一个项目的流程:

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


目录
相关文章
|
7月前
|
消息中间件 监控 前端开发
如何开发项目管理系统中的项目结项板块?(附架构图+流程图+代码参考)
在企业项目管理中,“项目结项”是关键环节,常因流程不清、文档不全、审批滞后等问题导致交付困难。本文介绍如何通过“项目结项”模块实现线上化管理,涵盖结项申请、审批流程、成果上传、权限控制等功能,帮助团队高效完成项目收尾,避免成果丢失与流程混乱。内容包括功能设计、业务流程、系统架构、数据库设计、核心代码实现、前端交互及优化建议,助力项目管理系统快速落地并稳定运行。
|
6月前
|
人工智能 自然语言处理 JavaScript
Github又一AI黑科技项目,打造全栈架构,只需一个统一框架?
Motia 是一款现代化后端框架,融合 API 接口、后台任务、事件系统与 AI Agent,支持 JavaScript、TypeScript、Python 多语言协同开发。它提供可视化 Workbench、自动观测追踪、零配置部署等功能,帮助开发者高效构建事件驱动的工作流,显著降低部署与运维成本,提升 AI 项目落地效率。
615 0
|
7月前
|
数据挖掘 项目管理 Python
如何开发项目管理系统中的项目启动板块?(附架构图+流程图+代码参考)
本文介绍了项目管理系统中“项目启动”板块的设计与实现,涵盖功能模块、业务流程、开发技巧及效果展示,并提供代码参考和常见问题解答,助力企业高效搭建项目管理平台。
|
7月前
|
缓存 Java 数据库
Java 项目分层架构实操指南及长尾关键词优化方案
本指南详解基于Spring Boot与Spring Cloud的Java微服务分层架构,以用户管理系统为例,涵盖技术选型、核心代码实现、服务治理及部署实践,助力掌握现代化Java企业级开发方案。
358 2
|
7月前
|
存储 Java 数据库连接
简单学Spring Boot | 博客项目的三层架构重构
本案例通过采用三层架构(数据访问层、业务逻辑层、表现层)重构项目,解决了集中式开发导致的代码臃肿问题。各层职责清晰,结合依赖注入实现解耦,提升了系统的可维护性、可测试性和可扩展性,为后续接入真实数据库奠定基础。
593 0
|
7月前
|
监控 前端开发 BI
如何开发项目管理系统中的项目收支板块?(附架构图+流程图+代码参考)
本文深入讲解项目管理系统中项目收支模块的设计与实现,涵盖预算、收入与支出管理,以及报表分析功能。内容包括模块功能概述、业务流程、开发技巧与实现方法,并提供数据库设计及前后端代码示例,助力企业打造高效的项目财务管控系统。
|
7月前
|
SQL 前端开发 项目管理
如何开发项目管理系统中的项目执行板块?(附架构图+流程图+代码参考)
随着企业项目规模扩大,传统管理方式已难以满足需求。本文介绍项目管理系统中“项目执行”板块的开发,涵盖任务管理、创建、验收及进度汇报等核心环节。通过功能设计、业务流程和开发技巧,结合代码示例,帮助企业高效推进项目执行,提升管理效率。
|
8月前
|
设计模式 开发者
一、HarmonyOS Next 开发者手册项目之项目架构设计
该项目是一个基于HarmonyOS Next的开发者学习手册应用,旨在帮助开发者系统学习HarmonyOS开发知识。项目采用分级学习方式,从基础到高级逐步深入讲解技术与实践案例。前四章重点介绍应用架构相关内容,助力快速掌握应用核心。 项目结构清晰,包含主入口、源代码目录、公共资源和工具等。页面导航分为多个阶段:萌新小白(基础入门)、登堂入室(进阶学习)、进阶高手(高级开发)。支持Markdown解析,使用`@luvi/lv-markdown-in`插件展示内容,并定义了多种数据结构以规范开发流程。 源码已开源,持续更新中
232 1
|
11月前
|
存储 数据采集 机器学习/深度学习
新闻聚合项目:多源异构数据的采集与存储架构
本文探讨了新闻聚合项目中数据采集的技术挑战与解决方案,指出单纯依赖抓取技术存在局限性。通过代理IP、Cookie和User-Agent的精细设置,可有效提高采集策略;但多源异构数据的清洗与存储同样关键,需结合智能化算法处理语义差异。正反方围绕技术手段的有效性和局限性展开讨论,最终强调综合运用代理技术与智能数据处理的重要性。未来,随着机器学习和自然语言处理的发展,新闻聚合将实现更高效的热点捕捉与信息传播。附带的代码示例展示了如何从多个中文新闻网站抓取数据并统计热点关键词。
542 2
新闻聚合项目:多源异构数据的采集与存储架构
|
10月前
|
存储 人工智能 自然语言处理
Cursor这类编程Agent软件的模型架构与工作流程
编程Agent的核心是一个强大的大语言模型,负责理解用户意图并生成相应的代码和解决方案。这些模型通过海量文本和代码数据的训练,掌握了广泛的编程知识和语言理解能力。
1038 1