相依注入DI(Dependency Injection)

為了降低代碼本身的耦合,也為了讓代碼更好測試,這裡我們需要引入DI(Dependency Injection,依賴注入)解耦合。

1.把想測試的方法弄成protocol,之後就可mock這個protocol進而測試該方法。

2.初始化init時注入

3.用Property時注入,ex lazy init

4.方法參數時注入

其他相依注入方法請看 https://www.objccn.io/issue-15-3/

對於以上幾種公開注入點的注入方式,比如說初始化注入,屬性注入,以及方法參數注入等都會讓人有一種破壞程序封裝性的感覺。我們總有一種想要掩蓋依賴注入銜接點的想法,這是可以理解的,因為我們知道這些銜接點是專門為單元測試準備的,它們並不屬於API 業務範疇。所以可以將它們聲明在category 中,並且放到一個單獨的頭文件裡。

 

是不是覺得為了達到測試目標不得已公開了許多不應公開的內部實現?首先,需要判斷一下基於你的代碼中現行所公開的API 是否能夠支撐完成測試代碼編寫(快速且確切)。如果不可以,並且你需要去操作那些本來是隱式的依賴對象,這說明很可能有其他的類也需要操作它。所以應該大膽將其抽象,把它當作依賴對象使用並進行單獨測試。

 

廣告

[Design pattern] MVVM

MVVM(Model,View,ViewModel)

MVC的mediator是controller.

MVVM的mediator是viewModel.

view:view/viewController >> own viewModel >> own model.

所以資料傳回來則為反方向model > viewModel > view 單一方向性。

Model不再與view耦合。(not like MVC, model coupling with view)

所以重點viewModel裡面到底放什麼?

1.放呈現view的邏輯跟狀態.

2.Raw data一開始都不太能用,所以也可放raw data轉成可用的資料邏輯。

Continue reading “[Design pattern] MVVM"

GCD & NSOperation

GCD:用來管理隊列,及創造隊列,執行隊列會在另外開一個單獨的線程中執行,而不是在原本創造隊列的線程(如主線程),依需求執行時可選擇Sync同步(會阻塞當下的線程),Async非同步(不會阻塞),另外系統裡面default時會有一個串行,四個並行的隊列可供使用,但注意這些也會被蘋果內部的API做使用,所以隊列中不僅僅只有你的任務而已,當然可以創建自己的隊列。

  • Dispatch 對列可分為兩種:

1.Serial (串行隊列):就是一個會等上一個結束,下一個才進去,有順序(FIFO)先進先出,但較慢,好處就是避免競速發生,也可用串行達到並行的效果,就是開好幾條串行下去跑。

2.Concurrency (並行隊列):就是一次好幾個同時進去,無順序,順序都是系統決定,較快

Continue reading “GCD & NSOperation"