2008-09-24 15 views
2

我正在開發一個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編輯器))或創建一個新的接口的一些用戶界面的考慮....

你怎麼看?

我需要更多的說明(因爲我現在很累,而且在這種心態下我傾向於非常糟糕(尤其是英語 - 我的母語是法語)),請問我會編輯這個問題。

乾杯,

紀堯姆。

回答

3

當我看到你的問題時,它看起來像你正在描述一個地方使用visitor pattern

訪客模式應該在這裏工作的原因是一個被稱爲雙派遣的想法。你的用戶界面代碼將會打一個電話並傳遞一個引用給自己,然後這個類或接口就會調用原來的調用者。由於類或接口是進行方法調用的類,因此它知道它自己的類型以及如何執行特定類型的工作。

當然,我的描述不足以實現這種技術,所以你需要閱讀它。我認爲這是有據可查的。例如,我在約2秒內發現了這個應該讓你開始的java:http://www.javaworld.com/javaworld/javatips/jw-javatip98.html

0

通常,我只是做最直接的事情,並開始考慮分解接口,當我開始看到太多if(.. instanceof ..) - 像我的代碼中的結構。現代IDE代碼重構功能並不會讓我付出太多代價。

在您的具體情況下,我會考慮實現UML specification中提供的圖表,因爲他們非常善於使用UML標記來指定UML!

0

你有一個應用程序。在那個應用程序。你的表示,並編輯一些數據。

該數據表示編程語言類或編程語言接口。

當您爲某些數據製作編輯器時,有時您必須添加其他/補充信息,例如,每個類別圖表可能具有不同的線條顏色,並且不必與屬性或方法你的班。

字段或屬性也是如此,表示您正在編輯類或接口。

我建議做一些事情。

獨立從程序的代碼或邏輯表示的數據:

,如果你有這樣的:

// all code, classes, mixed up 
public class JCustomPanel: { 

    protected ChartClass Charts; 
    protected ArrayList<String> MyClassAttributes; 
    protected ArrayList<String> MyClassMethods; 

    void PanelDoSomeThing(); 
    void ClassDoSomeThing(); 
    void InterfaceDoSomeThing(); 

    // ... 
} // class JCustomPanel 

改成這樣:

// things related to a single class or interface, 
// nothing to do with the chart 

public class JClassRepresentation: { 

    ArrayList<String> Attributes; 
    ArrayList<String> Methods; 

    bool IsInterface; 

    void ClassDoSomeThing(); 
    void InterfaceDoSomeThing(); 

    // ... 
} // class JCustomPanel 

// things related to the editor, 
// contains the classes and interfaces, 
// but, as separate stuff 
public class JCustomPanel: { 

    ArrayList<JClassRepresentation> Classes; 

    int PagesCount; 

    void InterfaceDoSomeThing(); 

    // ... 
} // class JCustomPanel 

乾杯。