精华内容
下载资源
问答
  • 一个项目的流程:1、公司市场人员与客户交流,了解客户、引导客户使用公司最优资源并产出一份市场需求文档2、公司需求人员(BA)与客户交流,了解客户需求并产出一个软件需求文档3、项目经理、开发小组成员、需求...
    一个项目的流程:

    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


    展开全文
  • C语言小程序架构

    2017-11-26 22:19:00
    c语言架构,里面包括了基本的程序架构的一些东东,可以用于实际项目中去。
  • C语言项目开发系列视频课程

    千人学习 2018-01-12 18:38:01
    项目开发流程: 1)需求分析 2)数据结构分析 3)代码架构分析 4)编写代码 5)测试发布 6)迭代更新 1、小说阅读器 做一个属于自己的阅读器,你想添加的功能分章显示、空格翻页、历史浏览记录…… 2、学员管理系统 ...
  • 这个项目基本以看源码为主,主要是给自己的c语言结个尾,之后有两个github的项目重点去练习,因为不是自己没写,就不放源码了,需要的可以私信或者评论,我私发. 项目来源:老九君 项目名称:精忠报国之笑傲江湖 视频课地址:...

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-inehfiQc-1584246523757)(:/c0a992273939428ea0848d86e15b6ecf)]

    这个项目基本以看源码为主,主要是给自己的c语言结个尾,之后有两个github的项目重点去练习,因为不是自己没写,就不放源码了,需要的可以私信或者评论,我私发.

    项目来源:老九君

    项目名称:精忠报国之笑傲江湖

    视频课地址:网易云课堂

    基本功能/架构:

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存6546854)(:/c0a992273939428ea0848d8,源站可能有防盗链机制,建议将图片保存下来直接上传失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-XyqA8td9-1584246546856)(:/051047e905ff4bd5b8a36b7df246546857)(:/e504be615a334d4684555326bb5608)(unio/051047e905ff4bd5b8a36b7df7d65230)]


    第一天

    看了一下这个游戏的主要结构和函数定义

    [外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0Te3Xb73-1584246523762)(:/e504be615a334d4684555326bb553a18)]

    目录:
    1.union关键字


    1.union关键字

    代码如下

    /* 游戏道具 */
    typedef struct _prop{
        int id;
        char name[50];
        int level;
        PropType type;
        int stock;          //当前道具的数量
        union{
            int attack;     //如果是武器,就对应攻击力
            int defense;    //如果是防具,就对应防御力
            int power;      //如果是血瓶等消耗品,对应增加的能量值
        };
    
        double price;
        char desc[200];     //游戏道具描述
    
    • 简单来说,union是一种特殊的数据类型,主要作用是在相同的内存位置存放"多个"数据"成员中的"一个".
    • 但任何时候只能有一个成员带值(因为使用的是相同的内存位置),否则会进行覆盖(下面讲访问时会有实例),覆盖时从union首地址开始
    • 定义方式与struct类似,标签和变量均为可选
    	union tag
    	{
    	   member definition;
    	   member definition;
    	   ...
    	   member definition;
    	} variables;
    
    • union占用的内存大小由最大的成员大小决定,如下union将占用20个字节的内存空间
    	union Data
    	{
    	   int i;
    	   float f;
    	   char  str[20];
    	} data;
    
    • 使用成员访问运算符(.)来访问union成员,data是上面定义,输出结果中由于int和float都被str覆盖了,所以只有str正常输出
       data.i = 10;
       data.f = 220.5;
       strcpy( data.str, "C Programming");
     
       printf( "data.i : %d\n", data.i);
       printf( "data.f : %f\n", data.f);
       printf( "data.str : %s\n", data.str);
       
       //输出结果
       data.i : 1917853763
       data.f : 4122360580327794860452759994368.000000
       data.str : C Programming
    
    参考:
    展开全文
  • 为什么80%的码农都做不了架构师?>>> ...

    2011-12-29

    简单的说其实要理解C文件与头文件(即.h)有什么不同之处,首先需要弄明白编译器的工作过程,一般说来编译器会做以下几个过程:

    编译器原理

    1.预处理阶段

    2.词法与语法分析阶段

    3.编译阶段,首先编译成纯汇编语句,再将之汇编成跟CPU相关的二进制码,生成各个目标文件 (.obj文件)

    4.连接阶段,将各个目标文件中的各段代码进行绝对地址定位,生成跟特定平台相关的可执行文件,当然,最后还可以用objcopy生成纯二进制码,也就是去掉了文件格式信息。(生成.exe文件)

    编译器在编译时是以C文件为单位进行的,也就是说如果你的项目中一个C文件都没有,那么你的项目将无法编译,连接器是以目标文件为单位,它将一个或多个目标文件进行函数与变量的重定位,生成最终的可执行文件,在PC上的程序开发,一般都有一个main函数,这是各个编译器的约定,当然,你如果自己写连接器脚本的话,可以不用main函数作为程序入口!!!!

    (main .c文件 目标文件 可执行文件 )
    实例解说
    有了这些基础知识,再言归正传,为了生成一个最终的可执行文件,就需要一些目标文件,也就是需要C文件,而这些C文件中又需要一个main函数作为可执行程序的入口,那么我们就从一个C文件入手,假定这个C文件内容如下:

    #include <stdio.h>

    #include "mytest.h"

    int main(int argc,char **argv)

    {

    test = 25;

    printf("test.................%d\n",test);

    }

    头文件内容如下:

    int test;

     

    现在以这个例子来讲解编译器的工作:

    1.预处理阶段:编译器以C文件作为一个单元,首先读这个C文件,发现第一句与第二句是包含一个头文件,就会在所有搜索路径中寻找这两个文件,找到之后,就会将相应头文件中再去处理宏,变量,函数声明,嵌套的头文件包含等,检测依赖关系,进行宏替换,看是否有重复定义与声明的情况发生,最后将那些文件中所有的东东全部扫描进这个当前的C文件中,形成一个中间“C文件”

     

    2.编译阶段,在上一步中相当于将那个头文件中的test变量扫描进了一个中间C文件,那么test变量就变成了这个文件中的一个全局变量,此时就将所有这个中间C文件的所有变量,函数分配空间,将各个函数编译成二进制码,按照特定目标文件格式生成目标文件,在这种格式的目标文件中进行各个全局变量,函数的符号描述,将这些二进制码按照一定的标准组织成一个目标文件

     

    3.连接阶段,将上一步成生的各个目标文件,根据一些参数,连接生成最终的可执行文件,主要的工作就是重定位各个目标文件的函数,变量等,相当于将个目标文件中的二进制码按一定的规范合到一个文件中再回到C文件与头文件各写什么内容的话题上:理论上来说C文件与头文件里的内容,只要是C语言所支持的,无论写什么都可以的,比如你在头文件中写函数体,只要在任何一个C文件包含此头文件就可以将这个函数编译成目标文件的一部分(编译是以C文件为单位的,如果不在任何C文件中包含此头文件的话,这段代码就形同虚设),你可以在C文件中进行函数声明,变量声明,结构体声明,这也不成问题!!!那为何一定要分成头文件与C文件呢?又为何一般都在头件中进行函数,变量声明,宏声明,结构体声明呢?而在C文件中去进行变量定义,函数实现呢??原因如下:
    1.如果在头文件中实现一个函数体,那么如果在多个C文件中引用它,而且又同时编译多个C文件,将其生成的目标文件连接成一个可执行文件,在每个引用此头文件的C文件所生成的目标文件中,都有一份这个函数的代码,如果这段函数又没有定义成局部函数,那么在连接时,就会发现多个相同的函数,就会报错
    2.如果在头文件中定义全局变量,并且将此全局变量赋初值,那么在多个引用此头文件的C文件中同样存在相同变量名的拷贝,关键是此变量被赋了初值,所以编译器就会将此变量放入DATA段,最终在连接阶段,会在DATA段中存在多个相同的变量,它无法将这些变量统一成一个变量,也就是仅为此变量分配一个空间,而不是多份空间,假定这个变量在头文件没有赋初值,编译器就会将之放入BSS段,连接器会对BSS段的多个同名变量仅分配一个存储空间
    3.如果在C文件中声明宏,结构体,函数等,那么我要在另一个C文件中引用相应的宏,结构体,就必须再做一次重复的工作,如果我改了一个C文件中的一个声明,那么又忘了改其它C文件中的声明,这不就出了大问题了,程序的逻辑就变成了你不可想象的了,如果把这些公共的东东放在一个头文件中,想用它的C文件就只需要引用一个就OK了!!!这样岂不方便,要改某个声明的时候,只需要动一下头文件就行了
    4.在头文件中声明结构体,函数等,当你需要将你的代码封装成一个库,让别人来用你的代码,你又不想公布源码,那么人家如何利用你的库呢?也就是如何利用你的库中的各个函数呢??一种方法是公布源码,别人想怎么用就怎么用,另一种是提供头文件,别人从头文件中看你的函数原型,这样人家才知道如何调用你写的函数,就如同你调用printf函数一样,里面的参数是怎样的??你是怎么知道的??还不是看人家的头文件中的相关声明啊!!!当然这些东东都成了C标准,就算不看人家的头文件,你一样可以知道怎么使用.

    转载于:https://my.oschina.net/3pgp/blog/189926

    展开全文
  • 为什么80%的码农都做不了架构师?>>> ...

    2011年12月29日
    经常会在对源代码进行如何组织时犯难:
            1)头文件的内容应写些什么?
            2)函数的具体实现应放在哪个文件里?是否与头文件放在一处?
            3)自定义的头文件(.h)与定义函数(.c)是什么关系

    注意:此时你需要有一定的编译原理的基础。
    --------------------------------------------------------------------------------
    ====>  1)头文件里应写入的内容:xxx.h
                    1)预处理块 :即一些宏的定义相关的#define \#ifndef \#ifdef
                    2)函数和类结构【声明】
                    3)头文件开头处的版权和版本声明

    // 版权和版本声明见示例 1-1,此处省略。
     
    #ifndef GRAPHICS_H //  防止 graphics.h 被重复引用
    #define GRAPHICS_H
     
    #include <math.h>   //  引用标准库的头文件

    #include “myheader.h”  //  引用非标准库的头文件

    void Function1(…); // 全局函数声明

    class Box        // 类结构声明
    {

    };
    #endif

    ====>   2)函数的实现应单独放在一个文件里-------我们称为定义文件  xxx.c
                    1)  定义文件开头处的版权和版本声明
                    2)  对一些头文件的引用-----------可能引用标准的头文件,或是自定的头文件(这里所引用头文件的要点是:只要你能完成些功能即可,不管你是什么手段)
                    3)  程序的实现体(包括数据和代码)------
    // 版权和版本声明见示例 1-1,此处省略。
     
    #include “graphics.h” //  引用头文件

     
    // 全局函数的实现体
    void Function1(…)
    {

    }

    ====>  3) 头文件与函数定义没有直接的关系,(我们理解成好像各自为政的样子----------各作各的就行,函数定义最后是生成相应的库文件,即其也只编译到.o文件即可)
                    1)需要明白头文件的功能:
                            1)最主要是完成编译阶段的功能。   -I来完成

                    2)库文件--------当需要进行链接时,才会来查找对应函数的实现。 此时由 -l -L来共同完成


    ============================>说白了,在我们需要编写一个较大的可执行代码主要分为:
                    1)编写头文件
                    2)编写函数定义文件
                    3)编写可执行文件===即我们的main函数相关的代码。

    编写时:       

                     1)、2) =====》共同完库文件的工作
                     1)、3) =====》共同完成main文件的工作
                    ----------------------------------------------->>>>>>>>>>>>>>>>再共同完成可执行文件

    转载于:https://my.oschina.net/3pgp/blog/189925

    展开全文
  • Linux下C语言项目—聊天室的搭建1.0

    千次阅读 热门讨论 2017-08-30 13:54:53
    之所以为1.0,是因为虽然能运行,但有些地方的... 采用 Client/Server 架构 2. Client A 登陆聊天服务器前,需要注册自己的 ID 和密码 3. 注册成功后,Client A 就可以通过自己的 ID 和密码登陆聊天服务器 4. 多
  • 项目开发流程: 1)需求分析 2)数据结构分析 3)代码架构分析 4)编写代码 5)测试发布 6)迭代更新 1、小说阅读器 做一个属于自己的阅读器,你想添加的功能分章显示、空格翻页、历史浏览记录…… 2、学员管理系统 ...
  • 为什么80%的码农都做不了架构师?>>> ...
  • 基本功能/架构: 第三天 最后一天咯,诸位加油! 简易目录 1.控制每行打印字符数 2.完结感言 1.控制每行打印字符数 在项目中,地图描述信息打印时需要进行每行的字符数控制(就像下图),否则就会打...
  • 1、最高自己开源一个软件,最低的是在GitHub上的开源软件项目有过贡献。 2、出一本书,最低的是一本书籍做过贡献。 相关书籍 第一阶段:《代码大全》、《C现代编程》、《重构-改善现有代码》、《代码整洁之道》...
  • 本课程设计主要实现一个Linux下的局域网聊天工具的...两个部分都使用C语言,利用vim编辑器,通过Berkeley套接口编程实现相关功能。完成了一个可以运行在Linux平台下C/S架构的即时聊天系统,实现聊天的各种基本功能。
  • 单片机软件设计架构(C语言)

    万次阅读 2008-11-25 14:28:00
    C语言嵌入式系统编程修炼之一:背景篇不同于一般形式的软件编程,嵌入式系统编程建立在特定的硬件平台上,势必要求其编程语言具备较强的硬件直接...笔者在嵌入式系统项目的开发过程中,一次又一次感受到C语言的精妙,沉
  • 杨教授大学堂 精心创作的优秀程序员 职业提升必读系列资料 杨教授大学堂版权所有盗版必究 PAGE28/ NUMPAGES \* Arabic 29页 J2EE系统架构和程序设计课程设计实训项目基于Struts2 +Spring +Hibernate架构的客户资料...
  • 定制架构,编译器和虚拟机 这是Plotty ,这是我专门为The Fun OfLearning:registered:制作的一个辅助项目。 它具有可使用C语言编程的自定义体系结构(Plotty)。 它有编译器! 编译器是此编程的明星。 它是用C#...
  • [JNI]开发之旅(4)项目架构介绍

    千次阅读 2016-12-24 19:16:26
    首先,看一下项目的体系架构项目分为3个部分:java部分,c/c++部分,以及一个makefile文件。java部分:定义native方法,并加载动态连接库,当然还有我们项目的源码,class文件,res资源等。c/c++部分:包括.c或....
  • 基本功能/架构: 第二天 今天看得比较快,基本把这个项目结束了吧,明天再仔细看一下有没有遗漏的这项目就应该算是结束了.项目难度的话一般,主要是windows的函数调用以前不知道的话刚看可能会蒙头,同样需要源码的...
  • 项目地址:http://www.tok.cc/ 三段式架构:从编译器运行期间各模块的任务特点来看,由传统观点“前端”跟“后端”把架构分为两大模组以维护角度来说,如此划分来实现存在一些问题,主要体现在改变源语言或目标机器...
  • ARM的C语言

    2013-03-21 11:15:51
    本文档属于在实际应用中的C语言架构,是本人在实际应用ARM中的实际应用项目资料
  • ​ FastDFS是用c语言编写的一款开源的分布式文件系统,它是由淘宝资深架构师余庆编写并开源。FastDFS专为互联网量身定制,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等指标,使用FastDFS...
  • C语言中用于LTTS培训的一个小型项目 Build 资料夹结构 文件夹 描述 1_Requirements 详细说明需求和完成研究的文件 2_Architecture 详细说明所用架构的文档 3_Implementation 所有代码和相关文档 4_...
  • 概述 分布式文件系统:Distributed file system, DFS,又叫做网络文件系统:Network ...FastDFS是用c语言编写的一款开源的分布式文件系统,充分考虑了冗余备份、负载均衡、线性扩容等机制,并注重高可用、高性能等...
  • c语言项目 聊天室 TCP SELECT架构
  • C语言项目聊天室 TCP select架构
  • C语言学习开始

    2018-10-01 13:07:37
    高级架构师带你-零基础零障碍学习C语言(转) 一、C语言学习开始学习目的C 语言的学习方法初学者遇到问题的解决办法.老鸟遇到问题的解决办法写技术博客的重要性 学习目的 C 语言的学习方法 1.不要刻意...

空空如也

空空如也

1 2 3 4 5 ... 18
收藏数 357
精华内容 142
关键字:

c语言项目架构

c语言 订阅