iT邦幫忙

2021 iThome 鐵人賽

DAY 27
0
Software Development

單元測試從入門到進階之路 (以 C# NUnit 3 X NSubstitute 為例)系列 第 27

Day 27-Unit Test 應用於使用重構與測試手法優化 C# Code-1 (情境及應用-7)

  • 分享至 

  • xImage
  •  

Unit Test 應用於使用重構與測試手法優化 C# Code - 前言

今天的應用是參考於 Improving C# Code Using Refactoring and Unit Testing ,本文在探討的內容是如何把緊耦合的程式碼經過重構與測試的手法把商業邏輯拆解成物件導向式的寫法,符合 SOLID 原則。因此,作者在一開始提出了改善的流程圖,如下:

https://ithelp.ithome.com.tw/upload/images/20210927/20127378azLy1OZ49t.png


Unit Test 應用於使用重構與測試手法優化 C# Code - 商業邏輯

那首先我們要先了解這次的故事情境,這次的程式碼是在講述輸入學生的 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();
            }
        }
    }
}

跑出的結果:

https://ithelp.ithome.com.tw/upload/images/20210927/20127378EPTC8JCUJm.png

在參考文章中是採用 WinForm,為了方便讓沒接觸過 WinForm 的讀者可以觀閱文章,我們改採用 Console 的寫法,如此還可以練習檢測 Console 輸入的檢測,而明天會開始討論重構的內容。


上一篇
Day 26-Unit Test 應用於 Async Code-2 (情境及應用-6)
下一篇
Day 28-Unit Test 應用於使用重構與測試手法優化 C# Code-2 (情境及應用-8)
系列文
單元測試從入門到進階之路 (以 C# NUnit 3 X NSubstitute 為例)30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言