1

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

模型由一些结构和一些对其进行操作的 API 函数组成,为了清楚起见,假设这是模型:

struct ComplexNumber {
    double real;
    double imag;
};

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

然后是View。我在这里只使用原始类型。

class IComplexView {
public:

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

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

现在在Presenter中,据我所知,我将有一些方法用于 View-to-Model 和 Model-to-View 数据转换。我通常有一个 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 中有访问者,然后是 ReadView() 和 UpdateView() 方法。我认为脚本可以连接到构建事件并自动生成所有这些代码,但我希望会有其他我没有注意到的替代方案。

另一种方法是完全删除 MVP,或者更具体地讲,删除演示者,只使用 UI<->Logic 分离,仅此而已。明显的缺点是更强的耦合,但另一方面,它可能会产生明显更少的代码量。

4

1 回答 1

2

您所描述的 MVP 变体可能被称为Passive View- 在这里查看 Martin Fowler 关于它的条目。它的缺点确实是有很多样板代码来同步模型和视图。使用某种data binding机制的替代方法是 Supervising Controlleror Presentation Model(aka View Model)

放下演示者,只需要一个 UI<-> 逻辑分离就可以了

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

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

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

  • Supervising Controller使用视图到域模型绑定,并且它本身只处理绑定机制无法处理的复杂情况,因此您可以两全其美。

于 2013-03-20T12:54:58.583 回答