今天的應用是參考於 Improving C# Code Using Refactoring and Unit Testing ,本文在探討的內容是如何把緊耦合的程式碼經過重構與測試的手法把商業邏輯拆解成物件導向式的寫法,符合 SOLID 原則。因此,作者在一開始提出了改善的流程圖,如下:
那首先我們要先了解這次的故事情境,這次的程式碼是在講述輸入學生的 ID、名字、數學與文學標記後選擇 City 與 Country (兩種模式的公式附在下方)點擊計算後,則會去計算平均值。
Country:Average = (Math mark + Literal mark + 1) / 2
City:Average = (Math mark + Literal mark) / 2
因此,其撰寫的程式碼如下:
using System;
namespace HelloRefactor
{
class Program
{
static void Main(string[] args)
{
Console.WriteLine("請輸入學生ID:");
string inputTxtID = Console.ReadLine();
Console.WriteLine("請輸入學生名稱:");
string inputTxtName = Console.ReadLine();
Console.WriteLine("請輸入數學數值:");
string inputTxtMath = Console.ReadLine();
Console.WriteLine("請輸入文學數值:");
string inputLiteral = Console.ReadLine();
Console.WriteLine("Country 模式還是 City 模式 (Country 為 true/City 為 false):");
string inputIsCountry = Console.ReadLine();
//
DemoCalculate demoCal = new DemoCalculate(inputTxtID, inputTxtName, inputTxtMath, inputLiteral, inputIsCountry);
string demoResult = demoCal.Calculate();
Console.WriteLine("結果:" + demoResult);
}
}
public class DemoCalculate
{
private string txtID;
private string txtName;
private string txtMath;
private string txtLiteral;
private string isCountry;
double result;
public DemoCalculate(string inTxtID, string inTxtName, string inTxtMath, string inTxtLiteral, string inIsCountry)
{
txtID = inTxtID;
txtName = inTxtName;
txtMath = inTxtMath;
txtLiteral = inTxtLiteral;
isCountry = inIsCountry;
}
public string Calculate()
{
if (!double.TryParse(txtMath, out result))
{
return "發生錯誤!數學數值應該是個 numeric!";
}
if (((Convert.ToDouble(txtMath) > 10)) || (Convert.ToDouble(txtMath) < 0))
{
return "發生錯誤!數學數值應該介於 0 ~ 10 之間!";
}
if (!double.TryParse(txtLiteral, out result))
{
return "發生錯誤!文學數值應該是個 numeric!";
}
if (((Convert.ToDouble(txtLiteral) > 10)) || (Convert.ToDouble(txtLiteral) < 0))
{
return "發生錯誤!文學數值應該介於 0 ~ 10 之間!";
}
if (Convert.ToBoolean(isCountry))
{
return txtID + " " + txtName + " " + ((Convert.ToDouble(txtMath) + Convert.ToDouble(txtLiteral) + 1) / 2).ToString();
}
else
{
return txtID + " " + txtName + " " + ((Convert.ToDouble(txtMath) + Convert.ToDouble(txtLiteral)) / 2).ToString();
}
}
}
}
跑出的結果:
在參考文章中是採用 WinForm,為了方便讓沒接觸過 WinForm 的讀者可以觀閱文章,我們改採用 Console 的寫法,如此還可以練習檢測 Console 輸入的檢測,而明天會開始討論重構的內容。