【问题标题】:One large class compared to several small classes for a Cocoa Mac application一个大类与 Cocoa Mac 应用程序的几个小类的比较
【发布时间】:2012-05-06 11:54:37
【问题描述】:

我创建了一个使用 ARC 的应用程序,它解析来自在线 XML 文件的数据。我能够使用一个类和一个 API 调用来获得我需要的一切。 API 提供 XML 数据。由于 xml 文件很大,我有很多变量、IBOutlets 和 IBActions 与这个类相关联。

但是有两种方法:

1) 创建一个类来解析 XML 数据并为您的应用程序实现该数据 ,即创建一个可以做所有事情的类(就像我已经做过的那样)

2) 创建一个解析 XML 数据的类并创建其他类来处理从 XML 解析器类获得的数据,即一个类进行解析,另一个类实现该数据

请注意,某些提供 XML 数据的 API 会跟踪其服务的调用次数/分钟或调用次数/天。因此,您不希望多个类调用 API,最好向 API 发出一个请求,该 API 接收您需要的所有数据。

那么是使用几个较小的类来处理 xml 数据更好,还是只使用一个大的类来处理所有事情呢?

【问题讨论】:

    标签: objective-c macos cocoa class automatic-ref-counting


    【解决方案1】:

    我想这取决于您的应用程序。需要考虑的是,如果您必须更改正在使用的 XML 解析器怎么办?你将不得不重写你的单体类,你可能会破坏很多不相关的功能。如果您抽象了 XML 解析器,那么只需重写该特定类的实现即可。或者,如果您的应用程序范围发生变化,突然您有多个视图怎么办?您能否在不违反 DRY(不要重复自己)原则的情况下在其他地方重用代码?

    你要争取的是低耦合和高内聚,这意味着类不应该相互依赖,类应该有明确的职责和高度相关的方法。

    【讨论】:

    • 我更新了我的问题以更清楚地解释我的情况。因此,根据您的评论,似乎单类方法是最好的?
    • @Gavin:这是一个答案,而不是评论,我的阅读具有相反的含义。
    【解决方案2】:

    如果有疑问,小班会更好。

    2) 创建一个解析 XML 数据的类并创建其他类来处理从 XML 解析器类获得的数据,即一个类进行解析,另一个类实现该数据

    这样做的一个关键优势是,后一个类的模型与前一个类所做的解析工作是分开的。这变得很重要:

    • 正如 Peter Willsey 所说,当您的 XML 解析器发生更改时。例如,如果您从基于流的解析切换到基于文档的解析,反之亦然,或者如果您从一个解析库切换到另一个解析库。
    • 当您的 XML 输入发生更改时。如果您想添加对新格式或格式的新版本的支持,或者取消对过时格式的支持,您可以简单地添加/删除解析类;模型类可以保持不变(或者只接受小的和明显的改进,以支持新/改进格式的新功能)。
    • 当您添加对非 XML 输入的支持时。例如,JSON、plist、键控存档或自定义专有格式。同样,您可以简单地添加/删除解析类;模型类不需要改变太多,如果有的话。

    即使这些事情都没有发生,它们仍然比混合在一起更好。解析输入和建模用户数据是两个不同的工作;将它们混在一起会使它们难以或不可能单独推理。将它们分开,您可以更改其中一个而无需绕过另一个。

    【讨论】:

    • “解析输入和建模用户数据是两个不同的工作;将它们混合在一起会使它们难以或不可能单独推理。”仅这一点就值得投票。
    • @Peter 感谢您澄清这一点,您的回答这样做是有意义的。我将听从您的建议,并弄清楚如何使用这种方法重做我的应用程序。
    • @peter 请看我的另一个问题。我在单独的课程中遇到了 IBOutlets 的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-10-18
    • 1970-01-01
    • 2014-03-03
    • 2014-05-23
    • 2012-03-12
    • 2017-10-14
    • 2016-08-15
    相关资源
    最近更新 更多