【问题标题】:De-coupling Model and Separating Public/Private Methods in Objective-C (Protocols vs Public/Private Headers)Objective-C 中的解耦模型和分离公共/私有方法(协议与公共/私有标头)
【发布时间】:2013-10-23 03:43:50
【问题描述】:

我目前正在使用 Objective-C(iPhone 版)构建游戏。

为此,出于性能/复杂性的原因,我稍微打破了 MVC,并为视图(渲染器)提供了对模型的直接引用。这是因为它应该以 60fps 的速度运行,并且会根据模型的状态不断更新自身。

由于我的模型中的其他类需要访问和设置这些属性,我的模型的头文件中有可读写的属性。但他们应该作为我的观点只读。所以我有需要分离公共/私有方法的问题。

我认为一个典型的方法是有一个普通的“X.h”标题,视图将导入它和一个单独的“X_private.h”供其他模型类在内部使用。

我的一位 Java 开发人员朋友提出了一种使用协议的不同方法。

他建议创建像“IX.h”这样的 NSObject 协议,其中包含视图引用的公共方法。然后只需在其标头上使用私有(就整个模型而言)方法设置类(X.h/X.m),并让该类实现协议。

这看起来很酷,因为它增加了一个抽象层。现在,如果我决定更改底层模型类及其工作方式,只要它们仍然实现公共协议,我就可以这样做。视图甚至不知道模型在下面真正使用了哪些类。

我没有看到这种方法有任何明显的缺点,但这不是我以前在 Objective-C 中做过的事情。

这是一个好方法还是我错过了什么?

还有其他好的方法来解决这个问题吗?

【问题讨论】:

    标签: ios objective-c model-view-controller protocols


    【解决方案1】:

    你朋友的建议完全没问题。但是,您的模型的读写属性仍然可供访问,并且可能会被错误地使用。

    我能想到的更好的方法是使用类扩展/匿名类别。在这种方法中,模型类的默认接口将只包含读取访问器。

    型号

    @interface Model:NSObject
    
    -(NSNumber *)readProperty1;
    -(NSString *)readProperty2;
    
    @end  
    

    模型+ReadWrite.h

    @interface Model()
    
    @property(strong) NSString *property1;
    @property(strong) NSString *property2;
    
    @end
    

    通过在您的 Model.m 或您需要的其他模型中导入 Model+ReadWrite.h,您可以访问所有属性,而您的模型的通用接口仅公开只读方法。

    【讨论】:

    • 这似乎也是一个标准的想法,以及使用公共/私有标头。但是,这是否仍然意味着我必须直接导入 Model 类?然而,使用协议方法,我仍然可以更改底层类,因为它只是一个非类特定的方法列表。
    • 这或多或少的工作方式相同。由于您的默认接口仅提供访问器方法,您仍然可以继续并根据需要更改模型。这只是一个意见问题。我会更担心我的读写方法被滥用,而将它们放在单独的标题下会让其他人清楚我不希望人们乱用它。
    • 问题是它仍然意味着您正在专门引用模型类。与提供另一层抽象的协议不同。返回协议方法的底层机制甚至可以分为多个类。无需在模型外进行任何重构即可对此进行更改。
    猜你喜欢
    • 2011-06-19
    • 2013-10-06
    • 2011-01-17
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 1970-01-01
    • 2011-03-11
    • 2015-12-27
    相关资源
    最近更新 更多