C# MVVM获取/设置与OOP

C# MVVM获取/设置与OOP,c#,wpf,oop,design-patterns,mvvm,C#,Wpf,Oop,Design Patterns,Mvvm,通过对MVVM模式的深入了解,我发现它非常有用,解决了我们每天遇到的许多问题 但我不明白它是如何与OOP一起进行的。OOP总是要求我们被封装,关心字段的隐藏(首先在构造函数中初始化字段,并且没有进一步的访问权限来设置字段),但是如果我们使用getter/setter属性定义几乎每个模型类,它就打破了OOP的规则。 那么进展如何?在真正的MVVM应用程序中定义多个get/set类可以吗 谢谢, Jacob嗨,我不认为它打破了OOP的概念。我们通过公共属性公开数据成员。所以数据隐藏就在那里,类的用户

通过对MVVM模式的深入了解,我发现它非常有用,解决了我们每天遇到的许多问题

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

谢谢,
Jacob

嗨,我不认为它打破了OOP的概念。我们通过公共属性公开数据成员。所以数据隐藏就在那里,类的用户不知道设置哪个属性将改变场景后面的哪些数据。在属性的setter中,我们可以拥有验证逻辑和任何可以更改类状态的负责方法/属性链。因此,封装和数据隐藏是存在的


谢谢

嗨,我不认为它打破了面向对象的概念。我们通过公共属性公开数据成员。所以数据隐藏就在那里,类的用户不知道设置哪个属性将改变场景后面的哪些数据。在属性的setter中,我们可以拥有验证逻辑和任何可以更改类状态的负责方法/属性链。因此,封装和数据隐藏是存在的


谢谢

这里没有VS,MVVM是一种面向对象的设计模式。 属性不违反OOP原则,它是封装原则的应用;i、 e.控制如何加入或修改对象数据

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


更多关于这方面的信息这里没有VS,MVVM是一种OOP设计模式。 属性不违反OOP原则,它是封装原则的应用;i、 e.控制如何加入或修改对象数据

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


更多关于这方面的信息

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

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

nit是正确的。别忘了编译器会将一个属性转换为几个公共方法和一个私有(封装)字段:
Name
属性会告诉编译器生成
get\u Name
set\u Name
公共方法,但实际的“Name”字段仍然是隐藏的。没错。别忘了编译器会将一个属性转换为几个公共方法和一个私有(封装)字段:
Name
属性会告诉编译器生成
get\u Name
set\u Name
公共方法,但实际的“Name”字段仍然隐藏。OOP原则具有具有行为和克隆功能的对象。MVVM更像一个国家持有者。假装你想克隆一本书,或者把它借给别人。对象方式是让book对象继承Loanable,或者实现Loanable接口。但是MVVM通常只是状态。BookDataModel只包含一些变量。如果您想要其中两个,它很可能绑定到它后面的一个数组。不能克隆视图模型,这毫无意义。但是您可以创建一个新的模型对象并从中实例化一个新的VM。基本上,我并没有看到OOP和MVVM如何在哲学上共存。两者都用。它们不共存。它们是非常不同的思考问题的方式。OOP原则有具有行为和克隆功能的对象。MVVM更像一个国家持有者。假装你想克隆一本书,或者把它借给别人。对象方式是让book对象继承Loanable,或者实现Loanable接口。但是MVVM通常只是状态。BookDataModel只包含一些变量。如果您想要其中两个,它很可能绑定到它后面的一个数组。不能克隆视图模型,这毫无意义。但是您可以创建一个新的模型对象并从中实例化一个新的VM。基本上,我并没有看到OOP和MVVM如何在哲学上共存。两者都用。它们不共存。它们是非常不同的思考问题的方式。