2013-01-14 114 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。简单的方法来注入一些嘲笑!