受损代码是错误代码
身为一名软件开发人员,长期以来接受的教导就是利用关注点分离很有好处。紧密耦合将导致代码不可重用,难于测试,并且不易维护。有趣的是,在开发 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 设计模式可以更好地构建这段代码。