在MVP中围绕层移动数据的众所周知的方法是什么

时间:2013-03-20 12:38:21

标签: c++ design-patterns data-binding mvp

我正在开发一个使用MVP模式的应用程序。它还处于早期开发阶段,所以我仍然可以在不同的设计选择上进行批判性反思。

模型由一些结构和一些对它们起作用的API函数组成,为清楚起见,我们假设这是模型:

struct ComplexNumber {
    double real;
    double imag;
};

Complex_Add(ComplexNumber x, ComplexNumber y);
Complex_Mul(ComplexNumber x, ComplexNumber y);

然后视图。我这里只使用原始类型。

class IComplexView {
public:

    virtual double GetReal1() = 0;
    virtual double GetImag1() = 0;

    virtual double GetReal2() = 0;
    virtual double GetImag2() = 0;
    // Setters snipped
};

现在在 Presenter 中,据我所知,我有一些方法可用于视图到模型和模型到视图的数据转换。我通常有一个ReadView()和一个UpdateView()方法。所以演示者的那部分看起来非常接近这个:

class ComplexPresenter {
    ICopmlexView view;
    ComplexNumber x;
    ComplexNumber y;

    // ...

    static void ReadView() {
        x.real = view.GetReal1();
        x.imag = view.GetImag1();

        y.real = view.GetReal2();
        y.imag = view.GetImag2();
    }
}

UpdateView()将是另一种方式,以便从模型中填充视图。

使用该设置,问题是: 是否有一些“聪明”的方法将视图中的变量/属性绑定到模型中的变量/属性而不是上面直接的变量/属性?

我看到的问题是相对大量的添加代码只是为了移动数据。首先,我们在IView中有acessors,然后是ReadView()和UpdateView()方法。我认为脚本可以连接到构建事件并自动生成所有这些代码,但我希望还有其他选择,我没有注意到。

另一种方法是完全放弃MVP,或者具体地说,放弃演示者,只需要一个UI< - >逻辑分离就是这样。明显的缺点是更强的耦合,但另一方面,它可能会显着减少代码量。

1 个答案:

答案 0 :(得分:2)

您所描述的MVP变体可能被称为Passive View - 请查看Martin Fowler's entry about it here。它的缺点确实是用于同步模型和视图的大量样板代码。使用某种data binding机制的替代方案是Supervising ControllerPresentation Model (aka View Model)

  

放弃演示者,只需要一个UI< - >逻辑分离,就是这样

这里的一个危险是绑定机制可能无法处理复杂的情况

一般来说,请考虑以下两种解决方案:

  • Presentation Model可以使用两层绑定: view-to-presentation-model presentation-model-to-domain-model 绑定。它保持较低的耦合,但实现这两种机制本身可能很乏味。

  • Supervising Controller使用 view-to-domain-model 绑定,它本身只处理绑定机制无法处理的复杂情况,因此您可以充分利用这两个领域。< / p>