假设我有一些控制器。每个控制器都可以在某个时刻创建需要存储在服务器上的新对象。例如,我可以有一个管理表单的RecipeCreationViewController。提交此表单时,会创建一个新的Recipe对象,需要将其保存在服务器上。
设计类以最大限度地减少复杂性和耦合同时保持代码尽可能干净和可读的最佳方法是什么?
的Singleton
通常我会创建一个单独的NetworkAdapter,每个控制器都可以直接访问以保存对象。
示例:
[[[NetworkAdapter] sharedAdapter] saveObject:myRecipe];
但是我已经意识到让类单独调用单例会产生耦合代码,这很难调试,因为对单例的访问隐藏在实现中,而且界面并不明显。
直接参考
另一种方法是让每个控制器都拥有对NetworkAdapter的引用,并让它由创建控制器的类传入。
例如:
[self.networkAdapter saveObject:myRecipe];
团
想到的另一种方法是授权。 NetworkAdapter可以实现“RemoteStorageDelegate”协议,每个控制器都可以有一个remoteStorageDelegate,它可以调用saveObject:on等方法。优点是控制器不知道NetworkAdapter的细节,只知道实现协议的对象知道如何保存对象。
例如:
[self.remoteStorageDelegate saveObject:myRecipe];
直接在模特
另一种方法是让模型处理直接保存到网络。我不确定这是不是一个好主意。
例如:
[myRecipe save];
你怎么看待这些?还有其他模式对此更有意义吗?
答案 0 :(得分: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());
}
}
调用Setter现在可以发生DI的魔力(称为 Setter Injection ;还有例如构造函数注入)。这意味着您没有自己调用Setter的单个代码行,而是让它执行DI框架。非常松散耦合!
现在它是如何运作的?通常使用通用DI框架,您可以在中央代码位置或XML文件中定义组件之间的实际映射。你有的图像
<DI>
<component="NetworkAdapterInterface" class="NetworkAdapter" lifecycle="singleton" />
</DI>
这可以告诉DI框架在代码中找到NetworkAdapter
的每个Setter中自动注入NetworkAdapterInterface
。为此,它将首先为您创建适当的对象。如果它为每次进样构建一个新对象,或者只为所有进样( Singleton )构建一个对象,或者例如每个工作单元一个对象(如果使用这种模式),可以为每种类型配置。
作为旁注:如果您是单元测试代码,您还可以使用DI框架完全定义其他绑定,适合您的测试szenario。注入一些嘲笑的简单方法!