- 程式的功能與編寫動機
- 各檔案的功用
- 使用到的技術與用意
程式功能 - 主要是點咖啡功能,首頁呈現已點咖啡的頁面,點咖啡頁面則是可以選擇咖啡容量、咖啡種類、可輸入姓名與信箱, 比較簡易的功能,重點想先擺在建構MVVM的練習上。
練習的動機 - 主要是因為面試時有看到目前業界會要求MVVM架構,因此有線上學習了如何用Swift建構出MVVM, 而Objective-C想說是不是也能用此架構,就想嘗試看看,不過似乎語言特性的不同,不像Swift比較直覺的勾畫出架構。 至於Objective-C的ViewModel、Service與Models間如何去溝通,稍後會介紹。
作品圖
檔案數量之差異
- Service - 主要是用來呼叫RESTFUL,而其中Order相關的json解析與存取也分類在這。
- Models - 定義一份餐點時所需內容的架構與咖啡模型,在Swift中的struct,Objective-C特性的不同,我選擇用NSObject做取代。
- ViewModels - Controller可直接呼叫相關Function呈現資料至View上。 Swift中的extension struct的一些屬性,我拆分出來寫成OrderDisplay的物件作替代,對於我自己比較好理解。
- Controllers - 使用ViewModels呈現資料或者從View取資料傳至ViewModels。
- Views - 單純建構視覺圖。
Swift在學習過程中發現語言特性的強大,傳值似乎較為容易一些,許多事情語言本身會幫你處理掉,不過每一行的使用就也變得要更為清楚及小心,以及意義是什麼,架構才會漂亮。 而在Objective-C中此練習我用Block與Protocol去綁定讓程式的呼叫及傳值達到目的。
在Objective-C沒有 Result<Success, Failure>
因此也是需要用到Block去替代。
- (void)getURL:(NSURL *)url JsonData:(NSData *)data HttpMethod:(NSString *)httpMethod
WithSuccess:(void (^)(NSData *))successCompletion
Error:(void (^)(NSError *))errorCompletion;
當中沒有用很複雜的技術,純粹是把程式架構拆分成適當的大小,當作練習建構MVVM的過程,看是否能把職責拆分開來比較好維護與新增功能。 除了使用較多的Block與Protocol也有用typedef enum去定義Webservice是要執行哪個RESTFUL API,OrderFetcher初始化時得給予enum定義的值, 還有prepareForSegue去設置Delegate的簡單應用。
耦合性不低,例如想新增吃的餐點或者其他不相關功能得新增的檔案有Fetcher、相關Model、相關Parser與ViewModel,而ViewModel本來就要建置。因為使用Protocol達到傳值Order物件的目的,因此Order檔案間是相關連的,不過每個檔案的任務至少都是獨立作業的,除錯維護會較容易,至於要寫成不同的模組物件都可傳遞,應該是要朝多型模組撰寫,WebService API模組化,可另開side project執行。