Home [C# 筆記] 命名
Post
Cancel

[C# 筆記] 命名

專案命名

  • {機關名稱}.{專案名稱}.{專案類型}
  • 命名均統一為單數
  • 舉例
    • 機關名稱:體育署(Sa)
    • 專案名稱:基金會預算報備(Fund)
    • 專案類型:網站(Web), 主控台(Console)
    範例專案類型
    Sa.Fund.Web網站
    Sa.Fund.Service業務邏輯層
    Sa.Fund.Library類別庫
    Sa.Fund.ConsoleConsole

專案結構

  • Service
    • 業務邏輯
  • Library
    • 相關共用類別等
      • 如:Models, Enums, Repository etc…
  • UI
    • Web, Console etc…

變數命名

  • 不論是何種物件(類別、屬性、方法、事件、函數、委派或其他物件等),只要是非專屬於迴圈中使用的,一律採明確名稱方式命名,其名稱需要明白的表明用途,不可使用無意義的名稱
  • 不得使用匈牙利命名法
    • 如:lngAmount、iDataCount、strCompanyName等
  • 若物件仍難以直接由名稱了解時,則必須要在宣告處加上註解以協助閱讀
  • 命名物件時,不要使用底線(_)來連接兩個字彙

類別私有成員變數
  • 屬性(Property)
    • 使用 Pascal 命名法(每個單字字首都要大寫)
    1
    
    public string SampleString;
    
  • 全域變數(Global Variable)
    • 使用 Pascal 命名法(每個單字字首都要大寫)
    1
    
    public int DataCount;
    
  • 私有全域變數(Private Global Variable)
    • 使用底線加上 camelCasting 命名法(第一個單字字首小寫,其他單字字首大寫)
      1
      
      private int dataCount;
      
  • 私有變數(Local Variable)
    • 使用 camelCasting 命名法(第一個單字字首小寫,其他單字字首大寫)
      1
      
      bool lightSwitch;
      

類別與方法
  • 使用 Pascal 命名法(每個單字字首都要大寫)
  • 類別

    1
    2
    3
    
      public class ForDemoPurpose
      {
      }
    
  • 方法
    • 方法傳入之變數因為私有變數,所以按照 camelCasting 命名法命名
      1
      2
      3
      4
      5
      6
      7
      
        private void BindShipGrid() 
        {
        }
              
        public string BindShipList(int id)
        {
        }
      

特殊規則

Action 回傳之 Model 變數均命名為:model

1
2
3
4
5
```csharp
  public ActionResult Index(ViewModel model)
  {
  }
```

ASP.NET MVC 命名

Controller

Controller 均使用單數命名 csharp public class AccountController : BaseController { }


特殊規則

  • Action 回傳之 Model 變數均命名為:model
    1
    2
    3
    
      public ActionResult Index(ViewModel model)
      {
      }
    

註解

  • 不要有想法:我之後再回來補!
  • 安裝 GhostDoc Pro
    • Ctrl + Shift + D
  • 註解開始前先空一格

    1
    
    // 檔不可以沒有註解
    
  • class 註解
    • summary: 描述此 class 之大致用途
    1
    2
    3
    4
    5
    
      /// <summary>
      /// 會議室相關
      /// </summary>
      [AllowAnonymous]
      public class BookingController : Controller {}
    
  • 方法註解
    • summary: 描述此方法之大致用途
    • param: 說明傳入參數
    • return: 說明回傳資料之意義與型態
      • ActionResult 只要寫參數型態就好(工具會自動產生)
    1
    2
    3
    4
    5
    6
    7
    
      /// <summary>
      /// 審核會議室租借
      /// </summary>
      /// <param name="id">The meeting identifier.</param>
      /// <param name="type">The permission type.</param>
      /// <returns>ActionResult.</returns>
      public ActionResult Approve(string id, int? type) {}
    
  • 一般程式註解
    • 要針對邏輯處做大致說明,以讓接手的人較快速了解
    • 將程式碼分成多個片段,每個片段執行一個簡單的任務,然後在每個片段前添加註解,引導讀者即將發生什麼。
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    
      // 取得CRM最新一筆資料的日期
      query = "select top 1 * from ST02 order by IPTDAT desc";
      lastDate = _dbc.QueryUsePara(query, null).Tables[0].Rows[0]["IPTDAT"].ToString();
    
      // 從最後一天資料開始抓,避免有可能CRM資料在新增時,進港預報剛好又有新的
      query = "select * from DBO.ST02 WHERE IPTDAT > '" + lastDate + "' order by IPTDAT ASC";
      ds = _da.Query(query);
    
      // 判斷CRM是否已有此筆資料,沒有則新增
      foreach (DataRow dr in ds.Tables[0].Rows)
      {
          query = "select * from ST02 where BOASNO = @NO";
          var para = new IDataParameter[1];
          para[0] = new SqlParameter { ParameterName = "@NO", Value = dr["BOASNO"].ToString(), DbType = DbType.String };
          if (_dbc.QueryUsePara(query, para).Tables[0].Rows.Count == 0)
          {
              // 沒有資料,新增
              query = "insert into ST02 ([BOASNO],[UPDTOT],[APLDAT],[APLTIM],[APRDAT],[APRTIM],[PLIDAT],[PLITIM],[IPTDAT],[IPTTIM],[IPSDAT],[IPSTIM],[AKWDAT],[AKWTIM],[PLODAT],[PLOTIM],[BERDAT],[BERTIM],[VACBER],[VACBEE],[ENTRID],[ENTDAT],[ENTTIM],[UPDAID],[UPDDAT],[UPDTIM]) VALUES" +
                  "('" + dr["BOASNO"].ToString() + "','" + dr["UPDTOT"].ToString() + "','" + dr["APLDAT"].ToString() + "','" + dr["APLTIM"].ToString() + "','" + dr["APRDAT"].ToString() + "','" + dr["APRTIM"].ToString() + "','" + dr["PLIDAT"].ToString() + "','" + dr["PLITIM"].ToString() + "','" + dr["IPTDAT"].ToString() + "','" + dr["IPTTIM"].ToString() + "','" + dr["IPSDAT"].ToString() + "','" + dr["IPSTIM"].ToString() + "','" + dr["AKWDAT"].ToString() + "','" + dr["AKWTIM"].ToString() + "','" + dr["PLODAT"].ToString() + "','" + dr["PLOTIM"].ToString() + "','" + dr["BERDAT"].ToString() + "','" + dr["BERTIM"].ToString() + "','" + dr["VACBER"].ToString() + "','" + dr["VACBEE"].ToString() + "','" + dr["ENTRID"].ToString() + "','" + dr["ENTDAT"].ToString() + "','" + dr["ENTTIM"].ToString() + "','" + dr["UPDAID"].ToString() + "','" + dr["UPDDAT"].ToString() + "','" + dr["UPDTIM"].ToString() + "');";
              _dbc.InsertUsePara(query);
          }
        }
      }
    

程式碼格式與樣式

主要樣式均已設定於 StyleCop 中

  • 大括號後需換行後接續程式碼 (Class, Method, if, while etc…)

    1
    2
    3
    4
    
       public class AccountController : Controller
       {
         private const string XsrfKey = "XsrfKey";
       }
    
  • 大括號結尾後需間隔一行

    1
    2
    3
    4
    5
    6
    
       if (isTest)
       {
           Trace("Testing...");
       }
    
       ShowResult(0);
    
  • 每個方法或類別之間需間隔一行

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
       public ChallengeResult(string provider, string redirectUri) : this(provider, redirectUri, null)
       {
       }
    
       public ChallengeResult(string provider, string redirectUri, string userId)
       {
           LoginProvider = provider;
           RedirectUri = redirectUri;
           UserId = userId;
       }
    
  • 除了 for loop 外,禁止使用無意義變數

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    
       // for loop example
       for (int i = 1; i <= 5; i++)
       {
           Console.WriteLine(i);
       }
          
       // other example
       int count = 0;
       while(count<10)
       {
           count++;
       }
    
  • 空白行不可超過兩行以上

    • 以下為不符規範範例

      1
      2
      3
      4
      5
      6
      7
      
         private string Example(string str, int len)
         {
             str = str.Substring(0, len);
      
      
             return str;
         }
      
    • 以下為符合規範範例

      1
      2
      3
      4
      5
      6
      
         private string Example(string str, int len)
         {
             str = str.Substring(0, len);
      
             return str;
         }
      

https://github.com/lettucebo/Ci.Convention/blob/master/TECH/C%23.md

This post is licensed under CC BY 4.0 by the author.