软件开发规范(PB)
1概述
为了提高软件开发质量,降低开发周期,增强代码的可重用性和易读性,使软件便于维护,开发人员间便于交流和协作,特制定该开发规范,作为软件开发的规范,开发人员按照该规范进行软件开发。
2命名规范
2.1文件
2.1.1 PBL文件
PowerBuilder文件PBL按照以下规则组织:
XX_XXXX:系统简写+_+库名
XX_MAIN:主库(主窗口,主菜单及本系统的私有维护)
XX_PUBLIC:本系统的公用部份
XX_SHARE:与其它系统共享的文件
XX_XXXX:业务功能1
XX_XXXX: 业务功能2
2.1.2图片文件
图片文件应放在单独的目录中,目录名统一为Pic,图片文件的命名应与图片所要表达的意义相同或相近,不要使用数字命名。
2.2应用
应用名称一般与系统名称简称相同。
2.3菜单
M_xx_xxxx(m_系统简称_菜单名称)
主菜单命名:m_xx_main
2.4窗口
W_xx_xxxx(w_系统简称_窗口名称)
主窗口命名:w_xx_main
2.5控件
<控件前缀> + '_' + 控件名称
控件命名按照PB默认的前缀,详细如下:
序号 |
名称 |
前缀 |
备注 |
1. |
CheckBox |
cbx_ |
|
2. |
CommandButton |
cb_ |
|
3. |
DataWindow |
dw_ |
|
4. |
DropDownListBox |
ddlb_ |
|
5. |
DropDownPictureListBox |
ddplb_ |
|
6. |
EditMask |
em_ |
|
7. |
Graph |
gr_ |
|
8. |
GroupBox |
gb_ |
|
9. |
HProcessBar |
hpb_ |
|
10. |
HTrackBar |
htb_ |
|
11. |
HScrollBar |
hsb_ |
|
12. |
Line |
ln_ |
|
13. |
ListBox |
lb_ |
|
14. |
ListView |
lv_ |
|
15. |
MultiLineEdit |
mle_ |
|
16. |
OleControl |
ole_ |
|
17. |
Oval |
ov_ |
|
18. |
Picture |
p_ |
|
19. |
PictureHyperLink |
phl_ |
|
20. |
PictureButton |
pb_ |
|
21. |
PictureListBox |
plb_ |
|
22. |
RadicButton |
rb_ |
|
23. |
Rectangle |
r_ |
|
24. |
RichTextEdit |
rte_ |
|
25. |
RoundRectangle |
rr_ |
|
26. |
StaticHyperLind |
shl_ |
|
27. |
SingleLineEdit |
sle_ |
|
28. |
StaticText |
st_ |
|
29. |
TabControl |
tab_ |
|
30. |
TabPage |
tabpage_ |
|
31. |
TreeView |
tv_ |
|
32. |
UserObject |
uo_ |
|
33. |
VProcessBar |
vpb_ |
|
34. |
VTrackBar |
vtb_ |
|
35. |
VScrollBar |
vsb_ |
|
2.6对象
<对象前缀> + '_' + 对象名称
序号 |
类型 |
前缀 |
备注 |
1. |
Class Custom |
u_c_(或nvo_) |
|
2. |
Class Standard |
u_s_标准对象前缀_ |
如DataStore对象 u_s_ds_ |
3. |
Visual Custom |
u_vc_ |
|
4. |
Visual External |
u_ve_ |
|
5. |
Visual Standard |
u_vs_标准对象前缀_ |
如DataWindow对象 u_vs_dw_ |
2.7变量
<变量作用范围前缀> + <变量数据类型前缀> + '_' + 变量名称
2.7.1作用范围
序号 |
类型 |
前缀 |
备注 |
1. |
全局Global |
g |
|
2. |
共享Share |
s |
|
3. |
实例Instance |
i |
|
4. |
局部Local |
l |
|
5. |
参数Argument |
a |
|
2.7.2数据类型
序号 |
类型 |
前缀 |
备注 |
1. |
Any |
a_ |
|
2. |
Blob |
bb |
|
3. |
Boolean |
b |
|
4. |
Character |
c |
|
5. |
Date |
d |
yyyy.mm.dd |
6. |
DataTime |
dt |
Yyyy.mm.dd hh:mm:ss |
7. |
Decimal |
dc |
应定义小数位 |
8. |
Double |
db |
|
9. |
Integer |
i |
|
10. |
Long |
l |
|
11. |
Real |
r |
|
12. |
String |
s |
|
13. |
Time |
t |
hh:mm:ss |
14. |
UnsignedInteger |
ui |
|
15. |
UnsignedLong |
ul |
|
16. |
Application |
app |
|
17. |
CheckBox |
cbx |
|
18. |
CommandButton |
cb |
|
19. |
ContextKeyword |
cxk |
|
20. |
ContextInformation |
cxinfo |
|
21. |
DataStore |
ds |
|
22. |
DataWindow |
dw |
|
23. |
DataWindowChild |
dwc |
|
24. |
DragObject |
drg |
|
25. |
DrawObject |
drw |
|
26. |
DropDownPictureListBox |
ddplb |
|
27. |
DropDownListBox |
ddlb |
|
28. |
DWobject |
dwo |
|
29. |
DynamicDescriptionArea |
dda |
|
30. |
DynamicStagingArea |
dsa |
|
31. |
EnumerationDefinition |
ed |
|
32. |
EnumerationItemDefinition |
eid |
|
33. |
EditMask |
em |
|
34. |
Environment |
env |
|
35. |
Error |
err |
|
36. |
ExtObject |
ext |
|
37. |
Graph |
gr |
|
38. |
GraphicObject |
go |
|
39. |
GrAxis |
grax |
|
40. |
GrDispAttr |
grda |
|
41. |
GroupBox |
gb |
|
42. |
HorizontalScrollBar |
hsb |
|
43. |
InternetResult |
ir |
|
44. |
Line |
ln |
|
45. |
ListBox |
lb |
|
46. |
ListView |
lv |
|
47. |
ListViewItem |
lvi |
|
48. |
MailFileDescription |
mfd |
|
49. |
MailMessage |
mm |
|
50. |
MailRecipient |
mr |
|
51. |
MailSession |
ms |
|
52. |
MDIClient |
mdi |
|
53. |
Menu |
m |
|
54. |
MenuCascade |
mc |
|
55. |
Message |
msg |
|
56. |
MultiLineEdit |
mle |
|
57. |
NonVisualObject |
nv |
|
58. |
OleControl |
oc |
|
59. |
OleObject |
oo |
|
60. |
OleStorage |
ostg |
|
61. |
OmControl |
omc |
|
62. |
OmCustomControl |
omcc |
|
63. |
OmEmbeddedControl |
omec |
|
64. |
OmObject |
omo |
|
65. |
OmStream |
omstm |
|
66. |
OmStorage |
omstg |
|
67. |
Oval |
oval |
|
68. |
Picture |
p |
|
69. |
PictureButton |
pb |
|
70. |
PBToCPPObject |
pbcpp |
|
71. |
PictureListBox |
plb |
|
72. |
Pipeline |
pl |
|
73. |
PowerObject |
po |
|
74. |
ProfileCall |
procall |
|
75. |
ProfileClass |
proclass |
|
76. |
ProfileLine |
proln |
|
77. |
ProfileRoutine |
prort |
|
78. |
Profiling |
pro |
|
79. |
RadioButton |
rb |
|
80. |
Rectangle |
rec |
|
81. |
RemoteObject |
rem |
|
82. |
RichTextEdit |
rte |
|
83. |
RoundRectangle |
rrec |
|
84. |
RteObject |
rteo |
|
85. |
ScriptDefinition |
scrd |
|
86. |
SingleLineEdit |
sle |
|
87. |
Service |
srv |
|
88. |
StaticText |
st |
|
89. |
Structure |
str |
|
90. |
Tab |
tab |
|
91. |
TabPage |
tabpg |
|
92. |
TraceActivityNode |
tcan |
|
93. |
TraceBeginEnd |
tcbe |
|
94. |
TraceError |
tcerr |
|
95. |
TraceFile |
tcf |
|
96. |
TraceLine |
tcln |
|
97. |
TraceGarbageCollect |
tcgc |
|
98. |
TraceObject |
tco |
|
99. |
TraceRoutine |
tcrt |
|
100. |
TraceSQL |
tcsql |
|
101. |
TraceTree |
tct |
|
102. |
TraceTreeNode |
tctn |
|
103. |
TraceTreeError |
tcterr |
|
104. |
TraceTreeSQL |
tctsql |
|
105. |
TraceTreeGarbageCollect |
tctgc |
|
106. |
TraceTreeLine |
tctln |
|
107. |
TraceTreeObject |
tcto |
|
108. |
TraceTreeRoutine |
tctrt |
|
109. |
TraceTreeUser |
tctu |
|
110. |
TraceUser |
tcu |
|
111. |
TypeDefinition |
td |
|
112. |
Transaction |
tr |
|
113. |
Transport |
trp |
|
114. |
TreeView |
tv |
|
115. |
TreeViewItem |
tvi |
|
116. |
UserObject |
uo |
|
117. |
VariableCardinalityDefinition |
vrcd |
|
118. |
VariableDefinition |
vrd |
|
119. |
VerticalScrollBar |
vsb |
|
120. |
WindowObject |
wo |
|
121. |
Window |
w |
|
2.8结构
序号 |
类别 |
前缀 |
备注 |
1. |
全局级结构 |
gstr_ |
|
2. |
应用级结构 |
astr_ |
|
3. |
菜单级结构 |
mstr_ |
|
4. |
窗口级结构 |
wstr_ |
|
5. |
对象级结构 |
ostr_ |
|
2.9函数
序号 |
类别 |
前缀 |
备注 |
1. |
全局级函数 |
gf_ |
|
2. |
应用级函数 |
af_ |
|
3. |
菜单级函数 |
mf_ |
|
4. |
窗口级函数 |
wf_ |
|
5. |
对象级函数 |
of_ |
|
2.10事件
所有用户自定义事件均以ue_开头,后接事件名称。若定义的事件为PB内置的标准事件,则事件名称应与标准的名称相同,即将名称“pbm_xxxx”替换为“ue_xxxx”。
3界面规范
3.1应用
1. 当应用关闭时应提示是否退出系统。
2. 断开所有数据库连接。
3. 释放所有内存变量。
3.2菜单
1. 一个menu中避免有过多的菜单项。
2. 菜单一般限制在两层深度以内。
3. 用户不可使用的菜单项应变成灰色(Enabled属性置成False)。
4. 菜单文字应易于理解,对于将显示对话框的菜单项应在名字后面加省略号,例About…,Open…。
5. 对于标准菜单项应使用原名,例如File, Edit,并且位置应与原来相同。
6. 对于用于状态选择的菜单项应加上选择标记(使用Check()函数)。
7. 每个菜单上应提供帮助项。
8. 用户可以使用键盘控制菜单(在菜单定义时加热键)。
MDI菜单除要满足上述要求外,还要符合以下要求:
1. 每个Frame Window(主窗口或狂架窗口)要有一个菜单,每一个Sheet Window(子窗口)要有一个菜单.
2. 为程序中常使的菜单项定义工具条图标(Icon).
3. 为每个菜单项提供Microlhelp.
4. 在Frame Window的菜单中应提供以下基本功能:
u 打开Sheet子窗口
u 关闭Sheet子窗口
u 显示已打开的Sheet列表
u 排列Sheet窗口
3.3窗口
1. 系统登录窗口采用统一的窗口进行系统登录,密码检验,并创建系统运行的公共环境,不允许单独开发登录窗口。
2. 系统采用MDI、Sheet及Response三种类型的窗口。在设计窗口时若该类窗口已有公共模板,则应从模板继承,不允许单独设计。具体要求如下:
u MDI:应用程序主窗口,MDI应具有Miscohelp提示/应有菜单、工具条、状态栏,主窗口打开时自动最大化,覆盖整个屏幕。每个系统的主窗口从公共的MDI模板窗口继承。
u Sheet:对于查询、报表类窗口应使用Sheet窗口,使用OpenSheet或OpenSheetWithParm方式打开,打开后平铺在主窗口MDI中。
u Response:业务处理、维护类窗口,使用Open或OpenWithParm打开,打开后窗口自动居中。
3. 窗口标题的命名应该规范,一般应与菜单上的名称相同。
4. 窗口的大小、窗口内的控件位置、大小要求能够自动适应屏幕分辨率,当屏幕分辨率发生变化时要求自动调整到最佳显示效果。根据目前流行的屏幕分辨率要求支持800×600及1024×768两种方式。
5. 对于Response窗口,纵横尺寸比例应采用4:3,不应覆盖菜单栏、工具栏和提示栏,若窗口较大则应覆盖整个工作区。
6. 窗体中各控件安排均匀,分布合理,相同类型的控件放在一起,整个窗体应清晰,整洁,稳重。
7. 窗体内控件的字体类型、大小、颜色应该统一,采用宋体11号字,特殊的可采用9号字体,题头可选楷体或黑体,不准使用斜体字型,字体颜色统一采用黑色,如有特殊要求,可选用红色或蓝色。
8. 窗体输入部分支持全屏幕编辑,含ENTER键跳转。
9. 窗体控体布局顺序与TAB键跳转顺序一致。
10. 所有窗体按ESC可退出。
11. 输入部分避免采用滚动条。
12. 代码维护窗体和部分实现特殊业务的窗体采用响应窗体。
13. 不允许在整个应用已经关闭的情况下,有的窗口还显示在屏幕上。
3.4控件
1. 避免一屏使用过多的控件,如果需要控件太多,可以用多个窗口实现。
2. 控件之间保持适当的距离,并将同类功能的控件分组且画在同一区域内。
3. 对于可编辑或可选的控件使用较明显的边框(例如:外框,阴影),对于只作提示作用的控件则不加边框。
4. 将用户在程序运行过程中不能使用的控件变灰(即Enabled=False)。
5. 应用程序中所有按扭统一尺寸,统一颜色,统一采用中文系统字体。位置应于窗体右侧或下侧,在右侧的按扭的右上角为起始点,在下侧的按扭以右下角为起始点。尺寸限制在400*100左右。
6. 表格类数据窗口使用GRID格式,背景颜色一般用白色(TABLUES列表格式)与灰色(Freeform 录入格式)列头应与每列对齐,列头用3D格式,灰色,字体使用宋体11号两种,高度比字体稍大。
7. 数值型的数据显示或录入必须右对齐,日期型可居中或左对齐,字符串型必须左对齐(包括以下拉数据窗口形式显示的列)。
8. 按扭的快捷键位置放于汉字后,统一采用英文单词的首字母或第一个汉字的汉语拼单首字母,如遇到雷同现象,可自行修改。快捷键包以()。如窗体中只有两个按扭,可不采用快捷键,但应有默认ENTER和ESC键,如超过两个按扭,应采用快捷键,部分见附表。
9. 日期变量输入和显示统一采用YYYY.MM.DD的形式,例:1998.06.01
10. 代码输入采用弹出式响应窗体,弹出式响应窗体实现动态跟随,可在窗体内输入输入码。
11. 对于MessageBox应根据提示的内容选择相应的图标,对于警告信息不允许使用StopSign,应该使用Exclamation,只有当程序出项严重错误(如应用程序中断等)才可使用StopSign。
控件属性约定
名称 |
说明 |
Font(字体) |
宋体,Regular,11,黑色 |
DataWindow |
数据源一般为SQLselecet,显示方式为对单条记录输入输出为Freeform,背景颜色为Buttonface;对多行记录输入输出为Tabular或Grid,背景颜色为White; Text Object:3D raised(Tabular或Grid)或None(Freeform), Center,Buttonface,最左位置为(9,8),高度为 72,宽度根据需要设置; Column Object:3D Lowered(Freeform)、 Box(Tabuar)或 None(Grid),White,最左位置为(9,8),高度为 72,宽度根据需要设置; 列的背景颜色可为Buttonface; Compute Field:与Column Object相同。 |
Tab |
Picture on left,Show text,Show picture,Bold selected text,Center,ButtonFace |
TabPage |
背景颜色和文字背景颜色:ButtonFace,文字颜色:Wndtext |
DataWindowControl |
VscrollBar,Live Scrolling,3D Lowered |
UserObjectControl |
3D Raised,ButtonFace |
CommandButton |
高度为100,宽度为398或根据具体需要调整 |
StaticText |
None,背景颜色ButtonFace,高度80;动态显示信息则边界为3D Lowered |
EditMask |
3D Lowered,背景颜色White,高度80 |
DropDownPicture ListBox |
VscrollBar,3D Lowered,背景颜色White |
GroupBox |
3D Lowered,背景颜色ButtonFace |
CheckBox |
3D Lowered,背景颜色ButtonFace,高度80 |
RadioButton |
Right Text,3D Lowered,背景颜色ButtonFace,高度80 |
DropDownListBox |
与DropDownPictureListBox相同 |
如控件是从基类中继承的,则属性为标准属性,可根据调用函数来改变属性。
功能键的约定
功能键名称 |
功能键约定 |
说明 |
退出系统 |
ALT+F4 |
退出主窗口及系统 |
退出sheet窗口 |
CTRL+F4 |
退出当前的子窗口(sheet窗口) |
退出键 |
ESC |
退出response和popup窗口、退出当前菜单到上层菜单 |
帮助键 |
F1 |
打该系统的帮助文件 |
确认键 |
F2 |
在数据保存时确认数据的合法性并保存数据,在查询数据时确认输入的条件实现确认按钮的功能 |
插入键 |
F3 |
用于在数据窗口中插入新的记录 |
删除键 |
F4 |
用于在数据窗口中删除当前的记录 |
查询键 |
F5 |
输入查询条件、刷新数据 |
打印键 |
F6 |
打印 |
选页键 |
F7、F8、ALT+[1-9] |
切换tabpage页,F7向前、F8向后;ALT+[1-9]数字为指定的页码 |
更换用户 |
F12 |
从新登入更换用户 |
翻页键 |
Home、End、PageUp、PageDown |
用于翻页查看选取的记录,Home翻到第一页,End翻到最后一页,PageUp翻到前一页,PageDown翻到下一页 |
TAB键 |
TAB、Shift+Tab |
用于按TabOrder向前或向后移动光标 |
选择键 |
Return |
用于选择菜单或选取数据时使用 |
切换键 |
Ctrl+Tab |
用于MDI方式下切换多个窗口页 |
按钮属性
按钮名称 |
热键 |
说明 |
确认 |
ALT_O |
一般用于设置,确定表示修改有效保存设置并关闭窗口,一般不用热键,用Enter键触发。 |
取消 |
ALT_C |
一般用于设置,表示修改无效并关闭窗口,一般不用热键,用ESC键触发。 |
保存 |
ALT_S |
在窗口录入信息比较多时,在记录录入时需不断保存时采用。 |
退出 |
ALT_X |
关闭窗口,一般不用热键,用ESC键触发, |
查询 |
ALT_Q |
设置条件后从新检索数据。 |
刷新 |
ALT_F |
直接从新检索数据。 |
统计 |
ALT_S |
在从新检索数据过程中有 |
增加 |
ALT_A |
记录增加 |
删除 |
ALT_D |
记录删除 |
修改 |
ALT_M |
记录修改 |
4编码规范
4.1代码
1. 程序块要采用缩进风格编写,缩进使用Tab键。
2. 相对独立的程序块之间、变量说明之后必须加一空行。
3. 较长的语句(>80字符)要分成多行书写,长表达式要在低优先级操作符处划分新行,操作符放在新行之首,划分出的新行要进行适当的缩进,使排版整齐,语句可读。
4. 循环、判断等语句中若有较长的表达式或语句,则要进行适应的划分,长表达式要在低优先级操作符处划分新行,操作符放在新行之首。
5. 操作符前后加空格(+,-,*,/,=,<>,<,>,=等)。
6. 大小写:所有变量采用小写,若变量名称为英文单词,则可使用单词首字母大写其余小写的方式;PB提供的函数采用大小写混合的方式(如MessageBox,OpenWithParm等);系统保留字全部使用大写的方式。SQL语句中数据库命令统一使用大写。
7. 注意运算符的优先级,并用括号明确表达式的操作顺序,避免使用默认优先级。
8. 程序中关系较为紧密的代码应尽可能相邻。
9. 不要使用难懂的技巧性很高的语句,除非很有必要时。
4.2注释
1. 为保证程序的可读性及方便理解,程序应提供较为完整的注释。注释语言必须准确、易懂、简洁,防止注释二异性。一般情况下,源程序有效注释量必须在20%以上。
2. 在函数、自定义事件的头部应进行注释,包括名称、功能、参数、返回值,创建者及日期、修改者及日期、备注等。
//==============================================================================
// 名称:函数或事件的名称
//------------------------------------------------------------------------------
// 功能: 函数或事件所要实现的功能
//------------------------------------------------------------------------------
// 参数: 说明函数或事件参数的类型、名称及含义
// <类型> <名称> <说明>
//------------------------------------------------------------------------------
// 返回: 说明函数或事件的返回值
//------------------------------------------------------------------------------
// 作者: 日期:
//------------------------------------------------------------------------------
// 修改: 日期:
//------------------------------------------------------------------------------
// 备注: 若有其它需要注意的事项在此说明
//==============================================================================
3. 边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码的一致性。不再有用的注释要删除。
4. 注释应与其描述的代码相近,对代码的注释应放在其上方或右方(对单条语句的注释)相邻位置,不可放在下面,如放于上方则需与其上面的代码用空行隔开。
5. 为使程序排版整齐、便于阅读,注释应该与所描述的内容采用同样的缩进。
6. 对于变量定义、条件语句、循环语句、分支语句应提供较为详细的注释。对于全局变量、共享变量、实例变量必须提供注释,说明变量的含义。对于局部变量若变量名称为大家经常使用或一目了然的(如ll_Row、ll_RowCount等)可不用注释。
7. 注释的格式要求统一,代码前使用“//”,代码右使用“/* */”。
8. 为提高程序和注释的可读性,方便程序的维护,注释语言应采用简体中文。
4.3变量
1. 变量命名采用命名规范中定义的规则来命名。
2. 变量名称要清晰、明了,有明确含义,可使用完整的单词或大家基本可以理解的缩写或者使用拼音首字母,避免使人产生误解。
3. 变量名称中若使用特殊约定或缩写,则要有注释说明。
4. 变量命名规则中没有规定的地方可采用个人的命名风格,但应该保持一致,不能来回改变。
5. 变量名称禁止取单个字符(如i、j、k...),建议除了要有具体含义外,还能表明其变量类型、数据类型等,但i、j、k作局部循环变量是允许的。不要使用数字作为变量名称。
6. 要减少全局变量的定义,全局变量会增大模块间的耦合度,影响模块的灵活性。
7. 要防止局部变量与全局变量或公共变量同名。
8. 尽量使用相同的变量类型,防止相同的变量前后采用不同的类型,如金额应使用Decimal,不要使用Double。
4.4结构
1. 结构的功能要单一,是针对一种事务的抽象。设计结构时应力争使结构代表一种现实事务的抽象,而不是同时代表多种。结构中的各元素应代表同一事务的不同侧面,而不应把描述没有关系或关系很弱的不同事务的元素放到同一结构中。不要设计面面俱到、非常灵活的数据结构。
2. 不同结构间的关系不要过于复杂。若两个结构间关系较复杂、密切,那么应合为一个结构。
3. 结构中元素的个数应适中。若结构中元素个数过多可考虑依据某种原则把元素组成不同的子结构,以减少原结构中元素的个数。增加结构的可理解性、可操作性和可维护性。
4. 结构中元素的布局与排列顺序应该仔细设计,使结构容易理解、节省占用空间,并减少引起误用现象。
5. 结构中相同类型的元素应保持其数据类型的统一性,防止发生数据类型的强制转换。
6. 结构中元素的命名应符合规范,应保持前后统一提高代码可读性。
4.5函数、事件
1. 函数名称应准确描述函数的功能,避免使用无意义或含义不清的动词作为为函数命名。
2. 避免设计多参数函数,不使用的参数从接口中去掉,若必须使用多参数应该使用结构体作为参数。
3. 对于函数参数的有效性应进行检查或校验,同时应该检查函数中使用的公共变量的有效性。函数中使用的公共变量最好以参数的形式传入而不要直接引用。
4. 函数的返回值要清楚、明了、准确,防止使用者误用、理解错误或忽视错误返回码。
5. 函数的功能应该单一,一个函数仅完成一件功能,不要设计多用途面面俱到的函数。函数的规模尽量限制在200行以内(不包括注释)。
6. 尽量不要编写依赖于其他函数内部实现的函数,函数中不应该使用控制参数来改变其执行流程,函数应具有独立性。
7. 应该防止将函数的参数作为工作变量使用,否则有可能错误地改变参数内容导致错误。对于必须改变的参数,最好先用局部变量代之,最后再将该局部变量的内容赋给该参数。
8. 对所调用函数的错误返回码要仔细、全面的处理。
9. 在调用函数时不要使用数据类型的强制转换。
10. 应该设计高扇入(指有多少上级函数调用它)、合理扇出(指一个函数直接调用、控制其它函数的数目,应小于7)的函数。
11. 减少函数本身或函数间的递归调用。递归调用特别是函数间的递归调用(如A->B->C->A)会影响程序的可理解性;递归调用一般都占用较多的系统资源(如栈空间);递归调用对程序的测试有一定影响。故除非为某些算法或功能的实现方便,应减少没必要的递归调用。
12.
4.6效率
1. 编程时要经常注意代码的效率。代码效率分为全局效率、局部效率、时间效率及空间效率。全局效率是站在整个系统的角度上的系统效率;局部效率是站在模块或函数角度上的效率;时间效率是程序处理输入任务所需的时间长短;空间效率是程序所需内存空间,如机器代码空间大小、数据空间大小、栈空间大小等。
2. 局部效率应为全局效率服务,不能因为提高局部效率而对全局效率造成影响。
3. 在保证软件系统的正确性、稳定性、可读性及可测性的前提下,提高代码效率。不能一味地追求代码效率,而对软件的正确性、稳定性、可读性及可测性造成影响。
4. 应将循环体内工作量最小化。
u 应仔细考虑循环体内的语句是否可以放在循环体之外,使循环体内工作量最小,从而提高程序的时间效率。
u 在多重循环中,应将循环次数多的循环放在最内层。
u 尽量减少循环嵌套层次。
u 避免循环体内含判断语句,应将循环语句置于判断语句的代码块之中。
5. 尽量用乘法或其它方法代替除法,特别是浮点运算中的除法。浮点运算除法要占用较多CPU资源。
4.7质量
1. 代码质量保证优先原则:
u 正确性,指程序要实现设计要求的功能。
u 稳定性、安全性,指程序稳定、可靠、安全。
u 可测试性,指程序要具有良好的可测试性。
u 规范/可读性,指程序书写风格、命名规则等要符合规范。
u 全局效率,指软件系统的整体效率。
u 局部效率,指某个模块/子模块/函数的本身效率。
u 个人表达方式/个人方便性,指个人编程习惯。
2. 认真处理程序所能遇到的各种出错情况。对于运行过程中的错误应进行提示同时记录错误日志,便于事后查找错误原因。
3. 严禁随意更改其它模块或系统的有关设置和配置。编程时,不能随心所欲地更改不属于自己模块的有关设置如常量、数组的大小等。
4. 不能随意改变与其它模块的接口。
5. 编程时,要防止差1错误。不能把"<="误写成"<"或">="误写成">"而导致错误。
6. 不要滥用goto语句。goto语句会破坏程序的结构性,所以除非确实需要,最好不使用goto语句。
7. 时刻注意表达式是否会上溢、下溢。使用变量时要注意其边界值的情况。
8. 系统应具有一定的容错能力,对一些错误事件(如用户误操作等)能进行自动补救。
9. 对一些具有危险性的操作代码(如写硬盘、删数据等)要仔细考虑,防止对数据、硬件等的安全构成危害,以提高系统的安全性。
10. 使用第三方提供的软件开发工具包或控件,可加快程序开发速度,节省时间,但使用之前一定对它有较充分的了解,同时第三方工具包与控件也有可能存在问题。要注意以下几点:
u 充分了解应用接口、使用环境及使用时注意事项。
u 不能过分相信其正确性,若碰到问题应及时与第三方开发商联系,不要无谓的去检查自己的代码而浪费事件。
u 除非必要,不要使用不熟悉的第三方工具包与控件。
11. 为用户提供良好的接口界面,使用户能较充分地了解系统内部运行状态及有关系统出错情况。