我正在使用Swing在Java中启动一个学校小组项目。这是数据库桌面应用程序上的简单GUI。
教授给了我们去年项目的代码,以便我们了解他的工作方式。我最初的印象是代码要复杂得多,但是我想程序员在查看他们不仅编写的代码时经常会想到这一点。
我希望找到他的系统好坏的原因。(我问教授,他说我稍后再看为什么会更好,这让我不满意。)
基本上,为了避免他的可持久对象,模型(业务逻辑)和视图之间的任何耦合,所有操作都由字符串完成。存储在数据库中的可持久对象是字符串的哈希表,模型和视图彼此“订阅”,为它们所订阅的“事件”提供字符串键。
触发事件后,视图或模型会向所有订阅者发送字符串,这些订阅者将决定对该事件采取何种措施。例如,在一种视图动作侦听器方法中(我相信这只是在可持久对象上设置了bikeMakeField):
else if(evt.getSource() == bicycleMakeField)
{
myRegistry.updateSubscribers("BicycleMake", bicycleMakeField.getText());
}
该调用最终到达Vehicle模型中的此方法:
public void stateChangeRequest(String key, Object value) {
... bunch of else ifs ...
else
if (key.equals("BicycleMake") == true)
{
... do stuff ...
这位教授说,这种处理方式比让视图简单地在业务逻辑对象上调用方法更具可扩展性和可维护性。他说,视图和模型之间没有耦合,因为它们不知道彼此的存在。
我认为这是一种较差的耦合,因为视图和模型必须使用相同的字符串才能工作。如果删除视图或模型,或在字符串中输入错误,则不会出现编译错误。这也使代码比我认为的要长得多。
我想和他讨论这个问题,但是他利用他的行业经验来反驳我这个经验不足的学生可能提出的任何论点。我缺少他的方法有什么优势吗?
为了明确起见,我想比较上面的方法,同时将视图与模型明显耦合。例如,您可以将车辆模型对象传递到视图,然后更改车辆的“制造”,请执行以下操作:
vehicle.make = bicycleMakeField.getText();
这将把目前仅用于将车辆的品牌设置在一个地方的15条代码减少为一条可读代码。(由于这种操作在整个应用程序中进行了数百次,因此我认为这将是可读性和安全性的巨大胜利。)
更新资料
我的团队负责人和我重组了框架,采用了我们希望使用静态类型进行编码的方式,并告知了教授,最后给了他一个演示。只要我们不向他求助,他是否足够慷慨地允许我们使用我们的框架,以及是否可以让我们其余的团队保持最新状态-这对我们来说似乎很公平。