介紹
在當今時代,編寫代碼並不困難。然而,編寫乾淨且可伸縮的代碼並不容易。在本文中,我們將討論一些為我們的項目編寫乾淨C#代碼的技巧。乍一看,任何以前從未見過您的代碼的開發人員都必須儘可能地理解它,它幫助我們更好地理解代碼。
下面是編寫乾淨C#代碼的一些重要技巧。
使用好的IDE
首先,為您的技術堆棧選擇最好的IDE。在我們的例子中,Visual Studio是C#最流行、最好的IDE之一。它是微軟可靠的、完全的產品。一些開發人員也喜歡Rider IDE(付費)。使用這些IDE可以確保代碼保持整潔。Visual Studio有相當穩定的智能感知特性,可以糾正和建議代碼中的更改。
使用有意義的名字
命名變量可能是整個軟體開發生命周期中最困難的部分。為變量和方法想一個有意義的名稱是非常耗時的。但是跳過這個過程並隨機命名也不是一個好主意,不是嗎?
不建議寫法
int d;
這是命名變量最簡單的方法,對吧?但是不要這樣做。一個好的名稱可以幫助其他開發人員理解變量/方法的上下文和用法。下面是您想要命名變量的方式。
建議寫法
int daysToAppocalypse;
使用駱駝/帕斯卡大小寫符號
除了為變量選擇一個合適的名稱外,還要維護您編寫名稱的方式。理想情況下,我們使用駱駝大小寫和Pascal大小寫表示法作為最佳代碼實踐。不要在變量中使用隨機大寫字母。那看起來就是不漂亮!
駝峰式大小寫符號
基本上,變量的第一個單詞的第一個字母將是小寫的,後面每一個單詞的第一個字母應該是大寫的。在命名局部變量和方法參數時,必須使用這種符號。
不建議寫法
int RandomInteger; string FirstName;
建議寫法
int randomInteger; string firstName;
帕斯卡案例符號
這裡,您所有單詞的首字母應該是大寫,我們使用這種符號來命名方法和類。
不建議寫法
class program { static void main(string[] args) { Console.WriteLine("Hello World!"); } }
建議寫法
class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } }
注意格式
對代碼進行格式化可以提高代碼的可讀性。制表符優於空格,記得嗎?
class Program {static void Main(string[] args) {Console.WriteLine("Hello World!"); } }
這個看起來怎麼樣?很討厭,是嗎?現在,Visual Studio有一個內置特性,可以完美地格式化代碼。要做到這一點,只需到相關的類中按CTRL + K和CTRL + d,看到了嗎?很酷,是嗎?
在需要的時候添加注釋
這是我們所有開發人員都討厭的事情,不是嗎?然而,從長遠來看,添加幾行評論/描述的方法確實能幫助你和其他開發人員。Visual Studio使它變得更加容易,只要在相關的方法上面輸入///,VS就會自動為您生成一個包含方法參數的注釋模板。
為什麼這麼酷?無論何時(從任何地方)調用這個方法,Visual Studio都會顯示您的注釋。相信我,這很有幫助。
P.S. 只有在情況需要的時候才添加評論。例如,當某個特定方法過於複雜,需要深入解釋時。在這種情況下,您需要添加注釋。記住,維護注釋也將成為一項任務,因此要有節制地使用注釋。
重用代碼
編寫可重用的代碼是非常重要的。它可以減少項目中的總代碼行數,並提高效率。您不希望通過多個類複製粘貼一個函數。相反,您可以做的是創建一個共享庫項目,並在每個必需的項目中引用它。通過這種方式,我們構建了可重用的函數。而且,如果需要進行任何修改,您只需要更改共享庫中的代碼,而不是在任何地方更改。
保持類儘可能小
根據Solid原則,您必須將類隔離為只有一個職責函數的小塊。這有助於我們實現鬆散耦合的代碼。確保您在查看類時不需要反覆滾動。這可以是一個一般的經驗法則。
使用設計模式
這可能是架構師級別的開發人員需要做的事情。確定將哪種設計模式應用於哪種場景需要大量的經驗。設計模式基本上是能夠在架構解決方案時提供可重用解決方案的模式。
把您的解決方案組織好
你構建結構化的解決方案嗎?建立一個這樣的系統是非常令人滿意和重要的。下面是我遵循洋蔥架構的一個解決方案。
在單個項目中仍然可以完成所有工作。但是,為了支持可伸縮性和鬆散耦合的解決方案,我們將它們分成不同的層,如應用程式、領域、基礎設施等。
這裡還有一些其他的優勢:
可重用性——如果您想將同一個項目用於另一個解決方案,您可以這樣做。 改進的安全性 高度可維護的 可伸縮的 控制反轉等避免魔法字符串/數字
什麼是魔法字符串?它們是直接在應用程式代碼中指定的字符串,對應用程式的行為有直接影響。換句話說,不要在應用程式中使用硬編碼的字符串或值。當應用程式增長時,跟蹤這些字符串是很困難的。此外,這些字符串可以與某種外部引用相關聯,如文件名、文件路徑、URL等。在這種情況下,當資源的位置發生變化時,必須更新所有這些神奇的字符串,否則應用程式將中斷。考慮下面的例子:
if(userRole == "Admin") { //logic here }
你可以這樣寫:
const string ADMIN_ROLE = "Admin" if(userRole == ADMIN_ROLE ) { //logic here }
或者,您也可以為用戶角色創建枚舉並簡單地使用它。這是一種更簡潔的編寫代碼的方式。
刪除未使用的代碼
通常會有注釋掉未使用代碼的做法,這最終會增加應用程式編譯時的代碼行數。你不應該這樣做。您可以使用像Git這樣的源控制項來確保您可以在任何時候恢復。寧願使用Git而不是注釋掉代碼。
使用方法連結
這是Microsoft在默認生成代碼中廣泛使用的一種常見技術。在這裡,每個方法返回一個對象,這些函數將被連結在一起。認識嗎?這是方法連結的一個很好的例子。
services.AddHealthChecks().AddSqlServer(_configuration.GetConnectionString("DefaultConnection"));
下面是一個詳細的例子。我們有一個student類和另一個創建並返回數據填充student對象的隨機方法。
public class Student { public string Name { get; set; } public int Age { get; set; } } public Student SomeMethod() { Student testStudent = new Student(); testStudent.Name = "Jay Krishna Reddy"; testStudent.Age = 25; return testStudent; }
對我們開發人員來說,設置Student對象的值可能不是問題。但是,讓我們假設一個單元測試開發人員必須在您的類上進行測試,並且實際上沒有C#,或者您想通過簡化整個過程來取悅您的客戶。這就是連貫接口的用武之地。創建一個新的連貫類,如下所示:
public class StudentFluent { private Student student = new Student(); public StudentFluent AddName(string name) { student.Name = name; return this; } public StudentFluent AddAge(int age) { student.Age = age; return this; } } public StudentFluent SomeMethod() { return new StudentFluent().AddName("Jay Krishna Reddy").AddAge(25); }
這很有意義,並且在一個全新的層次上提高了可讀性,對嗎?方法連結的另一個簡單例子如下:
public string AnotherMethod() { string name = "Jay Krishna"; return name.Replace("J", "A").Replace("A", "J").Replace(".", string.Empty); }
使用異步/等待
異步編程是最好的選擇!異步編程在處理需要一些時間才能完成計算的函數時,有助於提高總體效率。在這樣的函數執行期間,對於最終用戶來說,整個應用程式似乎是凍結的。這導致了糟糕的用戶體驗。在這種情況下,我們使用異步方法來釋放主線程。
不要在catch塊使用Throw ex
您確實不希望只是在捕獲異常並丟失堆棧跟蹤數據後對其進行「throw ex」。 只需使用「throw」即可。 通過使用此方法,您還可以存儲堆棧跟蹤,這對於診斷很重要。
不建議寫法
try { // Do something.. } catch (Exception ex) { throw ex; }
建議寫法
try { // Do something.. } catch (Exception ex) { throw; }
使用三元運算符
考慮下面的例子,我相信你們很多人仍然在遵循這一做法。
public string SomeMethod(int value) { if(value == 10) { return "Value is 10"; } else { return "Value is not 10"; } }
但如果有更好更清潔的方法呢?引入三元操作符。
現在我們之前寫的多行代碼可以使用三元運算符縮減為一行,您可以開始想像這將節省多少行代碼!
public string SomeMethod(int value) { return value == 10 ? "Value is 10" : "Value is not 10"; }
使用Null合併操作符
類似地,我們還有另一個操作符,可以在進行null檢查時派上用場。??這個操作符在C#中稱為Null合併操作符。
考慮另一個例子,下面是一個接受Student對象作為參數並檢查空對象的小函數。如果為空,返回一個帶有數據的新對象,否則返回相同的對象。
public Student SomeMethod(Student student) { if (student != null) { return student; } else { return new Student() { Name = "Jay Krishna Reddy" }; } }
讓我們添加操作符並縮小這個函數!
public Student SomeMethod(Student student) { return student ?? new Student() { Name = "Jay Krishna Reddy" }; }
首選字符串插值
每次您要向字符串添加動態值時,我們都傾向於使用複合格式或僅使用加號將其添加。
public string SomeMethod(Student student) { return "Student Name is " + student.Name + ". Age is " + student.Age; }
從C# 6開始,引入了String Interpolation功能。 這提供了一種更具可讀性和涼爽性的語法來創建格式化的字符串。 這是使用內插字符串的方法。
public string SomeMethod(Student student) { return $"Student Name is {student.Name}. Age is {student.Age}"; }
使用表達體法
這樣的方法用於方法體甚至比方法定義本身小得多的場景中。為什麼要浪費括號和代碼行呢?下面是編寫表達式體方法的方法。
public string Message() => "Hello World!";
避免太多參數
太多的參數總是一場噩夢。如果你傾向於有超過3個參數輸入到任何方法,為什麼不把它包裝到一個請求對象或其他東西,然後傳遞?讓我們看一個小例子。
public Student SomeMethod(string name, string city, int age, string section, DateTime dateOfBirth) { return new Student() { Age = age, Name = name, //Other parameters too }; }
你可能希望它是這樣的。
public Student SomeMethod(Student student) { return student; }
不要忽略捕捉到的錯誤
這是我一直在做的事情。你們很多人很有可能也會這樣做。我們添加了一個try-catch塊並忽略了錯誤處理,對嗎?處理此類錯誤並將其記錄到表或磁碟是一種很好的實踐。
public void SomeMethod() { try { DoSomething(); } catch { } } public void SomeMethod() { try { DoSomething(); } catch (Exception ex) { LogItSomewhere(ex); } }
【編輯推薦】
【責任編輯:
未麗燕TEL:(010)68476606】