【问题标题】:Design pattern advice: Using an array of custom objects as a singleton设计模式建议:使用自定义对象数组作为单例
【发布时间】:2011-04-03 00:59:27
【问题描述】:

经过大量学习,我开始编写我的第一个应用程序。

在我的代码中,我有一个名为“Measurement”的类。我想实现一个测量数组。这个 Measurements 数组需要跨多个视图控制器进行访问,因此我为该数组创建了一个名为“MeasurementsArray”的自定义类,并将其制成单例。

我已经这样做了,并且代码按预期工作。但是现在我已经让它工作了,我想确保我的代码易于理解,并且我遵循传统的 Objective-c 设计模式。

如果不是我需要Measurement 数组是一个单例,那么这个数组似乎属于“Measurement”类作为类方法。但我的理解是,当一个类是单例时,它只能有一个实例。

但不知何故,拥有一个名为“MeasurmentsArray”的单独类对我来说似乎有点笨拙。

我的问题:

我是以正确的方式接近这个,还是我错过了什么?

如果我确实需要将测量数组拆分为一个单独的类以使其成为单例,那么“MeasurementsArray”是否看起来像一个合适的类名?如果不是,请提供您将用于此类情况的命名约定。

编辑:在一些初步答案之后,对应用功能的一些说明可能会有所帮助。

这是一款记录、保存和跟踪体脂百分比和体重的健身应用程序。每次用户记录他的身体脂肪和体重时,它都会成为“测量”类的一个实例。为了跟踪体重和体脂随时间的变化,需要测量数组。需要一个单例,因为多个视图控制器需要访问数组。

【问题讨论】:

    标签: objective-c arrays class design-patterns singleton


    【解决方案1】:

    需要一个单例,因为多个 视图控制器需要访问 数组。

    除了依赖单例之外,还有其他更好的方法可以在对象之间共享数据。

    视图控制器通常由应用程序委托或另一个视图控制器创建。应用程序的数据模型(在这种情况下,即您的测量数组)通常也由应用程序委托创建。因此,当应用程序委托创建视图控制器时,它还可以为该控制器提供指向数据模型的指针。如果该控制器创建任何视图控制器,它同样可以共享其指向数据模型的指针。

    将数据模型从应用程序委托传递到视图控制器,从一个视图控制器传递到下一个视图控制器,使您的代码更易于维护、测试、重新配置和重用,因为它避免了依赖于某些预先确定的、全局可访问的对象。

    【讨论】:

    • 事实上,我只有 5 个视图控制器,都从一个“主”视图控制器调用,这使得这个解决方案在这种情况下是最优雅的。所提供的所有不同方法向我证明,编码绝对是一门艺术,也是一门科学。
    【解决方案2】:

    拥有一个单身人士可能是一个错误的举动。有时单例是合适的,但通常会有更好的选择。

    听起来您可能已经在实现类似于Model-View-Controller 模式的东西,这是合适的。在这种情况下,这个测量数组是模型的一部分,将它作为一个单独的类可能是有意义的,但可能不需要它是一个单例。

    名称MeasurementsArray 是特定于实现的。我更倾向于将其称为 Measurements 或给它起一个反映测量结果的名称。

    事实上,我想知道您的Measurement 班级的名称。它在测量什么?它实际上代表什么?

    如果您发布一些代码,我们或许可以提供更具体的想法。

    根据您的更新和一些想法,您可能想要考虑The Repository Pattern。与其让您的控制器持有数组,不如让他们访问可以从中获取它的存储库。

    我的想法是,您的测量数组可能由MeasurementRepository 提供,虽然现在数据可能是存储库仅保存的单个简单数组,但它可能会演变为存储在数据库中的东西用户并随时间变化,以便您的存储库提供更复杂的访问。

    与其让这个存储库成为一个单例(尽管有时确实会这样做),不如只创建一次然后注入到需要它的所有东西中。见http://en.wikipedia.org/wiki/Dependency_injectionUncle Bob's blog

    【讨论】:

    • 好点,有关应用程序功能的一些上下文可能会有所帮助。它是一个健身应用程序,可以记录、保存和跟踪体脂百分比和体重。每次用户记录他的身体脂肪和体重时,它都会成为“测量”类的一个实例。为了跟踪体重和体脂随时间的变化,需要测量数组。需要一个单例,因为多个视图控制器需要访问该数组。我将编辑原始帖子以反映这些细节。
    • 尽管我将 Caleb 标记为正确答案,但您的回答帮助我更好地理解了我的具体问题 - 主要是因为我有一个非常简单的单用户应用程序,不需要任何数据库连接。如果我有代表,我会投赞成票。谢谢!
    • 很高兴我能提供帮助。我也刚刚对这个问题投了赞成票,这让你更接近投票能力!
    【解决方案3】:

    我觉得一个单独的类可能是矫枉过正,除非它有自己的几个方法,在这种情况下它可能是合理的。这个问题可能只是你的应用程序结构的产物,还没有很好地定义。数据是否会跨会话保持不变?如果是这样,是否会有一个“管理器”类,您可以在其中放置一个属性来检索数组; MeasurementStore 类上的 allMeasurements 之类的东西?另一种选择是将数组存储在您的应用委托中。

    我发现如果我继续开发一个应用程序,我应该如何构建它就变得很明显了。

    编辑: 详细地说,您的方法没有任何“错误”;可能有更好的方法来做到这一点。

    【讨论】:

    • 我比我的 MeasurementsArray 更喜欢类名 allMeasurements。我将所有代码放在一个类中的问题是单例问题。 (有关详细信息,请参阅我的问题)。
    【解决方案4】:

    如果我的理解正确,那么测量值数组代表特定用户过去的测量值。
    如果是这样的话——你根本就不是在寻找单身人士。
    请记住,单例是 PER APPLICATION 的单个值,而您在这里寻找的是 PER USER 的单个值。
    Don Roby 是绝对正确的——Measures 可能是 User 类的一个属性。例如(我使用的是 c# 表示法,但你掌握了它的窍门……):

    public class User
    {
        public string Name {get; set;}
        public int Id {get; set;}
        public Measurement[] Measurements {get; set;} //one array per-user... 
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-08-19
      • 1970-01-01
      • 2012-05-02
      • 2011-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多