2013-01-14 77 views
3

假設我有幾個控制器。每個控制器都可以在某個時候創建​​需要存儲在服務器上的新對象。例如,我可以有一個管理表單的RecipeCreationViewController。提交此表單時,會創建一個新的Recipe對象,並需要將其保存在服務器上。網絡存儲設計模式

什麼是最好的設計類的方法,以儘量減少複雜性和耦合,同時保持代碼儘可能乾淨和可讀?

辛格爾頓

通常我會創建一個單NetworkAdapter每個控制器可爲了節省對象的直接訪問。

例子:

[[[NetworkAdapter] sharedAdapter] saveObject:myRecipe]; 

但是我已經意識到有類調用自己的品牌耦合代碼單身,這是很難調試,因爲在單訪問隱藏在執行和不明顯界面。

直接引用

另一種方法是讓每個控制器保持到NetworkAdapter的引用,並有這由創建該控制器的類被傳遞英寸

例如:

[self.networkAdapter saveObject:myRecipe]; 

代表團

來考慮另一種方法是代表團。 NetworkAdapter可以實現一個「RemoteStorageDelegate」協議,每個控制器可以有一個remoteStorageDelegate,它可以調用像saveObject:on這樣的方法。優點是控制器不知道NetworkAdapter的細節,只是實現該協議的對象知道如何保存對象。

例如:

[self.remoteStorageDelegate saveObject:myRecipe]; 

直接在模型

另一種方法是有處理模型直接保存到網絡上。但我不確定這是否是一個好主意。

例如:

[myRecipe save]; 

你覺得這些是什麼?還有其他模式對此更有意義嗎?

+0

依賴注入怎麼辦? –

+0

@PeterWooster謝謝,我會對此進行更多的瞭解,我還沒有完全清楚它到底是什麼。如果你能提供一個概述你如何以及爲什麼要在這個特定情況下應用它,我將不勝感激。 – nebs

+0

這是一個很好的問題。在你對單身人士的討論中,你的意思是「因爲對單身人士的訪問隱藏在實施中,而不是從界面中顯而易見」?當然它是隱藏的,因爲保存一個對象是一個實現細節,不需要通過界面來暴露。我認爲單身是一條路要走,我已經看到它成功地用於項目,包括核心數據和網絡訪問。 – Macondo2Seattle

回答

1

我也會堅持你的情況下依賴注入。如果您想了解相關信息,您可以在網上輕鬆找到優秀的文章,例如在Wikipedia。還有目標C中DI框架的鏈接。

基本上,如果您有兩個或多個組件,它們必須進行交互但不應直接在代碼中直接相互瞭解,則可以使用DI。我將詳細闡述你的例子,但是以C#/ Java風格,因爲我不知道Objective C語法。比方說,你有

class NetworkAdapter implements NetworkAdapterInterface { 
    void save(object o) { ... } 
} 

與接口

interface NetworkAdapterInterface { 
    void save(object o); 
} 

現在要調用一個控制器,適配器像

class Controller { 
    NetworkAdapterInterface networkAdapter; 

    Controller() { 
    } 

    void setAdapter(NetworkAdapterInterface adapter) { 
    this.networkAdapter = adapter; 
    } 

    void work() { 
    this.networkAdapter.save(new object()); 
    } 
} 

調用二傳手就是現在DI的魔法可以(稱爲Setter Injection;也有例如構造注射劑)。這意味着您沒有一個代碼行,您可以自己調用Setter,但讓它執行DI框架。非常鬆散耦合!

現在它是如何工作的?通常使用通用的DI框架,您可以在中心代碼位置或XML文件中定義組件之間的實際映射。圖片你有

<DI> 
    <component="NetworkAdapterInterface" class="NetworkAdapter" lifecycle="singleton" /> 
</DI> 

這可以告訴DI框架在每一個二傳手自動注入NetworkAdapterNetworkAdapterInterface發現在你的代碼。爲了做到這一點,它會首先爲你創建適當的對象。如果它爲每次注射建立一個新物體,或者爲所有注射建立一個物體(Singleton),或者例如一個對象每工作單位(如果您使用這種模式),可以爲每種類型配置。

作爲一個旁註:如果你是單元測試你的代碼,你也可以使用DI框架來完全定義其他綁定,適合你的測試szenario。簡單的方法來注入一些嘲笑!