受损代码是错误代码
身为一名软件开发人员,长期以来接受的教导就是利用关注点分离很有好处。紧密耦合将导致代码不可重用,难于测试,并且不易维护。有趣的是,在开发 UI 时,所有这些教训通常都被抛到九霄云外。下面的示例就是印证这句话的最好证据。
从 下载 部分中下载项目。从菜单中选择 File > Import,将其导入工作区。在对话框中,选择 Existing Projects Into Workspace。在下一个屏幕中选择归档文件选项,然后浏览以选择刚下载的压缩文件。单击 Finish 将该压缩文件导入后,工作区内现在应当有了一个 databinding-tutorial2 项目。
在 MangledConcernsExample 上单击鼠标右键,然后从弹出式菜单中选择 Run As > SWT Application。将会看到一个类似图 1 所示的窗口。它提供了一个简单的启用规则用于尝试同时启用 Name、Spouse 和 Years Married 字段。如果在 Name 字段和 Spouse 字段中填入值,则 Years Married 字段将变为启用状态。删除 Name 或 Spouse 任意一个字段中的值都会导致系统清空 Years Married 字段并将其变为禁用状态。清单 1 中显示了启用此功能的代码。
图 1. UI 示例
清单 1. 受损的启用代码
private void createControls(Composite c) {
...
YearsMarriedEnablementListener listener = new YearsMarriedEnablementListener();
this.nameTxt.addModifyListener(listener);
this.spouseTxt.addModifyListener(listener);
}
private class YearsMarriedEnablementListener implements ModifyListener {
public void modifyText(ModifyEvent e) {
boolean enable = false;
if ((nameTxt.getText().trim().length() > 0)
&& (spouseTxt.getText().trim().length() > 0)) {
enable = true;
} else {
yearsMarriedTxt.setText("");
}
yearsMarriedTxt.setEnabled(enable);
}
}
|
这个示例中存在很多问题。首先,请注意 YearsMarriedEnablementListener 更像是一个补救措施,而不是应用程序的战略组成部分。第二个问题是此侦听程序中的代码直接引用了 UI 控件。为了测试这段代码,将必须把整个表实例化,包括 UI 控件。使用 Presentation Model 的 UI 设计模式可以更好地构建这段代码。
本文通过一个具体的案例展示了受损代码的问题所在。案例中的YearsMarriedEnablementListener类直接操作UI控件,导致代码难以测试和维护。文章建议采用PresentationModel UI设计模式来改进代码结构。
694

被折叠的 条评论
为什么被折叠?



