C#代碼重構(gòu):提升代碼質(zhì)量的五個(gè)技巧
代碼重構(gòu)是每個(gè)開(kāi)發(fā)者都應(yīng)該掌握的重要技能。通過(guò)重構(gòu),我們可以在不改變代碼外部行為的前提下,優(yōu)化代碼結(jié)構(gòu),提高可讀性和可維護(hù)性。本文將介紹5個(gè)強(qiáng)大的C#重構(gòu)技巧,幫助您將代碼提升到一個(gè)新的水平。
1. 提取驗(yàn)證邏輯
將分散的驗(yàn)證邏輯提取到單獨(dú)的方法中,可以顯著提高代碼的可讀性和可維護(hù)性。
重構(gòu)前:
public void AddCustomer(string firstName, string lastName, string email, DateTime dateOfBirth)
{
if (string.IsNullOrEmpty(firstName) || string.IsNullOrEmpty(lastName))
{
throw new ArgumentException("First name and last name are required.");
}
if (!email.Contains('@') && !email.Contains('.'))
{
throw new ArgumentException("Invalid email format.");
}
if (CalculateAge(dateOfBirth, DateTime.Now) < 21)
{
throw new ArgumentException("Customer must be at least 21 years old.");
}
// 添加客戶的其他邏輯
}
重構(gòu)后:
public void AddCustomer(string firstName, string lastName, string email, DateTime dateOfBirth)
{
if (!IsValid(firstName, lastName, email, dateOfBirth))
{
throw new ArgumentException("Invalid customer data.");
}
// 添加客戶的其他邏輯
}
private bool IsValid(string firstName, string lastName, string email, DateTime dateOfBirth)
{
const int minimumAge = 21;
return !string.IsNullOrEmpty(firstName) &&
!string.IsNullOrEmpty(lastName) &&
(email.Contains('@') || email.Contains('.')) &&
CalculateAge(dateOfBirth, DateTime.Now) >= minimumAge;
}
2. 引入依賴注入
依賴注入(DI)是一種強(qiáng)大的設(shè)計(jì)模式,可以提高代碼的模塊化、可測(cè)試性和可擴(kuò)展性。
重構(gòu)前:
public class CustomerService
{
private CompanyRepository _companyRepository = new CompanyRepository();
private CustomerRepository _customerRepository = new CustomerRepository();
private CreditLimitCalculator _creditLimitCalculator = new CreditLimitCalculator();
// 其他方法
}
重構(gòu)后:
public class CustomerService
{
private readonly CompanyRepository _companyRepository;
private readonly CustomerRepository _customerRepository;
private readonly CreditLimitCalculator _creditLimitCalculator;
public CustomerService(CompanyRepository companyRepository,
CustomerRepository customerRepository,
CreditLimitCalculator creditLimitCalculator)
{
_companyRepository = companyRepository;
_customerRepository = customerRepository;
_creditLimitCalculator = creditLimitCalculator;
}
// 其他方法
}
3. 使用switch表達(dá)式簡(jiǎn)化復(fù)雜業(yè)務(wù)規(guī)則
對(duì)于復(fù)雜的業(yè)務(wù)規(guī)則,使用switch表達(dá)式可以使代碼更加簡(jiǎn)潔和易讀。
重構(gòu)前:
public (bool HasCreditLimit, decimal? CreditLimit) CalculateCreditLimit(Customer customer, Company company)
{
if (company.Type == CompanyType.VeryImportantClient)
{
return (false, null);
}
else if (company.Type == CompanyType.ImportantClient)
{
return (true, GetCreditLimit(customer) * 2);
}
else
{
return (true, GetCreditLimit(customer));
}
}
重構(gòu)后:
public enum CompanyType
{
VeryImportantClient,
ImportantClient,
RegularClient
}
public class Customer
{
public string Name { get; set; }
public int Age { get; set; }
// Other properties
}
public class Company
{
public string Name { get; set; }
public CompanyType Type { get; set; }
// Other properties
}
public class CreditLimitCalculator
{
public (bool HasCreditLimit, decimal? CreditLimit) CalculateCreditLimit(Customer customer, Company company)
{
return company.Type switch
{
CompanyType.VeryImportantClient => (false, null),
CompanyType.ImportantClient => (true, GetCreditLimit(customer) * 2),
_ => (true, GetCreditLimit(customer))
};
}
private decimal GetCreditLimit(Customer customer)
{
return 1000m;
}
}
static void Main(string[] args)
{
var customer = new Customer { Name = "John Doe", Age = 30 };
var company1 = new Company { Name = "Acme Corp", Type = CompanyType.RegularClient };
var company2 = new Company { Name = "Important Inc", Type = CompanyType.ImportantClient };
var company3 = new Company { Name = "VIP Ltd", Type = CompanyType.VeryImportantClient };
var calculator = new CreditLimitCalculator();
var result1 = calculator.CalculateCreditLimit(customer, company1);
Console.WriteLine($"Company: {company1.Name}, HasCreditLimit: {result1.HasCreditLimit}, CreditLimit: {result1.CreditLimit}");
var result2 = calculator.CalculateCreditLimit(customer, company2);
Console.WriteLine($"Company: {company2.Name}, HasCreditLimit: {result2.HasCreditLimit}, CreditLimit: {result2.CreditLimit}");
var result3 = calculator.CalculateCreditLimit(customer, company3);
Console.WriteLine($"Company: {company3.Name}, HasCreditLimit: {result3.HasCreditLimit}, CreditLimit: {result3.CreditLimit}");
}
圖片
4. 將邏輯下推到領(lǐng)域模型
通過(guò)將邏輯下推到領(lǐng)域模型,我們可以提高代碼的內(nèi)聚性和封裝性。
重構(gòu)前:
public class CustomerService
{
public Customer CreateCustomer(Company company, string firstName, string lastName, string email, DateTime dateOfBirth)
{
// 創(chuàng)建客戶的邏輯
}
public bool IsCustomerUnderCreditLimit(Customer customer)
{
return customer.HasCreditLimit && customer.CreditLimit < 500;
}
}
重構(gòu)后:
public class Customer
{
public static Customer Create(Company company, string firstName, string lastName, string email, DateTime dateOfBirth, CreditLimitCalculator creditLimitCalculator)
{
// 工廠方法實(shí)現(xiàn)
}
public bool IsUnderCreditLimit()
{
return HasCreditLimit && CreditLimit < 500;
}
}
5. 使用表達(dá)式體成員簡(jiǎn)化簡(jiǎn)單方法
對(duì)于簡(jiǎn)單的方法,使用表達(dá)式體成員可以使代碼更加簡(jiǎn)潔。
重構(gòu)前:
public class Customer
{
public string FullName
{
get
{
return $"{FirstName} {LastName}";
}
}
public bool IsAdult()
{
return Age >= 18;
}
}
重構(gòu)后:
public class Customer
{
public string FullName => $"{FirstName} {LastName}";
public bool IsAdult() => Age >= 18;
}
通過(guò)應(yīng)用這些重構(gòu)技巧,您可以顯著提高C#代碼的質(zhì)量、可讀性和可維護(hù)性。記住,重構(gòu)是一個(gè)持續(xù)的過(guò)程,隨著您的技能不斷提升,您的代碼質(zhì)量也會(huì)不斷提高。祝您編碼愉快!