iT邦幫忙

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

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

Day13. 最無聊的Say掰掰-Codewars_Remove the minium

  • 分享至 

  • xImage
  •  

啊啊 快要跨年啦,各位不知道有甚麼計劃呢XDDD?
連假我一樣會努力地寫文章的,還蠻有可能一天多寫幾篇撐到跨年結束呢XDD
一起參加鐵人競賽的鐵人朋友們 一起加油啊!!!

這個題目敘述是有故事的XD
他說他覺得他們的博物館很無聊,所以決定移除一些展覽的物品,所以他決定幫他們做一些評分,最無聊的要移除。

https://ithelp.ithome.com.tw/upload/images/20171230/20107209Qlasxugne2.png

今天的題目還很貼心地告訴你,只要移除一個最無聊的就好,看測試資料應該是最左邊的那一個。

現在就來拆一下題目吧。

  1. 如果輸入空的陣列,救回他一個空的陣列
  2. 找到最小的數字
  3. 移除最小的數字且不影響原本的元素排序

首先來吧! Test Code!!!

很明顯的今天就會用到跟以往不同的Assert。
因為今天要做的事Collection的判斷,所以我們需要用Collection來驗證他,否則他都會給你紅燈喔!

[TestMethod]
public void Input_NothingArray_Should_Be_NothingArray()
{
    CollectionAssert.AreEqual(new List<int>(), Remover.RemoveSmallest(new List<int>()));
}

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

public static List<int> RemoveSmallest(List<int> numbers)
{
    throw new NotImplementedException();
}

老樣子,跑個測試,沒過很正常,commit一下

https://ithelp.ithome.com.tw/upload/images/20171230/20107209PUbAxZecgu.png

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

public static List<int> RemoveSmallest(List<int> numbers)
{
    return new List<int>();
}

接下來跑個測試,PASS!

https://ithelp.ithome.com.tw/upload/images/20171230/20107209cZCt5oWufJ.png

接下來寫個只輸入一個的測試吧,只輸入一個數值想當然的就……只會回傳空的,所以就輸入1來測試1個輸入的測是囉。

 [TestMethod]
public void Input_1_Should_Be_NothingArray()
{
    CollectionAssert.AreEqual(new List<int>(), Remover.RemoveSmallest(new List<int> { 1 }));
}

接下來寫輸入兩個的測試

 [TestMethod]
public void Input_1_Should_Be_NothingArray()
{
    CollectionAssert.AreEqual(new List<int>{2}, Remover.RemoveSmallest(new List<int> { 1, 2 }));
}

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

https://ithelp.ithome.com.tw/upload/images/20171230/20107209Io7NuUVjRO.png

接下來就要做第2、3個需求了,所以你要找到最小的數字是誰,然後找到他在哪裏,最後再移除他,就變這個樣子。

public static List<int> RemoveSmallest(List<int> numbers)
{
    if (numbers.Count == 0)
    {
        return new List<int>();
    }
    var findMin = numbers.Min();
    var minIndex = numbers.FindIndex(x => x == findMin);
    numbers.RemoveAt(minIndex);
    return numbers;
}

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

接下來照著補上測試案例,然後Production Code也跟著補上。

https://ithelp.ithome.com.tw/upload/images/20171230/20107209KMjqKBSBK2.png

接下來因為Code有點長,所以我們來Refactor他吧!

public static List<int> RemoveSmallest(List<int> numbers)
 {
     if (numbers.Count == 0)
         return new List<int>();
     numbers.RemoveAt(numbers.FindIndex(x => x == numbers.Min()));
     return numbers;
 }

接下來補上一個test case 這一支會改變我們的人生(X

[TestMethod]
public void Input_22121_Should_Be_2221()
{
    CollectionAssert.AreEqual(new List<int> { 2, 2, 1, 2, 1 }, Remover.RemoveSmallest(new List<int> { 2, 2, 2, 1 }));
}

接下來跑測試果真是Fail了,然後這裡我卡了很久,原來!!!!!!!
是我的測試寫錯了,寫反了!!!!!!!! (詳情請看上面ˊ_>ˋ
哇哩勒

然後把它改回來

就過了!!!

https://ithelp.ithome.com.tw/upload/images/20171230/20107209yAn63yfe9G.png

然後再Codewars上提交! Pass!!

https://ithelp.ithome.com.tw/upload/images/20171230/20107209XgN9G7Dd9p.png

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

https://ithelp.ithome.com.tw/upload/images/20171230/20107209R7DIVFvJdu.png

大致上跟我寫得差不多,然後DefaultIfEmpty這個方法我倒是第一次看到呢!!!
原來這個方法就是如果他是空的,他就會回傳預設值。
長知識長知識!

https://github.com/SQZ777/Codewars_RemoveTheMinium

下一題,明天見!


上一篇
Day12. 霸一個我是說Not啦-Codewars_Ones Complement
下一篇
Day14. 嘗試切他中路!-Codewars_GetThe Middle Character
系列文
TDD - 紅燈,綠燈,重構,30天 TDD之路有你有我30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言