糟糕的OO设计问题-我需要Java中的一些常规功能,但不知道如何实现
我正在用Java开发一个小的UML类编辑器,主要是一个个人项目,如果我有空的话可以在SourceForge上创建一个项目。
该项目相当先进:我可以创建类,四处移动它们,创建接口,创建链接等。
我正在使用的对话框是用于设置类/接口属性和创建新的类/接口的对话框。
例如,我有一个扩展JDialog的类。这是编辑类和接口的主要"窗口"(当然,每个类都有一个类)。它包含一个JTabbedPane,后者又包含JPanels。
这个JPanel实际上是自定义的。我创建了一个扩展JPanel的抽象类。此类使用组件(由其子类定义)并将其值添加到JTable(也包含在JPanel中)。
例如,如果我要编辑类的属性,则JPanel将包含一个JTextField用于输入属性的名称以及另一个用于输入属性的类型。还有一组按钮用于处理在这些字段中输入的数据。当我单击"保存"时,我在JTextField中输入的数据将添加到JTable中(la Enterprise Architect)。扩展抽象类的具体类负责定义控件,并确定在JTable中添加或者删除一行时如何处理数据。但是,JTable管理是抽象类的责任。
这是我的问题:在OO中,一个类具有方法,而一个接口也具有方法。我告诉自己:我可以使用相同的具体自定义JPanel(AttributesPanel(扩展了我创建的抽象JPanel类))来存储类或者接口的方法。
但是,该类需要保留我正在处理的类或者接口的副本(作为属性)。这样,当向其中添加方法时,我可以调用editedClass.addMethod()(或者editedInterface.addMethod())。问题是我无法告诉我是在Class还是and Interface上工作。
我发现的解决方案很丑:在AttributesPanel类中保留一个属性editedClass和一个属性editedInterface。根据我是在编辑类还是接口,这些属性之一将为null,而其他属性则不会。
如果你问我,这是很丑陋的。实际上,我能听到我的软件工程老师在地狱第九圈燃烧(实际上,冻结)时脑袋里痛苦地尖叫着。
解决此设计问题的快速方法是创建一个名为" ObjectWithMethods"的接口,该接口将由我的Class和Interface类实现。这样,我只需要在我的AttributesPanel类中放置一个ObjectWithMethods参数即可。
但这是否意味着我应该创建一个名为" ObjectWithAttributes"或者" ObjectWithBlahBlah"的类?我在这里看到一些不错的" TheDailyWTF"潜力...此外,我不认为我应该修改我的域对象(一个类,一个接口,一个注释,一个关系(对于我的UML编辑器))或者创建一个新的接口。一些UI考虑...。
你怎么认为?
我需要更多的说明(因为我现在很累,而且在这种状态下我会很不对劲(尤其是英语,我的母语是法语)...),问一下即可,我将编辑此问题。
干杯,
纪尧姆。
解决方案
当我读到问题时,确实好像我们正在描述使用访客模式的地方。
访问者模式应在此处工作的原因是一个称为双重调度的想法。UI代码将进行调用并传递对自身的引用,然后该类或者接口最终将调用原始调用方。由于类或者接口是进行方法调用的类或者接口,因此它知道自己的类型以及如何进行针对该类型的特定工作。
当然,我的描述不足以实现此技术,因此我们需要对其进行阅读。我认为它有据可查。例如,我在大约2秒钟的Java中发现了这一点,它应该可以入门:http://www.javaworld.com/javaworld/javatips/jw-javatip98.html