项目开发规范.docx
《项目开发规范.docx》由会员分享,可在线阅读,更多相关《项目开发规范.docx(53页珍藏版)》请在冰豆网上搜索。
项目开发规范
XXX项目开发规范
1.1命名规范
1.1.1各个子系统命名
将每个子系统建立为一个子空间,并且使用完整的英文单词为空间命名即可。
例如客户关系管理(CRM)子系统的空间就命名为“CRM”。
1.1.2表和字段命名
表和字段目前以SAPBusinessOne的表结构作为基础,直接使用原来的名称即可,不需要再进行命名。
1.1.3业务对象命名
1.综合
●业务空间
不使用任何前缀和后缀,直接命名。
例如客户关系管理(CRM)子系统的空间就命名为“CRM”。
●文件夹
不使用任何前缀和后缀,直接命名。
例如客户档案文件夹就命名为“CustomerArchives”。
●数据库
以“%DB”的格式命名。
例如协同系统数据库就命名为“CooperationDB”。
●资源集
以“%Lib”的格式命名。
例如客户档案资源集就命名为“CustomerArchivesLib”。
●窗体
以“%Form”、“%Dialog”的格式命名,视窗体的实际用途而定。
例如录入客户档案窗体就命名为“InputCustomerArchivesForm”,显示一个客户信息的弹出对话框就命名为“ShowCustomerArchivesDialog”。
●图标
以“Icon_%”的格式命名。
例如客户图标就命名为“Icon_Customer”。
●位图
没有命名规则,视实际情况而定。
●页眉页脚
没有命名规则,视实际情况而定。
●工具栏
以“%ToolBar”的格式命名。
例如打印工具栏就命名为“PrintToolBar”。
2.业务字典
●字段模板组
以“%Templets”的格式命名。
例如客户档案模板组就命名为“CustomerArchivesTemplets”。
●字段模板
以“%Templet”的格式命名。
例如客户档案模板就命名为“CustomerArchivesTemplet”。
●业务参数组
以“%Params”的格式命名。
例如客户档案参数组命名为“CustomerArchivesParams”。
●业务参数
不使用任何前缀和后缀,直接命名。
例如客户档案编号参数就命名为“CustomerArchivesID”。
●业务元素组
以“%Elements”的格式命名。
例如客户档案元素组就命名为“CustomerArchivesElements”。
●业务元素
不使用任何前缀和后缀,直接命名。
例如客户档案编号元素就命名为“CustomerArchivesID”。
●业务操作组
以“%Operations”的格式命名。
不使用任何前缀和后缀,直接命名。
例如客户档案操作组就命名为“CustomerArchivesOperations”。
●业务操作
不使用任何前缀和后缀,直接命名。
例如客户档案编号操作就命名为“CustomerArchivesID”。
3.业务信息
●业务信息
以“%Info”的格式命名。
例如客户档案信息就命名为“CustomerArchivesInfo”。
●表单文档
不使用任何前缀和后缀,直接命名。
如果单独是某种视图,可以在末尾加上视图类型名。
例如客户档案记录视图文档可以命名为“CustomerArchivesRecordView”;订单列表视图文档可以命名为“OrderGridView”。
●表格文档
以“%Sheet”的格式命名。
例如客户档案表格文档就命名为“CustomerArchivesSheet”。
●丰富文档
以“%Doc”的格式命名。
例如订单合同丰富文档就命名为“OrderContractDoc”。
4.业务功能
●业务功能
以“%Func”的格式命名。
例如客户档案功能就命名为“CustomerArchivesFunc”。
5.业务流程
●业务流程
以“%Proc”的格式命名。
例如订单流程就命名为“OrderProc”。
1.1.4业务组件命名
前缀
组件
BusinessForm
dsb
TDataSetBroker
ib
TInfoBroker
fb
TFuncBroker
ob
TOperationBroker
db
TDecisionBroker
dv
TDocView
dvb
TDocViewBar
dtnvg
TDataNavigator
dtedt
TDataEdit
dtlbl
TDataLabel
dtg
TDataGrid
dtcg
TDataCtrlGrid
dtcht
TDataChart
dtrv
TDataRecordView
dtdp
TDecisionPivot
dtdg
TDecisionGrid
dtdcht
TDecisionChart
dtlcb
TDataLocateComboBox
dttv
TDataTreeView
dtcdtv
TCodeDataTreeView
dtmddtv
TMDDataTreeView
btb
TBizToolBar
bimg
TBizImage
biml
TBizImageList
btv
TBizTreeView
blv
TBizListView
bcb
TBizComobBox
bcht
TBizChart
otv
TOrgTreeView
olv
TOrgListView
ocb
TOrgComboBox
ocht
TOrgChart
fcht
TFlowChart
bfcht
TBizFlowChart
bod
TBizOpenDialog
bsd
TBizSaveDialog
bbd
TBizBrowseDialog
bsld
TBizSelectDialog
fgv
TFlowGangttView
fpv
TFlowPertView
ftv
TFlowTrackView
psgg
TPSGanttGraph
pspg
TPSPertGraph
pspc
TPSPrjectCalendar
dtfp
TDataFilterPanel
dtbrs
TDataBrowser
BusinessModel
cnt
TConnection
tst
TTransation
ds
TDataSource
qry
TQuery
sds
TSQLDataSet
spds
TStoredProcDataSet
uds
TUserDataSet
dds
TDecisionDataSet
pds
TPiovtDataSet
ip
TInfoPolicy
1.1.5标准组件命名
前缀组件
mmTMainMenu
pmTPopupMenu
mmiTMainMenuItem
pmiTPopupMenuItem
lblTLabel
edtTEdit
memTMemo
btnTButton
cbTCheckBox
rbTRadioBox
lbTListBox
cbTComboBox
scbTScrollBar
gbTGroupBox
rgTRadioGroup
pnlTPanel
clTCommandList
bbtnTBitBtn
sbTSpeedButton
meTMaskEdit
sgTStringGrid
dgTDrawGrid
imgTImage
shpTShape
bvlTBevel
sbxTScrollBox
clbTCheckListbox
splTSplitter
stxTStaticText
chtTChart
tbcTTabControl
pgcTPageControl
ilTImageList
reTRichEdit
thrTTrackBar
prbTProgressBar
udTUpDown
hkTHotKey
aniTAnimate
dtpTDateTimePicker
tvTTreeView
lvTListView
hdrTHeaderControl
stbTStatusBar
tlbTToolBar
clbTCoolBar
tmTTimer
pbTPaintBox
mpTMediaPlayer
olecTOleContainer
1.2代码规范
1.2.1字母大小写
基本原则:
(1)标识符中所有单词首字母大写,包括单元名、函数/过程名、组件名、变量名
(2)表示类型的T和表示指针类型的P大写
例外情况:
(1)Delphi语言保留字完全小写,如:
string、if..then..else、begin..end等等
(2)表示组件类型的前缀小写,如:
frmMain、edtPassword
(3)表示变量类型的前缀小写,如:
iCol、bFileExist、sErrorMessage
表示枚举类型的前缀小写,如:
dsEdit、dsInsert
1.2.2过程/函数
命名规则:
应该以大写字母开头,应该尽量便于阅读,例如:
procedurethisisapoorlyformattedroutinename;//很难看懂
procedureThisIsMuchMoreReadableRoutineName;//很清楚的命名方式
子程序名应该具有与其用途相关的含义。
导致发生某动作的子程序应该以动词为前缀命名,例如:
procedureFormatHardDrive;
为输入参数赋值的子程序应该以Set为前缀命名,例如:
procedureSetUserName;
取回数值的子程序应该以Get为前缀命名,例如:
functionGetUserName:
string;
参数
格式
如果可能,同类型的参数应该在一条语句中说明:
procedureFoo(Param1,Param2,Param3:
Integer;Param4:
string);
命名
参数名称应该表明其用途和含义,适当情况下,参数名应该以字符A为前缀,例如:
procedureSomeProc(AUserName:
string;AUserAge:
integer);
使用前缀"A"是为了避免参数名与类的属性名、域名重复
1.2.3局部变量
简单类型的局部变量名称大写,例如:
I,J:
Integer;
对象类型的局部变量以字母l为前缀,表示local,例如:
lFont:
TFont;
1.2.4缩进
缩进应该是每行2个空格,不要在源文件中保存TAB字符。
1.2.5换行
页宽应该设置为80字符。
源代码一般不要超过这个宽度,以免导致无法完整显示(这一限制也可以灵活调整)。
超长的语句应该在逗号或者操作符之后折行,一条语句折行后,应该比原来的语句再缩进2个字符。
1.2.6begin..end对
begin语句应该单独作为一行。
例如,下面的第1行是错误的,第2行是正确的:
forI:
=0to10dobegin//错误,begin和for在同一行
forI:
=0to10do //正确,begin单独作为一行
begin
当begin作为else子句的一部分时例外,例如:
ifsomestatement=then
begin
...
end
elsebegin
SomeOtherStatement;
end;
end语句永远单独作为一行。
如果begin语句不是else子句的一部分,相应的end语句应该缩进到与begin对齐的位置
1.2.7括号
左括号与后一字符之间、右括号与前一字符之间都不应该出现空格,例如:
CallProc(AParameter);//错误
CallProc(AParameter); //正确
不要在语句中使用无意义的括号,除非使用括号能增加程序的可读性,例如:
if(I=42)then //错误-括号毫无意义
if(I=42)or(J=42)then//正确-的确需要括号
Result:
=(IndexOf(AString)<>-1)//增强程序的可读性
1.2.8if语句
if/then/else语句中最可能被执行的部分应该放在then子句中,不太可能被执行的部分应该放在else子句中。
如果可能,尽量不要使用一连串的if语句,而应该以case语句替代。
不要使if语句嵌套太多,尽量以更清楚的代码替代。
如果if语句中需要检测多个条件,则条件应该按照计算强度从小到大地排列。
这将使得代码执行的布尔计算更少,性能更高。
例如,如果Condition1比Condition2计算更快,Condition2比Condition3计算更快,那么if语句应该是如下结构:
ifCondition1andCondition2andCondition3then
1.2.9case语句
case语句中的单个子句应该以case常数的数字顺序或字母顺序排列。
子句中的执行语句应该尽量保持简单,一般不要超过4到5行代码。
如果执行语句过于复杂,应该将它放置在独立的过程或函数中。
case语句的else子句应该只在正常的默认情况或检测到错误的情况下使用。
1.2.10try..except/finally语句
不要在try..except块中使用else,因为else字句将阻塞所有的意外,包括没有准备处理的意外
不要在try块内部创建对象,例如:
try
AInstance:
=TObject.Create;
DoSomeThing;
finally
AInstance.Free;//将在编译期间产生警告信息,因为Create语句不一定执行成功
end;
应该修改为:
AInstance:
=TObject.Create;
try
DoSomeThing;
finally
AInstance.Free;
end;
1.2.11类
类的域变量应该以字母F为前缀,以便在引用时清楚地表明是域变量(Field)
1.2.12单元结构
单元遵循相同的命名原则,保证含义清楚,可读性好。
uses语句中应该尽量删除不必要的名空间,而且应该遵循以下顺序:
1、Business本身的名空间在前,第三方组件的名空间在后,自定义的名空间在最后。
2、通用单元在前,特殊单元在后
interface部分应该只包括可被外部单元访问的类型声明,变量声明,过程/函数的预先声明,等等。
本单元私有的的类型、变量、常数、函数/过程、类定义,等等应该在implementation部分定义。
1.2.13注释
单元接口部分的方法,及类中Public、Protected的部分的属性、方法都需要写上注释,说明方法、属性的用途、以及各个参数的确切含义。
如果可能,还可以包括简短的使用示例代码。
具体的参考实例如下:
{TRelevancyNavBar}
TRelevancyNavBar=class(TmxOutlookBarPro)
private
FAutoHide:
Boolean;
FDataSources:
TDataSources;
FOwnerFuncURL:
string;
functionGetRelevancyManager:
TRelevancyManager;
procedureDoButtonClick(Sender:
TObject);
procedureDoDataSetNotify(ABizDataSet:
TBizDataSet);
procedureDoDataSetActiveChanged(ABizDataSet:
TBizDataSet);
functionInternalAddHeader(constAHeaderCaption:
string):
TmxHeader;
functionInternalAddButton(AHeader:
TmxHeader;
constAButtonCaption:
string):
TmxButton;
functionAddIconToUserGraphics(constAIconURL:
string):
Integer;
functionElementAndValueExists(ABizField:
TBizField):
Boolean;
protected
procedureSetParent(AParent:
TWinControl);override;
{根据标题找到相应的Header}
functionFindHeaderByCaption(constAHeaderCaption:
string):
TmxHeader;virtual;
{根据标题获取相应的Header,和FindHeaderByCaption方法不同的是,找不到会创建一个新的返回}
functionGetHeader(ARelevancy:
TRelevancy):
TmxHeader;virtual;
{根据关联定义对象和数据集添加Button}
procedureAddButtonsByRelevancy(ARelevancy:
TRelevancy;ABizDataSet:
TBizDataSet);virtual;
{根据指定的关联定义对象刷新相应的Button}
procedureRefreshButton(ARelevancy:
TRelevancy);virtual;
{是否需要应用自动隐藏}
functionNeedAutoHide:
Boolean;virtual;
public
constructorCreate(AOwner:
TComponent);
destructorDestroy;override;
{装载关联定义}
procedureLoadRelevancys;
{根据数据集装载关联定义}
procedureLoadRelevancysByDataSet(ABizDataSet:
TBizDataSet);
{刷新关联定义}
procedureRefreshRelevancys;
{根据数据集刷新关联定义}
procedureRefreshRelevancysByDataSet(ABizDataSet:
TBizDataSet);
{刷新自动隐藏}
procedureRefreshAutoHide;
{根据关联对象找到相应的按钮}
functionFindButton(ARelevancy:
TRelevancy):
TmxButton;
{添加自定义的关联按钮}
functionAddCustomButton(constAHeaderCaption,AButtonCaption,
AHeaderIconURL,AButtonIconURL:
string):
TmxButton;overload;
functionAddCustomButton(constAHeaderCaption,AButtonCaption,
AButtonIconURL:
string):
TmxButton;overload;
functionAddCustomButton(constAHeaderCaption,
AButtonCaption:
string):
TmxButton;overload;
{自动隐藏}
propertyAutoHide:
BooleanreadFAutoHidewriteFAutoHide;
{关联数据源列表}
propertyDataSources:
TDataSourcesreadFDataSources;
{当前功能的URL}
propertyOwnerFuncURL:
stringreadFOwnerFuncURLwriteFOwnerFuncURL;
{关联管理器}
propertyRelevancyManager:
TRelevancyManagerreadGetRelevancyManager;
end;
1.3界面规范
1.3.1以用户为中心的设计原则
一个优秀的用户界面是建立在以用户和他们的任务为中心的原则和开发过程之上的。
1.用户控制
用户界面设计的一个重要原则是用户应该总是感觉在控制软件而不是感觉被软件所控制。
这个原则包含许多含义:
●操作上假设是用户——而不是计算机或软件——开始动作。
用户扮演主动角色,而不是扮演被动角色。
您可以自动执行任务,但要以允许用户进行选择或控制它的方式来实现该自动任务。
●因为用户的技能和喜好各不相同,因此他们必须能够个性化界面的某些方面。
Windows为用户提供了对许多这方面的访问。
您的软件应该反应不同的系统属性——例如颜色、字体或其他选项——的用户设置。
●您的软件应该尽可能是交互式并易感应的。
尽可能避免模式。
“模式”是一种状态,它排除一般的交互,或者限制用户只能进行特定的交互。
当最好使用一个模式或该模式只是可替换的设计时——例如,用于在一个绘图程序中选定一个特定感觉——请确保该模式是显然的、可见的,是一个明确的用户选定的结果,并且容易取消。
下面是一些用来保持应用程序的设计是交互式的其他建议方法:
●尽可能地使用“非模式”辅助窗口。
●划分进程,例如打印,这样您就不必加载整个应用程序来执行一个操作。
●在后台运行长进程,保持前台式交互式的。
例如,当正在打印一个文档,即使该文档不能被改变,用户也应该可以最小化该窗口。
2.直接
请仔细设计您的软件,以便用户可以直接处理信息的软件表示。
不管用户正在拖动一个对象以重新放置它,还是正在定位到文档中的一个位置,他们都应该在屏幕上看到他们的操作如何影响该对象。
可见的信息和选择还减少了用户在智力上的工作量。
用户可以比回忆命令的语法更容易地识别该命令。
熟悉的隐喻为用户的任务提供了直接而直观的界面。
通过允许用户利用他们的知识和经验,隐喻使得预测和学习基于软件的表示的行为更加容易。
在使用隐喻时,您不需要将基于计算机的实现局限在真实世界的对应物上范围之内。
例如,与其基于纸张的对应物不同,Windows桌面上的文件夹可以被用来组织各种对象,例如打印机、计算器、以及其他文件夹。
同样,Windows文件夹可以其真实世界对应物不可能的方式被排序。
在界面中使用隐喻的目的是提供一个认知的桥梁;隐喻并不以其自身为最终目的。
隐喻支持用户认知而不是记忆。
用户记起与一个熟悉的事物相关联的