在一段PB源碼中,有如下一個函數定義:
<!-- @page { margin: 2cm } -->
public function integer wf_temp_accp (string ws_work_id);
LONG ll_row
LONG ll_count
STRING ls_mk
STRING ls_bill_no
LONG ll_next = 0
ll_count = dw_single.rowcount()
IF ll_count <=0 THEN RETURN -1
FOR ll_row = 1 TO ll_count
ls_mk = dw_single.getitemstring(ll_row,'chk_mk')
IF ls_mk = 'Y' THEN
ls_bill_no = dw_single.getitemstring(ll_row,'m_tbam_bill_no')
INSERT INTO x_temp_accp
values (:ws_work_id,'TEMP',:ls_bill_no,'0000');
ll_next ++
END IF
NEXT
IF ll_next = 0 THEN
RETURN -1
ELSE
RETURN 1
END IF
end function
<!-- @page { margin: 2cm } -->
1. 函數定義沒有注釋 , 不看代碼的人就不知道其功能是什麼 ?
2. 從程式看 , 返回值只是判斷有沒有寫入資料 , 所以對於此類問題最好定義 Boolean 類型返回值 .
3. 函數的參數名稱不符合我們的規範 .
4. 函數中綁定使用了一個 dw_single 對象 , 這樣此函數與 dw_single 集成在一起 , 不符合面向對象的低耦合原則 .
正確的應該是將 dw_single 作為參數傳入 .
5. 程式中判斷 ll_count <=0 是一個多餘的作法 , 因為在 FOR 語句中會判斷 ll_count 是否大於 ll_row.
6.FOR 語句中 , 並不是每一行都會執行 INSERT 動作 , 還需要判斷 chk_mk 欄位是否為 Y.
對於這類情況 , 我們最好是先執行 Filter 函數 , 將 chk_mk 不等於 Y 的內容過濾掉 .
這樣剩下的就是都需要 INSERT 的了 . 資料較多時 , 這個方法要快哦 .
7. 如果你上面的幾點做到了 . 那最后的返回值也是一條語句搞定 .