gpt4 book ai didi

objective-c - 网络存储设计模式

转载 作者:搜寻专家 更新时间:2023-10-30 20:25:33 24 4
gpt4 key购买 nike

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

设计类以尽量减少复杂性和耦合性同时保持代码尽可能简洁和可读的最佳方法是什么?

单例

通常我会创建一个单例 NetworkAdapter,每个 Controller 都可以直接访问它以保存对象。

例子:

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

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

直接引用

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

例如:

[self.networkAdapter saveObject:myRecipe];

委派

想到的另一种方法是委派。 NetworkAdapter 可以实现“RemoteStorageDelegate”协议(protocol),每个 Controller 都可以有一个 remoteStorageDelegate,它可以调用 saveObject:on 等方法。优点是 Controller 不知道 NetworkAdapter 的细节,只有实现协议(protocol)的对象知道如何保存对象。

例如:

[self.remoteStorageDelegate saveObject:myRecipe];

直接在模型中

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

例如:

[myRecipe save];

你怎么看这些?有没有其他模式对此更有意义?

最佳答案

在你的情况下,我也会坚持使用依赖注入(inject)。如果您想阅读相关内容,您可以轻松地在网络上找到好的文章,例如在 Wikipedia .在 Objective C 中也有指向 DI 框架的链接。

基本上,如果您有两个或更多组件,您可以使用 DI,这些组件必须交互但不应在代码中直接相互了解。我将详细说明您的示例,但采用 C#/Java 风格,因为我不知道 Objective C 语法。假设你有

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

界面

interface NetworkAdapterInterface {
void save(object o);
}

现在您想在 Controller 中调用该适配器,例如

class Controller {
NetworkAdapterInterface networkAdapter;

Controller() {
}

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

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

调用 Setter 是现在 DI 的魔力可以发生的地方(称为 Setter 注入(inject);还有例如 构造函数注入(inject))。这意味着您没有一个代码行可以自己调用 Setter,而是让它执行 DI 框架。非常松耦合!

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

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

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

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

关于objective-c - 网络存储设计模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14310511/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com