【问题标题】:MVVM get/set vs OOPMVVM 获取/设置与 OOP
【发布时间】:2013-09-05 08:10:03
【问题描述】:

通过大量学习 MVVM 模式,我发现它非常有用,可以解决我们每天遇到的许多问题。

但我不明白它是如何与 OOP 一起使用的。 OOP 总是要求我们被封装,关心字段的隐藏(首先在构造函数中初始化它们,并且没有进一步的访问权限来设置它们)但是如果我们用 getter/setter 属性定义几乎每个模型类,它就违反了 OOP 的规则。 那么它是如何进行的呢?在真正的 MVVM 应用程序中定义多个 get/set 类可以吗?

谢谢, 雅各布

【问题讨论】:

    标签: c# wpf oop design-patterns mvvm


    【解决方案1】:

    您好,我不认为它破坏了 OOP 概念。我们通过公共属性公开数据成员。所以数据隐藏就在那里,类的用户不知道设置哪个属性会改变幕后的哪些数据。在属性的设置器中,我们可以有验证逻辑和任何可以改变类状态的负责方法/属性链。所以封装和数据隐藏就在那里。

    谢谢

    【讨论】:

    • 尼特是对的。不要忘记编译器会将一个属性转换为几个公共方法和一个私有(封装)字段:Name 属性会告诉编译器生成 get_Nameset_Name 公共方法,但是您的 实际“名称”字段仍处于隐藏状态。
    【解决方案2】:

    这里没有对立,MVVM 是一种 OOP 设计模式。 属性不违反 OOP 原则,它是封装原则的应用;即控制如何访问或修改对象数据。

    封装并没有告诉我们避免对象中的数据修改,它告诉我们要小心它,控制它。

    更多关于here的信息

    【讨论】:

    • OOP 原则具有具有行为和克隆能力的对象。 MVVM 更像是一个状态持有者。假装你想克隆一本书,或者把它借出去。对象方式是从Loanable继承一个book对象,或者实现一个Loanable接口。但是 MVVM 通常只是状态。 BookDataModel 只会保存一些变量。如果你想要其中两个,它可能会绑定到它后面的一个数组。您不能克隆视图模型,这没有任何意义。但是您可以创建一个新的模型对象并从中实例化一个新的虚拟机。基本上,我没有看到 OOP 和 MVVM 如何通过哲学共存。两个都用过。
    • 它们不能共存。它们是非常不同的思考问题的方式。
    【解决方案3】:

    根据上述答案,MVVM 不会破坏 OOP,它包含它。理想情况下,您应该通过限制读/写性质并将内聚的属性集封装到它们自己的对象中来减少软件的表面积。这可能会导致您的模型的某些部分是不可变的。但是,如果您有编辑需求,在 MVVM 中遵循不可变数据模型(DDD/函数式编程概念)是非常困难的。

    【讨论】:

      猜你喜欢
      • 2010-11-20
      • 2014-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      • 2017-11-19
      • 1970-01-01
      相关资源
      最近更新 更多