【问题标题】:Value type design pattern to replace class替换类的值类型设计模式
【发布时间】:2017-07-30 15:21:02
【问题描述】:

我们正在快速寻找一种价值类型的设计模式,它允许我们创建一个购物车来存放产品。我们目前正在使用一个类,但这是一个引用类型,当我们尝试添加同一产品的两个不同版本(即具有不同颜色或尺寸)时,我们添加的第一个项目将更改为我们添加的第二个项目,因为它指向内存中的同一个对象。

设计模式需要是“全局的”,以便我们可以从应用程序中的任何页面访问它。现在这是我们的 Cart 类,用于存储购物车中的所有商品。我们需要做什么才能使它成为值类型,或者如何重新设计它以使用没有类的结构?

class Cart : NSObject {
    var allProductsInCart = [MainProduct]()

    override init() {
        super.init()
    }

    class var sharedCart: Cart {
        struct Static {
            static let instance = Cart()

        }
        return Static.instance
    }
}

我们遇到的问题是我们需要购物车中的产品属于自定义类“MainProduct”。如您所见,它们现在存储为“MainProduct”。我们是否也需要将产品切换到结构或其他设计模式?我们将如何做到这一点?

【问题讨论】:

  • 这个问题没有详细说明您为什么会看到这个错误。只要将MainProduct 的不同对象添加到allProductsInCart 数组中,您提供的代码就应该可以正常工作。我建议不要通过切换到值类型来解决这个问题,而是首先找出为什么同一产品的两个不同变体最终会相互替换。我认为购物车作为价值类型没有意义。在值与引用类型上查看此 article
  • 通过切换到 MainProduct 的结构解决了该问题。 MainProduct 以前是一个类。

标签: ios swift swift3


【解决方案1】:

是的,考虑到值类型与引用类型之间的期望行为,您应该使用 Struct。

【讨论】:

  • 但是我该怎么做呢?它们的实现方式与类相同吗?甚至 mainProduct 也必须声明为结构吗?我们在使用结构时是否具有与使用类相同的灵活性?我们如何隐藏 let instance = Cart() 使其可以从应用程序中的任何位置访问以应用于结构?
  • @NevinJethmalani 在不更新逻辑的情况下使用这样的结构将导致意外行为。因为您正在对不引用的值进行操作,所以您的全局购物车不会仅通过更改为结构来更新。
【解决方案2】:

执行此操作的常用“模式”称为“Redux”。

我们的想法是,您拥有应用“状态”的一个不可变版本。

它可以从任何地方访问,更新它的唯一方法是通过“操作”。这些将使用所需的更新重建整个状态。

ViewControllers 和视图等...订阅状态各个部分的更新。

因此您可以拥有一个包含ShoppingCartStateAppState。将产品添加到其中后,您的 CartViewController 将被告知此更新并可以更新其视图等...

有许多不同的框架是为使用 Redux 而构建的,所以我不会推荐其中一个,因为你应该找到适合你的那个。但我相信这种模式最适合您的用途。

【讨论】:

  • 完美。非常感谢!我们的实现非常简单。你有一些我们可以看看你可能会推荐的东西吗?
  • @NevinJethmalani RESwift 是一个常用的框架。我们目前使用的是自建的redux框架。使用 Redux 时必须确保状态不可变。并且只能通过操作等进行更新......祝你好运。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-21
  • 2011-07-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多