4GL语言开发原则及规范简化版.docx
- 文档编号:25979284
- 上传时间:2023-06-16
- 格式:DOCX
- 页数:20
- 大小:24.41KB
4GL语言开发原则及规范简化版.docx
《4GL语言开发原则及规范简化版.docx》由会员分享,可在线阅读,更多相关《4GL语言开发原则及规范简化版.docx(20页珍藏版)》请在冰豆网上搜索。
4GL语言开发原则及规范简化版
4GL语言开发原则及规范
中科软件股份有限公司
2002年04月27日
1编码规范
1.1命名规范
1.1.1对象命名
1.1.1.1数据库命名规范
●数据库名长度:
不超过INFORMIX规定长度(十八位);
●采用英文形式,规则如下:
数据库名由两部分组成:
系统名+DB;
举例:
财产保险业务处理系统的数据库命名为:
PrpInsDB
系统名由英文单词构成,每个单词首字母大写,单词可采取缩写形式;
●附表提供的词根表作为构词的唯一依据。
●本小节规范适用于各种语言版本的系统。
1.1.1.2数据库表命名规范
●数据库表名长度:
不超过INFORMIX规定长度(十八位);
●采用英文和“_”组成形式,规则如下:
数据库表名由三部分组成:
系统名+业务类型+表的英文名(+“_”+子对象名),业务类型用1位大写字母表示,如承保业务为C、批改业务为P、理赔业务为L、收付费业务的数据表为J、通用代码为D;
举例:
财产保险承保保单基本信息表命名为:
PrpCmain;
货物运输保险保单信息表(继承了保单基本信息):
PrpCmain_Cargo。
●业务类型采用附表提供的词根表中规定的字母;
表名由英文单词构成,保险类别和业务类型的首字母大写,表的英文名采取小写形式,单词可采取缩写形式;
●当一个对象继承主对象时,体现在数据表上则使用“_”分割;
举例:
PrpCmain_Cargo:
货物运输保险保单信息表,继承了保单基本信息。
附表提供的词根表作为构词的唯一依据。
●本小节规范适用于各种语言版本的系统。
1.1.1.3数据库字段命名规范
●字段长度:
不超过INFORMIX规定字段长度(十八位);
●采用英文形式,规则如下:
1.字段名由英文单词构成,每个单词首字母大写;
举例:
保单号码:
PolicyNo
2.一个字段名所用的单词不超过5个,在字段名不超过规定长度的情况下,尽量采用英文单词的全称;
3.在字段名总长度超长的情况下,不缩略核心单词,其他单词缩略不短于3个字母;
4.形容词定语放在所修饰名词的后面;
举例:
损失金额:
SumLoss
●附表提供的词根表作为构词的唯一依据。
●本小节规范适用于各种语言版本的系统。
1.1.1.4程序(文件)模块命名
●长度:
不超过INFORMIX规定长度(十位);
●采用英文形式,规则如下:
以对象名开头(第一个字母大写),后接对象操作名(第一个字母大写);
●命名规则:
ObjectOpt.4gl其中,Object是对象名。
数据层默认为基本表名。
如果表名超过10位。
则按照缩略规则执行。
●BL层模块划分及命名:
原则上每个BL层的对象对应两个模块,一个对象主模块,一个模块存放归属于该对象的模块变量。
当且仅当主模块中内容过多时,按照如下规则划分:
objectRd.4gl:
存放涉及到查询(读)数据库的服务函数
objectWt.4gl:
存放涉及到更新(写)数据库的服务函数
objectTx.4gl:
存放事务服务函数
objectLg.4gl:
存放不涉及数据库操作的服务函数
●DB层模块划分及命名:
全局动态数组(DE):
对于数据层的实体对象服务模块,它们一般由工具生成,文件名一般要与实体对象名一致,除非表名超过10位,此时参考词根表进行命名。
注意表名或者词根表是命名仅有的参考依据。
另外,除了通用服务以外,有些实体对象需要一些扩展的服务,这些服务放在实体对象服务模块的最后定义;
1.1.1.5函数命名规范
采用由大小写英文字母和“_”组成方式,规则如下;
●直接调用的工具函数命名公式
pub_”+”对象名”+”_”+“函数名”
其中:
对象名和函数名区分大小写
●对象服务函数命名
由于INFORMIX-4GL语言不是面向对象的开发语言,因而在程序设计中的对象服务是以函数的方式体现的;
●一般函数命名公式:
作用范围+”_”+对象名+”_”+对象的方法
其中:
作用范围包括pub/pri,对象名和方法名区分大小写
举例:
逻辑层险种对象BLPrpDrisk的增加操作add所对应的函数名为:
pub_BLPrpDrisk_Add
数据层代码对象DBPrpDcode的delete操作所对应的函数名为:
pub_DBPrpDcode_Delete
界面层保单对象UIPolicy的录入操作对应的函数名为:
pub_UIPolicy_Input
事务型的函数(或模块)命名规范参见3.2.5(数据库事务编写约定)
●数据层扩展服务函数命名:
如果存在某数据表TableName的数据层服务,其功能是获取表中某字段ColumnName的最大值,则该数据层服务函数名定义为:
pub_DBTableName_GetMaxColumnName
如果某两层结构数据表TableName的字段名为Col,现存在数据层服务,其功能是根据Col删除表中数据,则该数据层服务函数名定义为:
pub_DBTableName_DeleteByCol
如果某两层结构数据表TableName主键为id和no,每个id下包括若干no,现存在数据层服务,其功能是根据id删除表中数据,则该数据层服务函数名定义为:
pub_DBTableName_DeleteByIN
如果某数据表TableName主键为id、no和col,现存在数据层服务,其功能是根据id和no删除表中数据,则该数据层服务函数名定义为:
pub_DBTableName_DeleteByINC
也就是说,此时只取涉及的字段的首字母,写在函数名的最后。
1.1.1.6屏幕表格命名
●屏幕FORM名应与相关数据表或主调用文件保持一致;
●采用英文形式,规则如下:
以对象名开头(第一个字母大写),后接对象操作名(第一个字母大写);
命名规则:
ObjOpt.per,其中Obj是对象名,Opt是对象操作名。
举例:
“主保单录入”屏幕表格名称为CmainInp.per
“保单查询”屏幕表格名为CmainQry.per
“保单清单显示”屏幕表格名为CmainLst.per
如果一个屏幕表格被用于录入、查询等多种功能,功能名为:
main;
举例:
主保单录入、查询的通用屏幕表格名为:
CmainMain.per
如果一个屏幕表格被用于非录入、查询等多种功能,功能名为:
pub。
举例:
主保单非录入、查询的通用屏幕表格名为:
CmainPub.per
●屏幕记录:
以小写字母命名,形式为sc_tablename
●屏幕数组:
以小写字母命名,形式为sa_tablename
1.1.1.7窗口和游标命名
采用由小写英文字母和“_”组成方式,规则如下;
●窗口命名
以功能名开头,后接win,以“_”分隔。
举例:
某项功能需要以屏幕表格的方式打开窗口,该功能主要实现权限记录的增加。
功能名为grade_add,则窗口命名为:
grade_add_win。
OPENWINDOWgrade_add_winAT2,2
WITHFORM“GradeMain”
……
CLOSEWINDOWgrade_add_win
●游标命名
游标的命名规则同窗口,只不过以cur结尾;
举例:
某功能需以预处理+游标的方式从表prpgrade获取数据。
设功能名为prpgrade_sel,则预处理命名为:
prpgrade_sel_pre,游标命名为prpgrade_sel_cur
PREPAREprpgrade_sel_preFROMlv_sql
DECLAREprpgrade_sel_curCURSORFORprpgrade_sel_pre
FOREACHprpgrade_sel_curINTOsel_var_list
ENDFOREACH
如果在同一个程序模块内,游标的命名重复,可在结尾处加序号与以区别,序号从1开始,依次递增。
1.1.2常量和变量命名
命名公式:
常量名称=变量作用域前缀+变量类型+’_’+自定义名称
注意:
自定义名称要有一定的意义且整个常量名称全部大写
变量名称=变量作用域前缀+变量类型+’_’+自定义名称
注意:
自定义名称要有一定的意义且整个常量名称全部小写
除了对象之外,常量和变量也需要良好格式的命名约定。
常量或变量应该总是被定义在尽可能小的范围内。
全局(Global)变量可以导致极其复杂的状态机构,并且使一个应用程序的逻辑非常难于理解。
全局变量也使代码的重用和维护更加困难。
较好的编码习惯是尽可能写模块化的代码。
除了全局变量(应该是不被传递的),过程和函数应该仅对传递给它们的对象操作。
在过程中使用的全局变量应该在过程起始处的声明部分中标识出来。
作用范围
前缀
例子
全局
g
gr_prpcmain
模块级
p
pv_sql
本地到过程
l
lv_count
传入参数
i
ir_prpcmain
常量/变量类型
前缀
例子
结构
r
gr_prpcmain
数组
a
pa_count[10]
其他
v
lv_proposalno
描述变量
变量主体应该使用小写形式,并且应该足够长以描述它的作用。
对于频繁使用的或长的项,推荐使用标准缩略语以使名称的长度合理化。
当使用缩略语时,要确保它们在整个应用程序中的一致性。
在一个工程中,如果一会儿使用proposalno代表投保单号码,一会使用prpsalno代表保单号码,将导致不必要的混淆。
变量使用遵循如下几条规则:
●函数内部定义的每一个变量在使用之前都必须初始化,初始化区域以/--@INIT开头和-/结尾。
●便于工具能够定期检查变量是否初始化或者初始化是否正确,在函数内部的变量初始化区域,严格按照上述规定检查;
●对于数组的初始化,必须采用INITIALIZE数组TONULL,不要采用循环一条条记录进行初始化,除非需要针对数组记录中的某个字段特殊赋值;
比如:
定义数组变量la_prptplanARRAY[20]OFRECORDLIKEPrpTplan.*,初始化时直接用INITIALIZEla_prptplanTONULL,不要使用:
FORi=1TO20
INITIALIZEla_prptplan[i].*TONULL
ENDFOR
●对象化后的系统不允许使用模块变量;
●终端版系统应优化算法,尽量避免使用数组,不允许使用大数组;
变量定义及初始化举例如下:
FUNCTIONpub_BLPrpCaddress_Ini()
DEFINElr_prpcaddressRECORDLIKEPrpCaddress.*,
la_prpcaddressARRAY[20]OFRECORDLIKEPrpCaddress.*,
lv_prpcaddress_countSMALLINT,
lv_resultINTEGER
#/--@INIT
#--变量初始化
INITIALIZElr_prpcaddress.*TONULL
INITIALIZEla_prpcaddressTONULL#--初始化数组变量
LETlv_prpcaddress_count=0
LETlv_result=0
#-/
CALLpub_DEPrpCaddress_GetRec()RETURNINGlr_prpcaddress.*
……
ENDFUNCTION
1.2注释规范
良好的程序注释有助于帮助我们了解程序的实现,也可以对程序文件进行一定量统计分析。
约定如下:
●程序注释是程序文件的一个重要组成部分,中英文注释均可(考虑到各种平台对中文的支持,建议用英文);
●INFORMIX-4GL的注释有三种:
#、--、{}。
分单行注释和多行注释两种。
单行注释以--开头。
多行注释以##开头。
除了临时的注释(调试程序使用),严禁使用{}。
●为了对4GL文件进行一定量的统计分析,规范代码的编写质量。
制定了一组注释框架来对4GL程序进行说明。
规则如下:
1.2.1程序文件部分的注释
程序文件头的注释说明主要包括该程序文件包含类的名称(CLASS)、类的功能描述(DESC)、文件创建作者(AUTHOR)、创建日期(CREATEDATE)、及更新列表(MODIFYLIST)等信息。
还包括类的成员包括公有和私有。
举例:
#/--@CLASSDBPrpDkind
#@DESC类功能描述
#@AUTHOR创建者名称
#@CREATEDATEYYYY/MM/DD
#@MODIFYLIST
#NAMEDATEREASON
#WuPeng2002/03/13优化save函数,提高效率
#SunRibo2002/03/14增PremiumCal函数计算保费
#-/
说明:
MODIFYLIST中#后一个空格,NAME,DATE,REASON和其内容都要左对齐,NAME宽8列,其后一个空格,然后是DATE宽10列,其后一个空格,然后是REASON,如果REASON需要折行,另起一行,仍和REASON对齐
#/--@PUBLICPROPERTIES
GLOBAL
DEFINEgr_prpcmainRECORDLIKEprpcmain.*
ENDGLOBAL
#-/
#/--@PRIVATEPROPERTIES
DEFINEpr_prpcmainRECORDLIKEPrpCmain.*
DEFINEpv_proposalnoLIKEPprpTmain.ProposalNo--**投保单号
#-/
1.2.2函数部分的注释
每一函数(或过程)都应包括该函数(或过程)的注释部分包括一个METHOD框架。
描述实现的功能简介、输出参数说明等方面的描述。
在函数内部变量定义前包括该函数RETURN的框架,以/--@RETURN开头和-/结尾,对于无返回值和有返回值的RETURN描述规则如下:
1、无返回值的RETURN书写规则:
#/--@RETURN
#VARIABLEDEFINEREMARK
#-/
2、有返回值的RETURN书写规则:
#/--@RETURN
#VARIABLEDEFINEREMARK
#lv_resultsmallint返回的sql值
#lr_prpcmainPrpCmain.*数据库表记录
#lv_amountDECIMAL(16,2)
#lv_policynoPrpCmain.PolicyNo保单号
#lr_sumpolicySELFDEFINE
#NONETRUE/FALSE
#NONE-1/0/100失败/成功/没找到
#-/
3、有返回值且注释超过一行的RETURN书写规则:
#/--@RETURN
#VARIABLEDEFINEREMARK
#lv_resultsmallint返回的sql值\
#0:
成功;1失败
#lr_prpcmainPrpCmain.*数据库表记录\
#对应保单主表
#lv_amountDECIMAL(16,2)
#lv_policynoPrpCmain.PolicyNo保单号
#lr_sumpolicySELFDEFINE
#NONETRUE/FALSE
#NONE-1/0/100失败/成功/没找到
#-/
说明:
(1)#--@RETURN、VARIABLE、DEFINE、REMARK所在行为固定格式;
(2)每行只能注释一个返回值,返回值注释的先后与函数实际返回顺序一致;
(3)VARIABLE、DEFINE、REMARK和其内容要左对齐;
(4)对于REMARK一行不够的话,在注释后补反斜杠”\”,另起一行,和上一行的注释内容左对齐。
(5)DEFINE节约定:
对于LIKE型的变量,该处写出表名.*,或者表名.字段名,如:
PrpCmain.*,PrpCmain.PolicyNo;对于DECIMAL类型,必须写出精度,如DECIMAL(16,2)。
(6)如果变量为自定义的结构,在DEFINE行填写SELFDEFINE;
(7)如果返回值不是变量,VARIABLE项固定为NONE,DEFINE项罗列出返回数值,用“/”分隔;
(8)该规则位置放在函数中的PARAMETER节之前。
举例如下:
#/--@METHOD
#@DESC根据主键获取PrpCfee表的记录
#-/
FUNCTIONpub_DBPrpCfee_GetInfo(iv_policyno,iv_currency)
#/--@RETURN
#VARIABLEDEFINEREMARK
#lr_PrpCfee.*PrpCfee.*保额保费记录
#lv_retSMALLINT
#-/
#/--@PARAMETER
DEFINEiv_policynoLIKEPrpCfee.policyno
DEFINEiv_currencyLIKEPrpCfee.currency
#-/
在函数内部变量定义的同时包括一个PARAMETER框架,以/--@PARAMETER开头和-/结尾,用来说明函数的入参及入参的类型。
举例:
#/--@METHOD
#@DESC函数描述
#@RETURNSMALLINT--函数返回值
#INTEGER--其他返回值
#-/
FUNCTIONpub_DBPrpCmain_Insert(iv_prpcmain.*)
#/--@PARAMETER
--PrpCmain表纪录
DEFINEiv_cmainRECORDLIKEPrpCmain.*
#-/
DEFINElv_resultINTEGER
...
ENDFUNCTION
1.2.3函数(过程)程序的增、删、改的注释说明约定
程序的这几种操作包含在注释关键字MODIFY中。
注释以”--*MODIFY”开头,其中MODIFY与”*”之间不能有空格,框架中包括注释人姓名(必须),操作[DELETE/ADD/UPDATE](必须),操作时间(必须),地点(必须),必要时说明操作原因。
举例:
(空行)
--*MODIFYBEGINSunribo,DELETE,2002-03-15,beijing,程序逻辑错误–
(空行)
##FUNCTIONpub_DBPrpDkind_Update(ir_prpdkind)
##...
##...
##ENDFUNCTION
(空行)
--*MODIFYENDSunribo,DELETE,2002-03-15,beijing––
(空行)
记住下列几点:
●程序增、删、改的注释应该按时整理。
无用的注释及时清理掉。
●所有的变量定义之后都要加上能够说明其用途的注释。
1.2.4函数体内部的代码段修改注释
在函数中修改代码段应在所修改代码段首尾处增加注释,在结尾处应将缩添加起首处注释的修改人、修改信息和关键字等信息重复一次,并将起首处的BEGIN改为结束标志END所添加注释应与所注释代码段保持同样缩进,并与所注释代码段间上下各保留一空行以便于浏览。
此外,在进行BUG修改或补充功能开发时应将BUG编号或功能编号书写在注释中,作为与功能相关的标识。
举例:
(空行)
--*MODIFYBEGINSunribo,DELETE,2002-03-15,beijing,FORIBUG2111–
(空行)
LETlr_prptmain.ProposalNo=”…”
LETlr_prptmain.RiskCode=”QZA”
(空行)
--*MODIFYENDSunribo,DELETE,2002-03-15,beijing–
(空行)
1.2.5函数体内部的代码段说明约定
在程序中开始大的代码段之前,要加入特殊的注释,用于标记说明下面代码段的功能。
此类注释以#--开头,缩进和代码段的缩进相同,同时这种注释需要配以整齐的标号,以增加可读性,便于理解。
举例:
#--1.查询出所有从起始节点出发的路径
#--2.依次将这些路径取出并放入一个数组
#--3.关闭取路径的游标
#--4.循环判断路径是否满足条件,并标记满足条件的记录
#--5.选出所有选中的路径中优先级最高的进行返回
1.3书写规范
1.3.1基本原则
编码要清晰工整,保证程序的可读性、系统的可维护性:
●在任何情况下都不能使用TAB键;
●程序中一律采用4个空格的缩进;
●除了”,”运算符之外,所有的运算符和操作数之间都要加一个空格;
●一个代码行物理上不能超过屏幕规定的缺省最大宽度(80列),即不能产生折行,如果逻辑行长度超过80,除了函数定义或者调用语句根据函参折行对齐、DEFINE语句根据变量折行对齐以外,其他情况一律将超长部分另起一行空4格后书写;
●成对出现的语句起始和结束关键字必须左对齐书写。
●UI-BL-DB三层允许前端调用后端(UIBL,UIDB,BLDB),不允许出现后端反调前端的情况;
举例:
IF…THEN
...
ENDIF
WHILEcondition
do…
ENDWHILE
FUNCTIONabc()
...
ENDFUNCTION
1.3.2保留字引用规则
●编码中引用的所有保留字均必须大写;
●程序注释提供的关键字:
AUTHORCREATEDATEDESCPARAMETERRETURNPUBLICPROPERTIESPRIVATEPROPERTIESCLASSMODIFYMODIFYLIST
●INFORMIX-4GL提供的保留字:
SELECTUPDATEDELETEINSERTIFTHENELSECASEWHENOTHERWISEENDFUNCTIONPROCEDUREWHILEEXIT
●INFORMIX-4GL提供的系统变量、函数一律大写;
举例:
INT_FLAG、ARR_COUNT、SET_COUNT等
1.3.3LET语句
LET语句一行能写下就写在一行,逻辑行长度大于80时按照逻辑表达式拆分后,另起一行空4格后书写。
举例:
LETlv_where_part="a.UserName=e.UserCodeAND",
"e.GroupNo=d.GroupNoAND",
"e.ModelNo=",lr_wflog.ModelNo,"AND",
"e.NodeNo=",lr_wflog.NodeNo
1.3.4IF语句
●IF之后的逻辑表达式一行能写下就写在一行,逻辑行长度大于80时按照逻辑表达式拆分后,另起一行空4格后书写。
●对于IF加上之后的条件如果足够在一行的话,THEN跟在后面,否则单独占一行。
●所有的逻辑运算符(AND,OR)一律放在每行开始。
●禁止使用ELSEIF语句,可以采用CASE语句改写。
举例:
IFlr_prptmain.Pro
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- GL 语言 开发 原则 规范 简化