我想问您关于模型和ModelWrapper的行为。根据维基百科有关MVVM模型组件的文章:



我在mvvmFX文档和示例中寻找ModelWrapper用法示例,但仅找到数据访问层模型示例。我需要将模型类与业务逻辑一起使用。例如,在setter方法中更改类状态(副作用的用法在这里是代码的味道吗?):

    public class ModelClass {

        private int intField;
        private String stringField;

        public int getIntField() {
          return intField;
        }

        public void setIntField(int intField) {
          if (intField == 100) {
            this.stringField = "";
          }
          this.intField = intField;
        }

        public String getStringField() {
          return familyName;
        }

        public void setStringField(String stringField) {
          this.stringField = stringField;
        }

    }

根据ModelWrapper文档:



如何使用这样的模型类,而不是两次实现业务逻辑(第一次在模型类中,第二次在ViewModel类中)?还是我必须将业务逻辑转移到其他地方?

最佳答案

ModelWrapper主要用于没有太多逻辑的Java Bean类。这是防止用户不得不编写代码以将值从模型对象复制到ViewModel并返回的 helper 。

在您的示例中,当您调用ModelWrapper的commit方法时,它将通过调用所有已注册的setter方法将所有值从viewModel属性复制到模型实例。这是按照注册属性字段的顺序完成的。如果您首先注册了intField-Property,则ModelWrapper将首先调用setIntField方法(此方法会在模型实例中更改intFieldstringField),然后调用setStringField方法,该方法将覆盖stringField
但是,必须修改字段注册的顺序听起来不是一个好主意,并且很可能无法扩展到更复杂的模型类。

因此,最后,我认为ModelWrapper对于您的用例不是一个好的工具。在许多情况下,关于如何将模型类与viewModel连接没有普遍的答案。它在很大程度上取决于预期的行为和用例。

关于 setter 中的副作用以及是否有代码气味的问题:在我看来,用一种方法修改多个内部字段的状态是完全可以的。这就是OOP和信息隐藏的全部内容。但是,在Java中,有getter和setter方法的约定。如果将方法命名为setIntField,大多数Java开发人员将假定此方法仅修改intField,仅此而已。因此,我建议为这种方法找到一个更好的名称,并使 getter 和 setter 简单明了。

09-05 03:24