良好的開發準則, 可以幫助工程師有效率的管理自己的程式碼。
以下就來分享一下筆者自己跟這多年來與別人一起coding的一些心得, 把這些經驗整理成準則, 讓新手工程師可以參考一下。
有些開發工具如:Microsoft Visual Studio 或 Visual studio code 能幫我們在撰寫程式碼時, 就會自動縮排對齊功能、註解、自動帶出宣告過的的物件名或變數….減少拼錯字導致程序出錯的機率。初學者可以多利用這類的開發工具來撰寫程式。
一. 設計準則
- 可重覆被利用的程式段, 改寫成class function
隨著開發時間愈長, 你寫過的程式檔案會累積愈來愈多, 比如: 你寫了一個抽獎活動的API功能. 下一個專案可能會再用到; 或你這次專案寫了一個檢查發票格式或特殊電話規則的邏輯。如果未來可以被再拿出來應用的話, 你就可以試著將這些邏輯寫成function 統一放在一個 class 或 .js .vb 集中管理.
以後有新專案只要引用你已開發好的 class 或 js檔. 你就可以馬上使用了. 當然你也可以用google找到並下庫別人寫好的function開源碼。然後加到自己的class裡。
通常筆者外掛class有:
資料庫存取類、圖形處理類、加解密類、檢查格式類、傳輸檔案類、日期處理類、工具類….
小結: 以上就是你累積的coding外掛程式, 而且你的外掛會愈來愈多, 相對的你開發速度也會加快許多。 - 變數宣告統一在程式段的最前面
一開始就宣告好程式後面會用到的變數或物件名,好處是Visual Studio這類的開發工具可以在你coding過程中, 自動檢查已宣告過的變數名, 當你要取用變成或物件時, 系統就會自動帶出全名, 很方便快速又不怕會拼錯字。
小結:變數宣告集中管理, coding不易拼錯外, 日後維護查找bug也容易, 不會散落在各處。 - 程式碼加註解
梁爸除了上述1中的外掛function一定要加使用註解外,在專案裡有時也會習慣寫一下註解
… //取出學生的姓名
… // 2021/04/01 需求單位要求修改
… //暫定, 待debug - 區段大綱註解
在visual code裡, 只要在程式碼中輸入如下:
#region 開始處理訂單明細
……..
你的code
……..
#endregion
這段程式碼就會有收合的功能, 如果你這隻程式檔有上千行時, 這功能就很好用.平時可以縮成一行的段落標題, 要看時再點[+]展開看裡面的程式碼。
小結: 可以很容易讓人理解這段在寫什麼及到哪裡為止。增加日後管理維護的效率。 - 串接第三方的網址連結用變數
很多時候我們在開發上會需要串接第三方的API, 如: Facebook , Google login, 簡訊發送, 信用卡,….
這時我們一定會呼叫到對方的API URL, 建議一開始就宣告成共用變數放在某一個檔案或class集中管理.
如:
string SMSurl="http://test.sms.com/"; ‘//這是測試機位置
call SendSMS(SMSurl+"v1/unicode/……) //呼叫發送簡訊1
………
………
call SendSMS(SMSurl+"v1/unicode/……) //呼叫發送簡訊2
以上如果未來要改成對方正式機位置時, 只需改第一行的URL, 避免自已或接手的人漏改的情形。
小結: 第三方的API URL不要散落在各處, 要集中宣告管理. 日後好維護。
- 程式碼縮排
Visual Studio工具本身會自動縮排, 但如果使用其他文字編輯軟體時, 盡量也要縮排
如:int a=0;
for (int i=0; i<100; i++) {a += i;
if (a>50)
{break;
}}
縮排後如下:int a=0;
for (int i=0; i<100; i++)
{
a += i;
if (a>50)
{
break;
}
} - 物件生命週期及記憶體管理
C# 可以使用using語法來讓系統自動結束物件佔用的記憶體
如:using (sqlCommand MySqlcom = new sqlCommand())
{
......
} //這裡結束時 MySqlcom 會自動釋放記憶空間.
傳統寫法
sqlCommand MySqlcom = new sqlCommand();
MySqlcom.Commandtext=......
.....
MySqlcom.Dispose(); //這裡手動釋放記憶體.
可以參考入門書籍詳細介紹各程式語言對變數、物件生命週期的介紹及管理. 管理的好可以讓伺服器有足夠的記憶體使用、相對反應效能也比較好。
二. 命名規則
2.1 變數命名規則
變數命名時, 可以用英文正確拼出為原則, 如會員編號MemberID, 第一個字大寫, 遇到縮寫時全大寫.
當遇到由二個以上英文單字組成時, 不要用符號連接, 請直接英文相連即可
如: Member_ID 建議改成 MemberID
然後再最前面再加上三碼的變數型態來表示
如: intMemberID, strMemberName. 如此一來就可以很容易看出此變數的型態及用途。
2.2 程式命名規則
程式檔案命名一率都小寫(含副檔名), 第二個英文單字第一個字大寫
如: memberList.aspx 、orderEdit.php、memberData.js
2.3 Class、Function、Sub 命名規則
名稱:第一個字英文大寫, 第一個單字命名盡量與該功能名稱相符,
如: GetMemberInfo()、SetMemberData()、DelOrder()
參數:可以用英文正確拼出為原則, 如會員編號MemberID, 第一個字大寫, 遇到縮寫時全大寫.當遇
到由二個以上英文單字組成時, 不要用符號連接, 請直接英文相連即可如: Member_ID -> MemberID
2.4 資料Table命名
變數命名時, 可以用英文正確拼出為原則, 如會員編號MemberID, 第一個字大寫, 遇到縮寫時全大寫.
當遇到由二個以上英文單字組成時, 用符號_連接,
如: Member_Info, Order_Detail, Order_Payment
(這裡命名規則 與 變數及function用 “_ “區隔, 以便之後在程式碼可以容易分判是資料Table)
2.5 資料View命名
View命名規則直接用Table名前面加小寫v
如: vMember_Info
三. 安全性
3.1 表單上的輸入欄位一定要檢查格式及限制長度明確
如: 電話10碼且數字, E-mail50碼且符合E-mail格式, 姓名20碼不可有符號….
3.2 伺服器端API 參數格式檢查
上述3.1 通常由前端JS工程師做資料輸入檢查. 後端工程師(C#, PHP,nodeJS…)
在接收前端來的資料時也要再檢查一次, 因為駭客可以繞過表單,
直接攻擊你 (C#, PHP,nodeJS…) API接口。
3.2.1 寫入資料庫前, 一定要再做一次資料格式檢查
3.2.2 更新資料庫不可用字串組合T-SQL語法, 一律用參數方式寫入.
如:
………
strTEL=chkformat(Request.Form["MemberTEL"],"TEL",0,50,"電話",ref MSG); //先檢查格式
.......
msqlcom.Parameters.Add("@TEL",SqlDbType.Varchar,50).Value= strTEL; //再用參數傳入SQL
以上二段安全機制可以有下列好處:
1.第一道檢查格式不對時, 回傳正確的錯誤資訊給前端, 一方面串接時JS工程師可以快速知道是哪裡錯誤了, 減少雙方來回溝通時間。另一方面使用者也知道哪裡有資料沒填寫好。
2.第二道防SQLinjection攻擊或JSONinjection, 目前雖然還沒有JSONinjection問題, 但難保未來不會發生; 但工程師只要做好 3.2.1、3.2.2 基本上就有雙重保障。
如果你是初學者, 建議可以了解一下SQLinjection的作法, 你先學會如何去攻擊人家, 你才懂怎麼防。
以上感謝以前合作過的工程師們的交流分享, 在此與大家分享. 謝謝。
程式撰寫準則, 換一個角度其實是一種有效率的管理程式方法, 不是嗎?
頂尖的程式設計師大多都是有效率的程式設計師。XD