3

假设我有几个控制器。每个控制器都可以在某些时候创建需要存储在服务器上的新对象。例如,我可以有一个管理表单的 RecipeCreationViewController。提交此表单时,会创建一个新的 Recipe 对象,并需要将其保存在服务器上。

设计类以最小化复杂性和耦合同时保持代码尽可能干净和可读的最佳方法是什么?

辛格尔顿

通常我会创建一个单例网络适配器,每个控制器都可以直接访问它以保存对象。

例子:

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

但是我已经意识到,让类自己调用单例会导致难以调试的耦合代码,因为对单例的访问隐藏在实现中,并且从接口中并不明显。

直接参考

另一种方法是让每个控制器都持有对 NetworkAdapter 的引用,并由创建控制器的类传入。

例如:

[self.networkAdapter saveObject:myRecipe];

代表团

想到的另一种方法是委托。NetworkAdapter 可以实现“RemoteStorageDelegate”协议,并且每个控制器都可以有一个 remoteStorageDelegate,它可以调用诸如 saveObject: on 之类的方法。优点是控制器不知道 NetworkAdapter 的细节,只有实现协议的对象知道如何保存对象。

例如:

[self.remoteStorageDelegate saveObject:myRecipe];

直接在模型中

另一种方法是让模型直接处理保存到网络。我不确定这是否是个好主意。

例如:

[myRecipe save];

你怎么看这些?还有其他更有意义的模式吗?

4

1 回答 1

1

在您的情况下,我也会坚持使用依赖注入。如果您想阅读有关内容,您会很容易在网络上找到好文章,例如在Wikipedia上。在 Objective 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());
  }
}

调用 Setter 是现在 DI 的神奇之处(称为Setter Injection;还有例如Constructor Injection)。这意味着您没有一个代码行可以自己调用 Setter,而是让它执行 DI 框架。非常松耦合!

现在它是如何工作的?通常使用通用 DI 框架,您可以在中央代码位置或 XML 文件中定义组件之间的实际映射。你有的图片

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

这可以告诉 DI 框架为它在代码中找到的NetworkAdapter每个 Setter自动注入一个。NetworkAdapterInterface为此,它将首先为您创建正确的对象。如果它为每次注入构建一个新对象,或者为所有注入只构建一个对象(Singleton),或者例如每个工作单元一个对象(如果您使用这种模式),则可以为每种类型配置。

作为旁注:如果您正在对代码进行单元测试,您还可以使用 DI 框架来定义完全适合您的测试场景的其他绑定。注入一些模拟的简单方法!

于 2013-01-18T20:41:22.040 回答