iT邦幫忙

2018 iT 邦幫忙鐵人賽
DAY 12
0
自我挑戰組

TDD - 紅燈,綠燈,重構,30天 TDD之路有你有我系列 第 12

Day12. 霸一個我是說Not啦-Codewars_Ones Complement

  • 分享至 

  • xImage
  •  

今天的題目讓我回想起了高中時代,那個時候還在學數位邏輯呢XDD
看到這題就是簡單的反向他,也就是霸!!! 隨便啦 反正就是Not的概念
把2進制的1變成0,把0變成1的概念啦!

https://ithelp.ithome.com.tw/upload/images/20171229/201072095JK67Tjn27.png

現在就來拆一下題目吧。

  1. 把輸入的0變成1
  2. 把輸入的1變成0

首先來吧! Test Code!!!

[TestMethod]
public void Input_StringEmpty_Should_Be_StringEmpty()
{
   Assert.AreEqual(string.Empty,Kata.OnesComplement(string.Empty));
}

而Production Code 也就是老樣子會長成這個樣子

public static string OnesComplement(string empty)
{
    throw new NotImplementedException();
}

很正常的這一個會是紅燈! Commit!

https://ithelp.ithome.com.tw/upload/images/20171229/20107209VadZaKYC0s.png

接下來把Production Code改一下,用最簡單的方式解決他!

public static string OnesComplement(string empty)
 {
     return string.Empty;
 }

接下來跑個測試,PASS!

https://ithelp.ithome.com.tw/upload/images/20171229/20107209YNMzSwxEsS.png

接下來寫測試輸入1的狀況

[TestMethod]
public void Input_1_Should_Be_0()
{
    Assert.AreEqual(“0”,Kata.OnesComplement("1"));
}

接下來跑一下測試吧,紅燈! Commit!
這裡就可以看到剛才寫1個輸入時fail的畫面了。

https://ithelp.ithome.com.tw/upload/images/20171229/20107209JdVSHGk0vg.png

再來就來改一下production code唄

public static string OnesComplement(string n)
{
    if (string.IsNullOrEmpty(n))
        return string.Empty;
    return "0";
}

很輕鬆的 Pass,接下來在新增一個輸入2個1的test case吧!

[TestMethod]
public void Input_11_Should_Be_11()
{
    Assert.AreEqual("00", Kata.OnesComplement("11"));
}

接下來就要改一下Production Code了

public static string OnesComplement(string n)
{
    if (string.IsNullOrEmpty(n))
        return string.Empty;
    var nArray = n.ToCharArray();
    for (var i = 0; i < nArray.Length; i++)
    {
        nArray[i] = '0';
    }
    return new string(nArray);
}

跑個測試,Pass! Commit!

https://ithelp.ithome.com.tw/upload/images/20171229/20107209Cr9cNfZJhg.png

現在輸入1的需求大致上完成了,所以來寫個輸入0的測試吧!

[TestMethod]
public void Input_0_Should_Be_1()
{
    Assert.AreEqual("1", Kata.OnesComplement("0"));
}

很明顯的一定會紅燈,接下來就來改一下Production Code吧!
這時候只要加上判斷就可以完成了!

public static string OnesComplement(string n)
{
    if (string.IsNullOrEmpty(n))
        return string.Empty;
    var nArray = n.ToCharArray();
    for (var i = 0; i < nArray.Length; i++)
    {
        if (nArray[i].Equals('0'))
        {
            nArray[i] = '1';
            continue;
        }
        nArray[i] = '0';
    }
    return new string(nArray);
}

跑個測試,Pass! Commit!
再來就補一個輸入多個0的測試依然Pass,就再Commit一次吧!
基本上現在已經完成所有的需求了,現在就來Refactor!

很明顯的這一坨程式碼非常的……不是很好看,所以我們來把他抽出來吧!
所以就變成這個樣子!

public static string OnesComplement(string n)
{
    if (string.IsNullOrEmpty(n))
        return string.Empty;
    var nArray = n.ToCharArray();
    for (var i = 0; i < nArray.Length; i++)
    {
        nArray[i] = NotItNumber(nArray[i]);
    }
    return new string(nArray);
}

private static char NotItNumber(char nArray)
{
    if (nArray.Equals('0'))
    {
        return '1';
    }
    return '0';
}

現在我們完成他了,就來跑個測試,PASS,Commit一下唄!

https://ithelp.ithome.com.tw/upload/images/20171229/20107209uYME6gFyXK.png

然後再Codewars上提交! Pass!!

https://ithelp.ithome.com.tw/upload/images/20171229/20107209ys6JLxGQ3U.png

老樣子我最喜歡的部分就是去看看別人寫這題寫得怎麼樣XD

https://ithelp.ithome.com.tw/upload/images/20171229/20107209M8ZHsPCftI.png

原來還有這種寫法啊….
這個可能要研究一下了……..
看起來很厲害 哈哈哈哈哈

Git url:
https://github.com/SQZ777/Codewars_OnesComplement

下一題,明天見!


上一篇
Day11. 成功的相反不是失敗,那是什麼?今天來講一下寫部落格/文章這件事好了。
下一篇
Day13. 最無聊的Say掰掰-Codewars_Remove the minium
系列文
TDD - 紅燈,綠燈,重構,30天 TDD之路有你有我30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言