用 C# 编写更简洁代码的 5 条准则
您的 C# 代码应该尽可能易于阅读和理解,但这通常会很困难,因为开发人员的编码风格各不相同。因此,ByteHide 决定提供以下 5 条指南,帮助您编写更易读的 C# 代码,让团队中的每个人以及将来参与您项目的人都能轻松理解。
使用精心设计的 C# 类和函数也可以减少您需要编写的代码行数,因为更短的方法和更少的行数通常可以提高代码的可理解性。
这些技巧改编自《Clean Code Javascript》。感谢Ryan McDermott 的杰出贡献!
始终封装条件
封装是一种有助于将实现细节与向另一个类的客户端公开的行为隔离的方法。
不好的方法:
if (website.state == "down")
{
// ...
}
好方法:
if (website.IsDown())
{
// ...
}
此外,封装允许更好地控制所编写代码的耦合。
使用私有/受保护成员
通过不使用私有/受保护的成员,它们很容易被修改(意外或无意),这可能会导致代码错误。
我们必须牢记,我们要对代码中授予的权限负责。这听起来可能有点抽象,但如果一个字符串必须是只读的,那么指定它是只读的而不是可写的,就是你的义务。
不好的方法:
class Car
{
public string Brand { get; set; }
public Car(string brand)
{
Brand = brand;
}
}
var car = new Car("Porsche");
Console.WriteLine(car.Brand); // Car brand: Porsche
好方法:
class Car
{
public string Brand { get; }
public Car(string brand)
{
Brand = brand;
}
}
var car = new Car("Porsche");
Console.WriteLine(car.Brand); // Car brand: Porsche
通过不使用,set;
我们可以防止它将来被意外修改。
学习使用 setter 和 getter
很多时候,我们没有设置 public、private 或 protected 方法。这使得我们无法更好地控制对象属性的修改。
不好的方法:
class BankAccount
{
public double Balance = 5000;
}
var bankAccount = new BankAccount();
// Buy a cappuccino ☕️ ...
bankAccount.Balance -= 15;
好方法:
class BankAccount
{
private double _balance = 0.0D;
pubic double Balance {
get {
return _balance;
}
}
public BankAccount(balance = 1000)
{
_balance = balance;
}
public void WithdrawBalance(int amount)
{
if (amount > _balance)
{
throw new Exception('Amount greater than available balance.');
}
_balance -= amount;
}
public void DepositBalance(int amount)
{
_balance += amount;
}
}
var bankAccount = new BankAccount();
// Buy a cappuccino ☕️ ...
bankAccount.WithdrawBalance(price: 15);
balance = bankAccount.Balance;
此外,继承该类时,默认情况下,可以覆盖该功能。这为您提供了多种可能性。
组合优于继承
虽然很多人不知道应该使用继承还是组合,但我告诉你,最好选择使用组合。
起初,许多程序员认为继承更好,但是,你总是要问自己组合是否能以某种方式更好地模拟问题。
不好的方法:
class Car
{
private string Model { get; set; }
private string Brand { get; set; }
public Car(string model, string brand)
{
Model = model;
Brand = brand;
}
// ...
}
// Bad because Car "have" engine data.
// CarEngineData is not a type of Car
class CarEngineData : Car
{
private string Model { get; set; }
private string Brand { get; set; }
public CarEngineData(string model, string brand, string displacement, string horses)
{
// ...
}
// ...
}
好方法:
class CarEngineData
{
public string Displacement { get; }
public string Horses { get; }
public CarEngineData(string displacement, string horses)
{
Displacement = displacement;
Horses = horses;
}
// ...
}
class Car
{
public string Model { get; }
public string Brand { get; }
public CarEngineData EngineData { get; }
public Car(string model, string brand)
{
Model = model;
Brand = brand;
}
public void SetEngine(string displacement, double horses)
{
EngineData = new CarEngineData(displacement, horses);
}
// ...
}
要知道何时最好使用哪一个,让我们看一个简单的例子:
- 关系“ is-a ”(人类与动物)关系“ has-a ”(用户与用户详情)
不要使用魔法链
对于不了解这一点的人来说,魔术字符串是必须在代码中指定的字符串值。它们总是会对代码产生影响。在大多数情况下,魔术字符串几乎总是会自我重复,而且由于它们无法自动更新,因此很容易成为错误的根源。
不好的方法:
if (userRole == "Admin")
{
// logic in here
}
好方法:
const string ADMIN_ROLE = "Admin"
if (userRole == ADMIN_ROLE)
{
// logic in here
}
这样,我们就可以防止这些字符串重复,并在对其中任何一个进行更改时导致错误。
这些示例是简化的,如果您想更深入地了解它们,我建议您转到C# 中的 Cleaner Code。
鏂囩珷鏉ユ簮锛�https://dev.to/bytehide/the-5-guidelines-to-write-cleaner-code-in-c-fid