我有一個計算薪水的函式,如下所示。未顯示CalculateHRA 和CalculaAllowance 函式定義。CalculateSalary 有很多 if-else 條件,如果添加了任何條件,這個函式會不斷增長。除了 if-else 之外,有沒有更好的方法來處理這個問題?
public class SalaryDTO{
public int Salary{get;set;}
public int Bonus {get;set;}
public int HRA {get;set;}
public int Allowance {get;set;}
public string Output{get;set;}
}
public void CalculateSalary(List<SalaryDTO> salaryDTO)
{
foreach(var a in salaryDTO)
{
if(a.Salary > 0 && a.Bonus >0)
{
a.HRA = CalculateHRA(a.Salary,a.Bonus);
a.Allowance = CalculateAllowance(a.Salary,a.Bonus);
a.Output = "Profit";
}
if(a.Salary < 0 && a.Bonus < 0)
{
a.HRA = CalculateHRA(a.Salary,a.Bonus);
a.Allowance = CalculateAllowance(a.Salary,a.Bonus);
a.Output = "Loss";
}
if(a.Salary > 0 && a.Bonus == 0)
{
a.HRA = CalculateHRA(a.Salary,a.Bonus);
a.Allowance = 10;
a.Output = "Profit";
}
if(a.Salary == 0 && a.Bonus < 0)
{
a.HRA = 20;
a.Allowance = CalculateAllowance(a.Salary,a.Bonus);
a.Output = "Profit";
}
if(a.Salary <0 && a.Bonus >0)
{
//Somecode and conditions similar to above
}
}
}
uj5u.com熱心網友回復:
也許首先要考慮的是誰負責知道如何計算工資。也許您需要一個Salary類,其唯一職責是為您的業務中的“薪水”概念建模。該類可能包含一些對資料進行操作的方法。
public class Salary
{
public Salary(int salaryValue, int bonus)
{
SalaryValue = salaryValue;
Bonus = bonus;
HRA = CalculateHRA();
Allowance = CalculateAllowance();
}
public int SalaryValue { get; private set; }
public int Bonus { get; private set; }
public int HRA { get; private set; }
public int Allowance { get; private set; }
public string Output => SalaryValue < 0 ? "Loss" : "Profit";
private static int CalculateHRA()
{
// ...
}
private static int CalculateAllowance()
{
// ...
}
}
這與 DTO 不同。DTO 包含資料但沒有行為。
要計算 HRA 和津貼,您可能需要檢查條件,但僅需要檢查適用于此任務的條件。同樣值得考慮的是,“Salary班級是否應該負責計算 HRA?” 也許,也許不是。在第二輪重構中,您可以嘗試一下,看看專門的HRA課程是否能提高閱讀和理解能力。津貼也是一樣。
使用Salary負責實施細節的模型,您可以從 DTO 串列中獲取完全計算的工資串列,如下所示:
public IEnumerable<Salary> CalculateSalary(List<SalaryDTO> salaryDTOs) =>
salaryDTOs.Select(dto => new Salary(dto.Salary, dto.Bonus));
這當然不是唯一的方法。將良好的自動化單元測驗作為安全網以確保行為正確非常重要。在以下簡單原則的指導下做出決定:
- 將資料和相關方法封裝在一起,
- 每個類或方法應該只負責一件事。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/360978.html
