一、 書寫格式
a. 用分層縮進的寫法顯示嵌套結構的層次。
b. 在註釋段與程序段,以及不同邏輯的程序段之間插入空行。
c. 每行只寫一條語句,當需要滾動顯示時應該分行書寫。
二、 流控制
流控制首先應遵守PowerBuilder語法規範,且用分層縮進的寫法突出顯示嵌套的層次結構,例如:
For i = 1 To 100
For j = 1 To 50
For k = 1 To 200
Matrix[i,j,k]=1
Next
Next
Next
三、註釋及格式要求
註釋總是加在程序中需要概括性說明或不易令人理解或容易令人理解錯的地方。註釋語言應簡練、易懂而又準確,所採用的語種首選是中文,如有輸入困難或特殊需求也可採用英文。
註釋原則:
a. 函數或過程的註釋
(1) 在函數頭部必須說明函數的功能和參數(值參、變參);
(2) 在函數的主體部分,如算法複雜時,應以註釋的方式對其算法結構做出說明;
(3) 函數申請過全局資源且有可能導致資 源緊張應加以註明(如內存和文件柄等);
(4) 函數有副作用一定以十分醒目的方式(如加!號等)註明。
b. 語句的註釋
(1) 應對不易理解的分支條件表達式加註釋;
(2) 不易理解的循環,應說明出口條件(有GOTO的程序還應說明入口條件);
(3) 過長的函數實現,應將其語句按實現的功能分段加以概括性說明。
c. 常量和變量的註釋
在常量名聲明後應對該名做適當的註釋,註釋說明的要點是:
(1) 被保存值的含義(必須) ;
(2) 合法取值的範圍(可選);
(3) 全局量需要對以上逐點做充分的說明。
d. 制定對象的註釋
每個開發人員針對自己所制定的窗口、菜單、數據窗口、數據管道和用戶對象等添加註釋,要點是:
(1) 標註對象的用途;
(2) 標註對象的制定人員;
(3) 標註時間或者修改時間。
具體格式要求如下:
1. 在窗口Open事件前應說明
/* ======================================================= */
// 窗口中英文名稱:
// 窗口作用:
// 作者:
// 日期:
/* ======================================================= */
2. 在事件腳本(Script)之前應說明
/* ======================================================= */
// 腳本作用:
// 輸入參數及數據類型:
// 返回參數及數據類型:
// 全局函數及其用途:
// 全局變量及其用途:
// 作者:
// 日期:
// 修改人的姓名:
// 修改日期:
// 修改原因:
/* ===================================================== */
若有多人修改,每個人均加上自己的註釋,而不能改他人的姓名、日期、原因,對要修改的腳本,只能註釋不能刪除,並且在修改的地方加上修改人名、日期和"Beginning Modification... ","Ending Modification"字樣。
3. 腳本中的註釋
單行腳本程序註釋:
// 註釋文本
腳本的程序段註釋:
/* ================================== */
//
// 註釋文本
//
/* ================================== */
變量的註釋如下:
數據類型 變量名 //註釋
4. 在函數、存儲過程等腳本(Script)之前應說明
/* ======================================================= */
// 函數名稱:
// 參數解釋:
// 功能描述:
// 調用舉例:
// 最初作者:
// 編寫日期:
// 返 回 值:
// 變量情況:
// 修 改 人:
// 修改日期:
// 修改原因:
/* ======================================================== */
四、Powerbuilder腳本編程規範
1. Powerbuilder編程注意事項
a. 不要在子應用中聲明全局變量!如必須聲明全局變量,則應事先向項目負責人申請。
b. 供別的文件或函數調用的函數,絕不應使用全局變量交換數據。
c. 所有SQL語句均需判斷返回結果(包括SELECT,COMMIT語句)。
例: If sqlca.sqlcode = -1 Then
錯誤處理程序
跳出
Else
正常
End If
d. 缺省SQLCA的連接語句connect,在應用Open事件中完成,其disconnect在主應用的Close事件中完成,其餘任何pbl中均不能有disconnect語句。
e. 由於要連接多個數據庫,需要用Create創建對象,比如:SQLSYB,則用 connect using SQLSYB,處理完畢後用 disconnect using SQLSYB,並且用 destroy SQLSYB釋放資源。
2. 編碼標準
(1)在代碼塊前後留一個空行。例子如下:
If Then
End If
For = To Step
Next
(2)把單行註釋與當前script程序的縮進位置對齊:
//This is a comment For condition1
If Then
//This is a comment For condition2
If Then
//This is a comment For action1
End If
End If
(3)縮進應以Tab鍵實現,不得采用空格。
(4)變量採用小寫格式。注意:
① 變量全部用小寫;
② 一個變量一行,每個變量必須註釋;
③ 通常情況下,變量的後半部分儘量用數據庫字段名;
④ 變量聲明全部在腳本之前聲明完畢;
⑤ 所有變量聲明時按代碼功能段 + 變量類型進行排序。例如:
Long ll_quantity
String ls_name
對象名採用小寫,屬性、關鍵字、保留字和內置函數均用首字母大寫格式:
w_cont_de.Visible = True
m_mdi.m_file.m_print.Enabled = False
數據窗口控制的函數加上修飾,而不以數據窗口對象作爲參數:
dw_main.SetTransObject(sqlca)
dw_main.SetRowFocusIndicator(Hand!)
dw_main.Retrieve()
(5)當連接起來的字符串超過了兩行的長度時,使用 + 符作爲下行的第一個字符,每次均採用縮進格式。字符串的隨後部分應該再次縮進。例如:
ls_msg = "連接數據庫失敗!錯誤信息爲:~r~n" &
+ Sqlca.SqlErrText &
+ "請與系統管理員聯繫"
(6)PowerBuilder保留字(關鍵字)首字母大寫其餘小寫,這樣看起來層次清晰,如:This,Parent,ParentWindow,True,False,Return,Halt與Close。
(7)PowerBuilder內部函數及屬性每個字首字母大寫其餘小寫,這樣看起來層次清晰,如:sle_user.Text,dw_1.SetTransObject(Sqlca),Sqlca.SqlErrText。
(8)SQL語句按如下格式書寫:
SELECT name,sex,dept_id
INTO :ls_name,:ls_sex,:ls_dept_id
FROM employee
WHERE emp_id = :ls_emp_id ;
(9)程序中應避免出現 goto 跳轉語句。
3. 腳本中一些常用功能模塊的編程約定
(1)光標操作過程的編程約定如下:
Declare Cursorname Cursor for
Select語句
Open Cursorname;
fetch Cursorname into
Do While Sqlca.Sqlcode = 0
fetch Cursorname into
Loop
Close Cursorname
光標命名規則:“Cur” + “_” + 名稱。
(2)調用數據庫存儲過程的編程約定如下:
declare Procedurename procedure For StoredProcedureName
:Value1,:Value2......;
execute Procedurename;
fetch Procedurename into ;
close Procedurename;
commit;
存儲過程命名規則:“Pro” + “_” + 名稱。
有些系統存儲過程(例如:sp_droplogin)不能當做一個事務提交,爲了執行它,就必須先置事物對象的AutoCommit屬性爲True,當存儲過程執行完畢後再將事務對象的AutoCommit屬性置爲False。
(3)在每一個SQL語句之後必須判斷SQL語句執行成功與否,成功則繼續,不成功則做相應處理並給出一條提示信息。
If Sqlca.SqlCode <> 0 Then
Rollback ;
MessageBox("錯誤信息","操作失敗!")
Else
Commit;
MessageBox("提示信息","操作成功!")
End If
(4)所有操作符(包括等號)前後應留一空格,使程序看起來更清晰。例如:
ls_msg = ls_title + ls_error
(5)僅當絕對需要時纔在循環結構體中使用函數調用,也就是說,僅當函數的返回值依賴於循環迭代的值時才使用函數調用。
使用如下方法:
Long ll_num_selected
ll_num_selected = lb_devctg.TotalSelected()
For i = 1 To num_selected
……
Next
不使用下述方法:
For i = 1 To lb_1.TotalSelected()
……
Next
4. PB中的任何一個窗口都要有註釋說明
一般在窗口的Open事件中對窗口的功能進行全面的介紹,以便維護人員可以很清楚地知道窗口的功能和維護要點。其格式可參見前面的說明。
5. 表的操作
在程序中涉及多個表的操作時,需嚴格按照各項目組“表操作順序一覽表”規定的順序對錶進行操作,以防發生鎖表現象。