歡迎來到真實世界 - 也是需要來測一下傳說中的MVVM阿

在上一篇文章中,我們介紹了一個新的架構:Model-View-ViewModel(MVVM)。透過MVVM pattern,我們把business logic跟presentational logic從ViewController裡面抽出來,變成一個單純好測試的物件。但是對於如何做測試,卻是支字不提,不要懷疑,這就是拖稿(?)。在這篇文章裡,我們就要來看看,怎樣針對我們的ViewModel來寫Unit Test。 最近APP架構又成為大家熱門的話題,有很多有趣的文章都在針對這種百家爭鳴的iOS app架構現象提出檢討。其中Much ado about iOS app architecture這篇還不錯,大家可以看看。雖然像是MVVM、VIPER、Clean這些架構的目地都是要解決app架構上權責不分、不易測試等等問題,但是很容易被當成Silver Bullet,以為只要套用了這樣的全新架構,code從此就變得閃亮亮,bug也都自然消失了。另一方面,也有很多人因為這些架構的某些挶限,而完全否認這些架構所帶來的好處(簡單、易上手等等)。 在軟體的世界,真的沒有所謂的好壞,只有適不適合。對IQ不高的小蛇我來說,在沒有人手把手地教你的情況,跟本很難在短時間達到這些人說的MVC好棒棒的境界,有太多Pattern、太多的法則要去熟練,…

歡迎來到真實世界 - Unit Test for Core Data

IntroductionOnce an idea has taken hold of the brain it's almost impossible to eradicate. - Cobb 一旦某個想法掌握了你的腦袋,它將會變得難被鏟除。-CobbInception(全面啟動)一直都是個人最愛的電影之一,劇情燒腦、世界觀完整、畫面夢幻,而且又是這種穿越虛實的題材,幾乎所有元素都深得我心。 進入夢境就電影來說不算太新的梗,Inception跟其它夢境電影不一樣的是,進入夢境有個更複雜的原因:要徹底改變某個人的想法。老梗電影如果進入某人的夢境,很有可能就只是要引出一些秘密,像是金庫密碼之類的(腦海中馬上浮現:左三、右二、左一),但是在Inception裡,進入別人的夢境是為了要改變某人的想法,讓他乖乖地聽話做一些很蠢的事。這點其實非常的有趣,在生活中,的確有些想法根植在腦海中,久久揮之不去,就像被誰植入了思想一樣,比方說戈巴契夫頭髮最多、海珊最不愛打仗,到長大後我還是一直深信不移。 所以這跟我們今天的主題有甚麼關係呢?非常有關係!…

歡迎來到真實世界 - 原來是那個傳說中的 MVVM 阿

好不容易來到了續作的第三集,就這樣以近乎休刊般的速度,也寫了三篇長篇了。雖然對很多高手前輩來說,這些都是非常基礎的東西,但小蛇在跌跌撞撞了許久(還在跌)後,覺得有些東西還是自己寫下來,可以再次釐清自己的觀念,也偷偷希望能夠獲得高手指點或是加入討論,這就是邊緣人參與社會的方式阿(跟本就只是偷懶吧)。 話不多說(已經說很多了,想看電影心得可以直接跳到最後),就讓我們進入今天的主題。 這篇我們要來談談開發上更貼近實務的部份:如何設計一個好的軟體架構,以及如何測試它。在iOS開發過程中,如果是比較大型的app,通常複雜度都非常高,而且手機開發所需要架構的東西,必須要融合前後端的知識,從跟使用者第一線接觸的UI,到手機底層的資料庫,都必須透過你的code來連接跟協調。這個架構好不好讀、好不好維護、好不好測試,就會是整個開發的重點了,如果這個架構不是很好,接手的人或合作的人無法快速理解,就連你自己有時候都看不太懂,那未來某一天你一定掉進你自己挖出來的大坑裡(對,小蛇我還在我挖的坑裡)。 講架構或許有點抽象,要把既有的架構法則套到自己的程式中也不是一天兩天的事情,但有個好方法或許可以試一下,從現在開始,你可以試著培養自己的測試腦。甚麼是測試腦?就是接下來我所要做的事情,我所要做的改變,都是 為了要讓測試更容易。 你很難想像怎樣的程式是乾淨的程式,畢竟軟體開發的法則很多,…

歡迎來到真實世界 - Unit Test for Networking

在上班通勤的時候,最常做的事情就是打電動了。實在有點難在公車上面看書或做認真的事,請問除了高中生之外誰會在公車上認真做事的?那個奈米短的專注時間要思考任何事情都有困難。但是打Clash Royal就不一樣了,那是一款會讓你在毫秒之內進入精神時光屋的遊戲,只要開戰之後你就會到瞬間另外一個世界,直到戰鬥結束前你都不會回到現實,就算坐過站也是一樣。雖然一場只有兩分鐘,但對你來說每一場都像列寧格勒圍城戰一樣,都是漫長的持久戰,也像台灣的政治一樣,都是平行的時空。 如果想了完整的平行時空,就不能不提駭客任務(the Matrix),這部電影一直都是心目中最經典的電影之一,除了子彈時間這個讓人萬分驚豔的嘗試之外,許許多多的哲學問題在這部電影裡面都有簡單的著墨,是一部既大眾化又有點燒腦的好電影,下一部能夠相題並論的Cyberpunk商業電影,大概就只剩Inception了。 所以,對,在重要但無用的前情提要之後,就來進入到我們今天的主題了:歡迎來到真實世界!這將會是一連串的分享文,想要分享的是一個很多人(包括小弟我)都不願意提到的”那個議題”:Unit Test in iOS。嗯,很輕易就講出來了。 Welcome to the real world一般來說,在iOS開發上,寫測試這件事不算是非常的普遍,所以相關的資源可能不像其它語言這麼多,…

Sequence in Swift - A 🍻 Story

Generator跟Sequence是在許多語言之中常見的design pattern,有了這兩種patterns,你可以很清楚地把按需求取資料跟操作有順序的資料這兩件事情透過程式寫出來。 Swift在2.0時就已經提供了generatorType跟sequenceType兩種protocol來讓你實作,但在3.0之後,統一都改成了IteratorProtocol跟Sequence,所有跟generator有關的命名也都改成了Iterator。這讓這兩者的關係更為明確,而不再是長得像的兩個協定。 下面將從Iterator開始,利用範例來實做一個Swift的Sequence。 背景現在要實做一台智慧型啤酒販賣機,販賣機依序裝著一罐一罐的啤酒。我們希望販賣機的UI能夠: 按照容量列出機器裡的啤酒只列出大於400ml的啤酒整台機器的總藏酒毫升數基本類別是當然是Beer 🍻。 struct Beer { var brandName: String //品牌 var volume: Int //容量 } 接下來我們要一步一步透過Sequence完成這台販賣機的開發。首先,我們需要一個核心結構BeerContainer來裝所有的啤酒: struct BeerContainer { let elements: [Beer] var i = 0 init(elements: [Beer]) { self.elements = elements } } 變數elements是一個Array,放著我們的🍻。我們希望這個container不只能存東西,還能在我們需要的時候,一筆一筆地把啤酒列出來。…