Highfiresun-ERP software|EBAsys|Balance|Shop management|Order management|Warehouse management|SKU|Lottery|POS|Retail|Logistics|Billing software
 Industry management
 Electronic commerce
 lottery
 Financial
 software tools
Enterprise bank reconciliation system - standard version
(providing video teaching)
 
Development

Creater:Administrator  Create time:2011-11-4  Browse times:1184
 

    完善了需求分析报告和方案建议书后,进入具体的开发阶段。主要有以下工作需要实施:

    1、具体化数据库物理模型,包括字段的命名、类型、编辑风格、显示风格、约束等等,通过PD生成数据库。

    2、具体化客户端逻辑图,包括类的继承、引用关系,类成员和方法的定义,最后导入到开发工程中。

    3、数据库框架和客户端框架选型,导入框架的基础模型,这一步正是‘框架链’的核心工作。

    4、具体功能模块的实现,开发过程中不断做好单元测试。项目结束后,进行整体联合测试。

    开发阶段是项目实现的关键阶段,开发质量的高低直接关系到系统的运行效率和用户体验。代码编写有严格的规范,下面是公司代码规范要求:

    (一)数据库设计规范

       1、数据完整性设计
          实体完整姓:主键
          参照完整性:父表中删除数据时:级联删除,受限删除,置空值;
父表中插入数据:首先插入,递归插入;父表中更新数据:级联更新,受限更新,置空值;

          用户定义完整性:NOT NULL,CHECK,触发器,RULE。

       2、用约束强制数据的完整性

          例如,邮政编码、邮件都有一定规则的格式,可以通过后台约束来保证数据的完整性,而非商业规则。

       3、强制指示完整性

          在非法数据进入数据库之前将之剔除。

       4、使用查找控制数据完整性

          对于固定范围的数据,有专门维护的地方,在业务界面中无法输入而只能选择。例如审批结果、国家代码、行政区域等等。

       5、采用视图

          为了在数据库和应用程序之间提供一层抽象,可以为应用提供专门的查询视图而非直接访问数据表。

       6、命名规范

          表名、字段名、视图、存储过程、函数、触发器的命名非常重要,我公司有严格的命名规范:

          表名:以Tx_XXXXX格式命名,例如产品信息表,T1_Product。

          字段名:以Tx_开头,后面是字段名,例如产品信息表,T1_Product(T1_ProductId,T1_ProductName)。

 

    (二)代码编程规范:

2.1 总原则
    代码以清晰易懂为佳;保持软件各种性能的均衡,不与代码的稳定性相矛盾。
2.2 布局
2.2.1 基本格式
      函数规模尽量限制为一屏,即不需要滚动或翻页就可以完整阅读。以标准的1024*768分辨率屏幕,标准Windows字体为例,一个函数应限制为约50行120列,对于某些流程简单但代码较多的函  数可以适当放宽要求(比如信令解码函数)。程序块的边界符号{ 和 }各自占用单独的一行,即采用
if( hFile = CreateFile(
   fileName,
   lpDs,
   lpDs,
   NULL,
   NULL))
{
   DoSomething();
   CloseFile(hFile);
}
而不采用
if( hFile = CreateFile(
   fileName,
   lpDs,
   lpDs,
   NULL,
   NULL)){
   DoSomething();
   CloseFile(hFile);
}

2.2.2 缩进对齐
2.2.2.1 代码按照逻辑层次缩进书写,每一层次缩进规则

嵌入软件每一层次的缩进2个字符位置(使用空格)。PC端的缩进为4个字符位置(建议使用TAB)。
2.2.2.2 罗列式赋值,最好将等号对齐,例如

Phonebook.name    = name;
Phonebook.number  = number;
Phonebook.index   = index;

2.2.2.3 函数或过程的开始、结构的定义及循环、判断等语句中的代码都要采用缩进风格,case语句下的情况处理语句也要遵从语句缩进要求
switch ( ret_type )
{
case RET_OK:
    // TODO:
    break;
default:
    // TODO:
    break;
}

2.2.2.4 预编译代码使用与一般代码统一的缩进方式
例如:
if ( a > b )
{
#ifdef FEATURE1
    c = DEF1;
#else
    c = DEF2;
#endif /* FEATURE1 */
}

2.2.3 空格
2.2.3.1 逗号、分号只在后面加空格
例如:
int a, b, c;

2.2.3.2 比较操作符, 赋值操作符"="、 "+=",算术操作符"+"、"%",逻辑操作符"&&"、"&",位域操作符"<<"、"^"等双目操作符的前后加空格。
例如:
if ( current_time >= MAX_TIME_VALUE )
a = b + c;
a *= 2;
a = b ^ 2;

