我正在开发一个使用 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 分离,仅此而已。明显的缺点是更强的耦合,但另一方面,它可能会产生明显更少的代码量。