Gwt架构:为什么要使用MVP、编辑器、RequestFactory、Gin等?

Gwt架构:为什么要使用MVP、编辑器、RequestFactory、Gin等?,gwt,architecture,Gwt,Architecture,我已经在一个GWT应用程序上工作了一年,我们从未觉得有必要使用这些框架或工具 所以我觉得我们可能错过了 我们采用“代码隐藏”的方式 下面是一个关于如何构建代码的简单示例: MyPanel.ui.xml: <label ui:field="label"/> <g:TextBox ui:field="box"/> <g:Button ui:field="button"/> MyPanel.java: @UiField LabelElement label;

我已经在一个GWT应用程序上工作了一年,我们从未觉得有必要使用这些框架或工具

所以我觉得我们可能错过了

我们采用“代码隐藏”的方式

下面是一个关于如何构建代码的简单示例:

MyPanel.ui.xml:

<label ui:field="label"/>
<g:TextBox ui:field="box"/>
<g:Button ui:field="button"/>

MyPanel.java:

@UiField
LabelElement label;
@UiField
TextBox box;
@UiField
Button button;

MyBean myBean;

Messages messages = GWT.create(Messages.class);
MyServiceAsync myServiceAsync = GWT.create(MyService.class);

...


protected void i18n() {
  label.setInnerText(messages.label());
  button.setText(messages.button());
}

...

@UiHandler("box")
void box_onValueChange(ValueChangeEvent<String> event) {
  myBean.setText(event.getValue());
}

@UiHandler("button")
void button_onClick(ClickEvent event) {
  myServiceAsync.sendData(myBean, new AsyncCallback<MyResponse>() {
     @Override
     public void onSuccess(ReponseDispoBean result) {
       Window.alert(result.message());
     }

     @Override
     public void onFailure(Throwable caught) {
       Window.alert(caught.getMessage());
     }
  });
}
@UiField
标签元素标签;
@尤菲尔德
文本框;
@尤菲尔德
按钮;
蚕豆;
Messages=GWT.create(Messages.class);
MyServiceAsync MyServiceAsync=GWT.create(MyService.class);
...
受保护的void i18n(){
label.setInnerText(messages.label());
button.setText(messages.button());
}
...
@UiHandler(“盒子”)
无效框\u onValueChange(ValueChangeEvent事件){
setText(event.getValue());
}
@UiHandler(“按钮”)
无效按钮单击(单击事件){
sendData(myBean,新的AsyncCallback()){
@凌驾
成功时公共无效(ResponseDispobean结果){
Window.alert(result.message());
}
@凌驾
失败时的公共无效(可丢弃){
Window.alert(catch.getMessage());
}
});
}
为了在面板(页面的一部分,每个页面都在自己的类中)之间进行通信,我们使用小部件或应用程序的eventbus来发送自定义事件

为了导航,我们使用places/tokenizer/activities和historymapper

对于单元和函数测试,我们使用

就这样。所以我想知道:这些工具有什么帮助?使用它们有什么令人信服的理由


谢谢

我建议看一看RequestFactory与gwt rpc。它不要求对象是可序列化的,并且有相当多的性能增强,比如只通过网络发送差异


我们还使用类似于杜松子酒的ClientFactory模式。我们使用它根据正在使用的设备类型(平板电脑、手机、桌面)注入一个客户端类

MVP只是将逻辑与视图代码分离,并帮助在jvm中运行测试,而不是使用缓慢的GWTTestcase

编辑器有助于将对象属性绑定到输入字段。这使得从输入字段复制到对象中的代码变得过时

琴酒有助于连接对象。同样,这使得测试更加容易。你可以自己连接你的对象,但如果金酒自动为你连接,你为什么要这么做

RequestFactory是RPC方法的替代品,更以数据为中心。它帮助您在批处理操作中获取数据,并使DTO的使用过时。
当然,您可以坚持使用RPC方法。但也有一些缺点。您必须为每个服务创建一个Serverlet,也可以使用命令模式。这导致了一个问题,您必须为每个请求创建一个操作、响应和处理服务。这需要维护大量代码。

您的方法还可以。事实上,我已经开始了许多这样的原型项目(而不是gwt测试UTIL,对于这样的项目,我只是使用GWTTestCase)。你知道,有时候这就是所需要的一切,而其他一切只会增加复杂性!因此,它不仅适用于原型,而且可能确实适用于一些实际项目

但事实证明,我经常希望重用一些组件,并使它们更具可配置性。这是我重构到MVP的时候了。如果我还没有开始的话(实际上,现在我通常用金酒开始所有的项目)

所以,当你发现需要这些东西,或者有某种优势时,你可以添加这些东西(不是因为它们在理论上很棒,或者“时髦”)


顺便说一下,我不使用事件总线方法(除了小的、定义良好的事件集),因为事件系统的复杂性通常会爆炸。

编辑器和GIN处理简化样板文件。
例如,比较相同的屏幕和编辑器。
当我说GIN处理减少样板文件时,只有在您已经使用依赖注入(DI)的情况下。如果不使用DI,那么

与DI类似,MVP有助于生成可测试代码,特别是测试表示逻辑(不一定是业务逻辑,也不一定是UI)。例如,你如何展示并不重要,重要的是你在正确的时间展示正确的东西。一个例子是错误:不管它们在屏幕顶部是红色的,还是在表单字段旁边,或者在表单字段上的工具提示中变成红色;重要的是在正确的时间向视图发送正确的错误集。如何替换或修改(理想情况下也应进行测试),但什么是相同的。
MVP在构建多因素应用程序时也很有用:如果手机、平板电脑和桌面之间的屏幕足够相似,那么你就可以使用同一个演示者提供3种不同的视图(这就是DI的优势所在!)

至于RequestFactory(RF),它是一种不同于GWT-RPC的客户机-服务器协议,具有自己的一组特性和限制。如果您对GWT-RPC没有问题,就不应该切换(尽管我建议您看看RF是什么)。对我来说,RF的主要特点是它是一个协议(基于JSON)而不是一个API:客户机和服务器上的类不必完全相同,只要它们足够兼容,客户机和服务器可以相互理解(添加属性,将
int
更改为
double
,等等);与GWT-RPC相比,这是一个巨大的差异,在GWT-RPC中,即使类中发生非常微小的更改,也会出现错误

但最后,“