我正在開發一個Java中的小型UML類編輯器,主要是個人項目,如果發現它可能會在SourceForge上結束在其上創建項目的時間。糟糕的OO設計問題 - 我需要Java中的一些通用功能,但不知道如何實現它
該項目是相當先進:我可以創建類,移動它們,創建接口,創建鏈接等
什麼我的工作是設置類/接口的屬性和創造新的對話框類/接口。
例如,我有一個擴展JDialog的類。這是編輯類和接口的主要「窗口」(好吧,每個類都有一個類)。它包含一個JTabbedPane,它包含JPanels。
這個JPanel實際上是自定義的。我創建了一個擴展JPanel的抽象類。該類使用組件(由其子類定義)並將它們的值添加到JTable(也包含在JPanel中)。例如,如果要編輯類的屬性,JPanel將包含用於輸入屬性名稱的JTextField,以及用於輸入其類型的另一個JTextField。還有一組按鈕用於處理在這些字段中輸入的數據。當我點擊「保存」時,我在JTextFields中輸入的數據被添加到JTable(àla Enterprise Architect)中。擴展抽象類的具體實現類負責定義控件,並決定當從JTable添加或刪除行時對數據做些什麼。然而,JTable管理是抽象類的責任。
這是我的問題:在OO中,類有方法,接口也有方法。我告訴自己:我可以使用相同的具體定製JPanel(AttributesPanel(它擴展了我創建的抽象JPanel類))來存儲類或接口的方法。
但是,類需要保留我正在處理的類或接口的副本(作爲屬性)。這樣,當一個方法被添加到它時,我可以調用editedClass.addMethod()(或editedInterface.addMethod())。問題是我無法告訴我是否在Class或Interface上工作。
我發現的解決方案很難看:在AttributesPanel類中保留屬性editedClass和屬性editedInterface。根據我是否正在編輯一個類或接口,其中一個屬性將爲null,而其他屬性不會。
如果你問我,這是相當醜陋的。事實上,我可以聽到我的軟件工程老師在痛苦中尖叫,而在第九圈地獄中燃燒(實際上是凍結)。
修復此設計問題的快速方法是創建一個名爲「ObjectWithMethods」的接口,我的類和接口類將實現該接口。這樣,我只需要在我的AttributesPanel類中放入一個ObjectWithMethods參數。
但這是否意味着我應該創建一個名爲「ObjectWithAttributes」或「ObjectWithBlahBlah」的類?我在這裏看到一些很好的「TheDailyWTF」的潛力......另外,我不認爲我應該修改我的域對象(類,接口,註釋,關係(用於我的UML編輯器))或創建一個新的接口的一些用戶界面的考慮....
你怎麼看?
我需要更多的說明(因爲我現在很累,而且在這種心態下我傾向於非常糟糕(尤其是英語 - 我的母語是法語)),請問我會編輯這個問題。
乾杯,
紀堯姆。