2.2.3.3 “!”、 “~”、 “++”、 “—”、“&”(地址运算符)等单目操作符前后不加空格
例如:
*p = 'a'; // 内容操作"*"与内容之间
flag = !isEmpty; // 非操作"!"与内容之间
p = &mem; // 地址操作"&" 与内容之间
i++; // "++","--"与内容之间

2.2.3.4 “->”、 “.”前后不加空格
例如:
p->id = pid; // "->"指针前后不加空格

2.2.3.5 if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。
例如:
if ( (a >= b) && (c > d) )

2.2.4 分行
较长的语句(超过120列)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
例如:
perm_count_msg.head.len = NO7_TO_STAT_PERM_COUNT_LEN
                                + STAT_SIZE_PER_FRAM * sizeof( _UL );

2.3 注释
2.3.1 代码内部注释
由于现在的几乎所有的C编译器都支持 // 作为注释,所以单行统一使用 // ,多行使用/* */注释。
2.3.2 外部注释
提供给外部使用的接口(函数声明、类型定义)是客户和服务代码间的协议承载者,需要进行详细的注释。
底层嵌入端编程,注释风格参照高通注释规则。其他借鉴Java和C#的经验,为了可以从注释中直接提取完整的接口文档,接口注释采用C/C++文档自动生成工具Doxygen的注释风格。
例如:
/*!***************************************************
* @file                                         
* 文件注释…                                    
* 文件注释…                                    
******************************************************/

string name; //!< 单行注释

/*!*****************************************************
* 函数注释
* @param arg 参数
* @return 返回值说明
*******************************************************/
int foo(int arg);
更详细注释方式参阅Doxygen用户手册
2.3.3 注释要求
所有的对外接口(包括函数、类型、全局对象等)都要求有详尽的注释,有特殊处理的地方也必须详细注释。局部帮助函数可以不注释,但要求用名称清晰表达其作用。注释不能代替文档,系统结构、复杂算法等应该以独立文档的形式单独撰写,但需要在注释中注明文档名称或准确位置,作为引用。
注释必须与代码同步更新,注释量需要达到代码量的30%。
2.4 命名
2.4.1 命名原则
底层嵌入端编程命名规范原则上与高通代码风格保持一致。其他原则上采用微软的匈牙利命名法,即类型前缀+单词首字母大写短语。符号作用范围越大,命名越严格,对于局部对象,则可以相对自由,但要表意清晰,可以使用部分缩写形式,但同样要求清晰。

2.4.2 对象命名
底层嵌入端编程对象命名采用以下划线分割的小写单词组合形式,如
my_variable
其他对象命名则采用类型前缀+单词首字母大写对象名形式。全局对象使用g_作为前缀(global),静态对象使用s_作为前缀(static)。对C++,class的成员函数应该以m_作为前缀(member)。
例如:
string strName;
static int  s_iConnectionStatus;
char g_szBuffer[1024]

2.4.3 typedef类型命名
类型定义根据一般命名指导,通常用_type附加在类型定义的名字上。
结构类型命名如下:
typedef struct
{

} subsystem_name_s_type;
枚举类型命名如下:
typedef enum
{

} subsystem_name_e_type;
联合类型命名如下:
typedef uion
{

} subsystem_name_u_type;

2.4.4 函数命名
函数一般用动词或动宾结构或判断性短语来命名。
嵌入端编程目前采用ANSI的C语言,为避免名字冲突,需要使用模块名称作为前缀来限定函数的作用范围。函数命名采用下划线分割的小写单词组合形式。
例如:
void cmcall_send_orig(cmcall_s_type  *call_ptr);
其他环境遵循单词首字母大写的匈牙利命名规则。
例如:
PushToQueue(TCommand* pCmd, CCommandQ* pQueue);
Excute(const string* pStrAppName);

2.4.5 宏定义命名
宏的命名使用全大写、下划线分隔符的方式
例如:
#define PARM_SEND_MSG  0x01

2.4.6 FEATURE命名
FEATTURE开关的命名使用全大写、下划线分隔符的方式,并且以FEATURE_HFS_开头。
例如:
#define FEATURE_HFS_COMPANYNAME



[返回5S列表]
Scan then enter wechat Simplified Chinese English
ZOL DownLoad
Copyright© shenzhen highfiresun Co.,Ltd The station all pictures and texts are all rights reserved, ripping copy
Q Q:2033159764、664711737
Email :highfiresun@163.com