好:
void SavePhoneNumber ( string phoneNumber ) { // Save the phone number. }
不好:
// This method will save the phone number. void SaveData ( string phoneNumber ) { // Save the phone number. }
一個方法只完成一個任務。不要把多個工作群組合到一個方法中,即使那些任務非常小。
好:
// Save the address. SaveAddress ( address ); // Send an email to the supervisor to inform that the address is updated. SendEmail ( address, email ); void SaveAddress ( string address ) { // Save the address. // ... } void SendEmail ( string address, string email ) { // Send an email to inform the supervisor that the address is changed. // ... }
不好:
// Save address and send an email to the supervisor to inform that the address is updated. SaveAddress ( address, email ); void SaveAddress ( string address, string email ) { // Job 1. // Save the address. // ... // Job 2. // Send an email to inform the supervisor that the address is changed. // ... }
使用C# 或 VB.NET的特有類型,而不是System命名空間中定義的別名資料型別。
好:
int age; string name; object contactInfo;
不好:
Int16 age; String name; Object contactInfo;
別在程式中使用固定數值,用常量代替。
別用字串常數。用資源檔。
避免使用很多成員變數。聲明局部變數,並傳遞給方法。不要在方法間共用成員變數。如果在幾個方法間共用一個成員變數,那就很難知道是哪個方法在什麼時候修改了它的值。
必要時使用enum 。別用數字或字串來指示離散值。
好:
enum MailType { Html, PlainText, Attachment } void SendMail (string message, MailType mailType) { switch ( mailType ) { case MailType.Html: // Do something break; case MailType.PlainText: // Do something break; case MailType.Attachment: // Do something break; default: // Do something break; } }
不好:
void SendMail (string message, string mailType) { switch ( mailType ) { case "Html": // Do something break; case "PlainText": // Do something break; case "Attachment": // Do something break; default: // Do something break; } }
別把成員變數聲明為 public 或 protected。都聲明為 private 而使用 public/protected 的Properties.
不在代碼中使用具體的路徑和磁碟機名。 使用相對路徑,並使路徑可程式化。
永遠別設想你的代碼是在“C:”盤運行。你不會知道,一些使用者在網路或“Z:”盤運行程式。
應用程式啟動時作些“自檢”並確保所需檔案和附件在指定的位置。必要時檢查資料庫連接。出現任何問題給使用者一個友好的提示。
如果需要的設定檔找不到,應用程式需能自己建立使用預設值的一份。
如果在設定檔中發現錯誤值,應用程式要拋出錯誤,給出提示訊息告訴使用者正確值。
錯誤訊息需能協助使用者解決問題。永遠別用象"應用程式出錯", "發現一個錯誤" 等錯誤訊息。而應給出象 "更新資料庫失敗。請確保登陸id和密碼正確。" 的具體訊息。
顯示錯誤訊息時,除了說哪裡錯了,還應提示使用者如何解決問題。不要用 象 "更新資料庫失敗。"這樣的,要提示使用者怎麼做:"更新資料庫失敗。請確保登陸id和密碼正確。"
顯示給使用者的訊息要簡短而友好。但要把所有可能的資訊都記錄下來,以助診斷問題。
注釋
別每行代碼,每個聲明的變數都做注釋。
在需要的地方注釋。可讀性強的代碼需要很少的注釋。如果所有的變數和方法的命名都很有意義,會使代碼可讀性很強並無需太多注釋。
行數不多的注釋會使代碼看起來優雅。但如果代碼不清晰,可讀性差,那就糟糕。
如果應為某種原因使用了複雜艱澀的原理,為程式配備良好的文檔和重分的注釋。
對一個數值變數採用不是0,-1等的數值初始化,給出選擇該值的理由。
簡言之,要寫清晰,可讀的代碼以致無須什麼注釋就能理解。
對注釋做拼字檢查,保證文法和標點符號的正確使用。
好:
void ReadFromFile ( string fileName ) { try { // read from file. } catch (FileIOException ex) { // log error. // re-throw exception depending on your case. throw; } }
不好:
void ReadFromFile ( string fileName ) { try { // read from file. } catch (Exception ex) { // Catching general exception is bad... we will never know whether it // was a file error or some other error. // Here you are hiding an exception. // In this case no one will ever know that an exception happened. return ""; } }
不必在所有方法中捕捉一般異常。不管它,讓程式崩潰。這將協助你在開發週期發現大多數的錯誤。
你可以用應用程式級(線程級)錯誤處理器處理所有一般的異常。遇到”以外的一般性錯誤“時,此錯誤處理器應該捕捉異常,給使用者提示訊息,在應用程式關閉或 使用者選擇”忽略並繼續“之前記錄錯誤資訊。
不必每個方法都用try-catch。當特定的異常可能發生時才使用。比如,當你寫檔案時,處理異常FileIOException.
別寫太大的 try-catch 模組。如果需要,為每個執行的任務編寫單獨的 try-catch 模組。 這將幫你找出哪一段代碼產生異常,並給使用者發出特定的錯誤訊息
如果應用程式需要,可以編寫自己的異常類。自訂異常不應從基類SystemException派生,而要繼承於. IApplicationException。