Code Style規範

規範

0.變數

0.0.0 命名

變數名稱應該要簡單,並能代表它的意思,表達出來。

建議

var product = new Product();

不建議

var p = new Product();
var produ = new Product();

Lambda規範

建議

products.Where(product => product ... );

不建議

products.Where(p => p ... );

關於複數,用在集合或陣列

0.0.1 複數

建議

var products = new List<Product>();

不建議

var productList = new List<Product>();
 

 0.0.2 類型名稱

建議
var product = new Product();
不建議
var productModel = new Product();
不建議
var productObj = new Product();

1 方法

1.0 命名

方法的命名應該要執行操作的摘要,它需要保持準確和簡短 

1.0.0 動詞

方法名稱中必須包含動詞來表示它執行的操作。

建議
public List<Student> GetStudents() 
{ 
	...
}
不建議
public List<Student> Students() 
{ 
   ...
}

 

1.0.1 異步

非同步方法應該放置動詞的操作方法後面  Async 通常返回的方法應該返回 TaskValueTask

建議
public async ValueTask<List<Student> GetStudentsAsync() 
{ 
	...
}
不建議
public async ValueTask<List<Student> GetStudents() 
{ 
	...
}


 

1.0.2 方法參數

方法參數應該明確說明它們給予的物件或是它的意思

建議
public async ValueTask<Student> GetStudentByNameAsync(string studentName) 
{ 
	... 
}
不建議
public async ValueTask<Student> GetStudentByNameAsync(string text) 
{ 
	...
}
不建議
public async ValueTask<Student> GetStudentByNameAsync(string name) 
{ 
	...
}

 

1.0.3 動作參數

如果您的方法正在使用特定參數執行操作,請指定它。

建議
public async ValueTask<Student> GetStudentByIdAsync(Guid studentId) 
{ 
	... 
}
不建議
public async ValueTask<Student> GetStudentAsync(Guid studentId) 
{
	 ... 
}


 

1.0.4 傳遞參數

在使用方法時,如果輸入參數別名與傳入的變量部分或全部匹配,則不必使用別名,否則必須使用別名指定值。

假設你有一個方法:

Student GetStudentByNameAsync(string studentName);
建議
string studentName = "Todd"; Student student = await GetStudentByNameAsync(studentName);
建議
Student student = await GetStudentByNameAsync(studentName: "Todd");
建議
Student student = await GetStudentByNameAsync(toddName);
不建議
Student student = await GetStudentByNameAsync("Todd");
不建議
Student student = await GetStudentByNameAsync(todd);



 

1.1 組織

一般來說,將多行相同的邏輯封裝到自己的方法中,並始終將您的方法保持在細節級別 0。

1.1.0 一行的狀況

任何只包含一行代碼的方法都應該使用粗箭頭。

建議
public List<Student> GetStudents() => this.storageBroker.GetStudents();
不建議
public List<Student> Students()
{
	return this.storageBroker.GetStudents();
}

如果單行方法超過 120 個字符的長度,則在粗箭頭後用一個額外的製表符換行。


 

1.1.1 回傳

對於多行方法,在方法邏輯和最終返回行(如果有)之間換行。

建議
public List<Student> GetStudents(){
	StudentsClient studentsApiClient = InitializeStudentApiClient();

	return studetnsApiClient.GetStudents();
}
不建議
public List<Student> GetStudents(){
	StudentsClient studentsApiClient = InitializeStudentApiClient();
	return studetnsApiClient.GetStudents();
}


 

1.1.2 關於呼叫

對於多個方法調用,如果兩個調用都少於 120 個字符,則它們可能會堆疊,除非最終調用是方法返回,否則用新行分隔

建議
public List<Student> GetStudents()
{ 
   StudentsClient studentsApiClient = InitializeStudentApiClient();
   List<Student> students = studetnsApiClient.GetStudents();
   
   return students;
}
不建議
public List<Student> GetStudents()
{
   StudentsClient studentsApiClient = InitializeStudentApiClient(); 
   
   List<Student> students = studetnsApiClient.GetStudents();
   
   return students;
}
建議
public List<Student> GetStudents()
{ 
    StudentsClient washingtonSchoolsStudentsApiClient = 
             await InitializeWashingtonSchoolsStudentsApiClientAsync();   		
    
    List<Student> students = studetnsApiClient.GetStudents(); 
    return students;     
}
不建議
public List<Student> GetStudents()
{   
     StudentsClient washingtonSchoolsStudentsApiClient =
                    await InitializeWashingtonSchoolsStudentsApiClientAsync(); 
     List<Student> students = studetnsApiClient.GetStudents(); 

     return students;
}


 

1.1.3 宣告

建議
public async ValueTask<List<Student>> GetAllRegisteredWashgintonSchoolsStudentsAsync(
       StudentsQuery studentsQuery)
{
   ... 
}
不建議
public async ValueTask<List<Student>> GetAllRegisteredWashgintonSchoolsStudentsAsync(StudentsQuery studentsQuery)
{
	...
}



 

1.1.4 多參數

如果要傳遞多個參數,並且方法調用的長度超過 120 個字符,則必須以參數分隔,每行一個參數。

建議
List<Student> redmondHighStudents = await QueryAllWashingtonStudentsByScoreAndSchoolAsync(
	MinimumScore: 130,
	SchoolName: "Redmond High");
不建議
List<Student> redmondHighStudents = await QueryAllWashingtonStudentsByScoreAndSchoolAsync(
	MinimumScore: 130,SchoolName: "Redmond High");

 

4 類別

4.0 命名

在 MBSCV 體系結構中表示服務或代理的類應在其命名約定中表示類的類型,但這不適用於模型。

4.0.0 模型

建議
class Student
{
   ... 
}
不建議
class StudentModel 
{

}


 


 

4.0.1 服務

以一種獨特的方式,對於任何包含業務邏輯的類。
 

建議
class StudentService { .... }
不建議
class StudentsService{ ... }
不建議
class StudentBusinessLogic 
{
   ...
}
不建議
class StudentBL 
{ 
  ... 
}

 

4.0.3 控制器

以復數方式,反映 /api/students 等端點,以通過 RESTful 操作公開您的邏輯。

建議
class StudentsController {
   .... 
}
不建議
class StudentController {
    ... 
}



 

4.1 屬性

字段是直接在類或結構中聲明的任何類型的變量。字段是其包含類型的成員。

4.1.0 命名

類字段以駝峰式命名。

建議
class StudentsController {
	private readonly string studentName;
}
不建議
 class StudentController {
	private readonly string StudentName;
}
 
不建議
class StudentController {
	private readonly string _studentName;
}

應遵循與變量部分中提到的相同的命名規則。


 


 

4.1.1 參考

建議
class StudentController {
	private readonly string _studentName;

	public StudentsController(string studentName) {
		_studentName = studentName;
	}
}
不建議
class StudentsController {
	private readonly string _studentName;
	
	public StudentsController(string studentName) {
		this.studentName = studentName;
	}
}

4.2 實例化

4.2.0 輸入參數別名 
 

如果輸入變量名稱與輸入別名匹配,則使用它們,否則必須使用別名,尤其是傳入的值。

建議
int score = 150;
string name = "Josh";

var student = new Student(name, score);
 
建議
var student = new Student(name: "Josh", score: 150);
不建議
var student = new Student("Josh", 150);
 

 

 

額外補充:https://www.dofactory.com/csharp-coding-standards#abbreviations

 

 

元哥的筆記