我正在用 Java 开发一个小型 UML 类编辑器,主要是一个个人项目,如果我有时间在上面创建一个项目,它可能最终会出现在 SourceForge 上。
该项目非常先进:我可以创建类、移动它们、创建接口、创建链接等。
我正在处理的是用于设置类/接口属性和创建新类/接口的对话框。
例如,我有一个扩展 JDialog 的类。这是编辑类和接口的主要“窗口”(好吧,每个都有一个类)。它包含一个 JTabbedPane,而 JTabbedPane 又包含 JPanel。
这个 JPanel 实际上是自定义的。我创建了一个扩展 JPanel 的抽象类。此类使用组件(由其子类定义)并将它们的值添加到 JTable(也包含在 JPanel 中)。
例如,如果我想编辑一个类的属性,JPanel 将包含一个用于输入属性名称的 JTextField 以及另一个用于输入其类型的 JTextField。还有一组按钮用于处理在这些字段中输入的数据。当我单击“保存”时,我在 JTextFields 中输入的数据被添加到 JTable 中(à la Enterprise Architect)。扩展抽象类的具体类负责定义控制并决定当从 JTable 中添加或删除行时如何处理数据。然而,JTable 管理是抽象类的职责。
这是我的问题:在 OO 中,类有方法,接口也有方法。我告诉自己:我可以使用相同的具体自定义 JPanel(AttributesPanel(它扩展了我创建的抽象 JPanel 类))来存储类或接口的方法。
但是,该类需要保留我正在处理的类或接口的副本(作为属性)。这样,当向其中添加方法时,我可以调用editedClass.addMethod()(或editedInterface.addMethod())。问题是我无法判断我是在使用类还是在接口上工作。
我找到的解决方案很丑:在 AttributesPanel 类中保留一个属性editedClass 和一个属性editedInterface。根据我是在编辑类还是接口,其中一个属性将为空,而另一个则不会。
如果你问我,这很丑陋。事实上,我可以听到我的软件工程老师在地狱的第九圈燃烧(实际上,冻结)时痛苦地尖叫。
解决此设计问题的快速方法是创建一个名为“ObjectWithMethods”的接口,我的 Class 和 Interface 类将实现该接口。这样,我只需在我的 AttributesPanel 类中放置一个 ObjectWithMethods 参数。
但这是否意味着我应该创建一个名为“ObjectWithAttributes”或“ObjectWithBlahBlah”的类?我在这里看到了一些很好的“TheDailyWTF”潜力......此外,我认为我不应该修改我的域对象(类、接口、注释、关系(对于我的 UML 编辑器))或创建一个新接口只是为了一些 UI 考虑....
你怎么看?
我你需要更多的澄清(因为我现在很累,而且在这种心态下我往往做得很糟糕(尤其是英语 - 我的母语是法语)......),请问我会编辑这个问题。
干杯,
纪尧姆。