我正在开发一个使用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< - >逻辑分离就是这样。明显的缺点是更强的耦合,但另一方面,它可能会显着减少代码量。
答案 0 :(得分:2)
您所描述的MVP变体可能被称为Passive View
- 请查看Martin Fowler's entry about it here。它的缺点确实是用于同步模型和视图的大量样板代码。使用某种data binding
机制的替代方案是Supervising Controller
或Presentation Model
(aka View Model
)。
放弃演示者,只需要一个UI< - >逻辑分离,就是这样
这里的一个危险是绑定机制可能无法处理复杂的情况
一般来说,请考虑以下两种解决方案:
Presentation Model
可以使用两层绑定: view-to-presentation-model 和 presentation-model-to-domain-model 绑定。它保持较低的耦合,但实现这两种机制本身可能很乏味。
Supervising Controller
使用 view-to-domain-model 绑定,它本身只处理绑定机制无法处理的复杂情况,因此您可以充分利用这两个领域。< / p>