2013-08-25 34 views
2

我無法弄清楚如何在實踐中避免並行層次結構。例如考慮一個應用程序必須創建/保存/編輯不同級別的筆記,這是一個基於Java swing的應用程序。並行繼承層次真的是代碼味道嗎?

域層級:

AbstractNote < MonthNote 
      < DayNote 
      < ProductNote 

只讀視圖層次(上JTabPane各有JTable中顯示,以顯示特定筆記的詳細信息)

AbstractNotePanel < MonthNotePanel 
        < DayNotePanel 
        < ProductNotePanel 

筆記編輯器層次結構(如圖所示,當用戶點擊一個

AbstractNoteEditorDialog < MonthNoteEditorDialog 
          < DayNoteEditorDialog 
          < ProductNoteEditorDialog 

我看過一種方法,以避免這種情況是使用訪客模式。 here 但這似乎並不適用於我的情況。

我很滿意我的上述設計,因爲大多數通用代碼都在抽象類中(應用模板方法模式)。如果我必須創建一種新的註釋類型,例如YearNote,那麼我必須同時創建YearNotePanel和YearNoteEditorDialog,這對我來說是完全可以接受的,因爲我不必因模板而編寫很多代碼。最重要的是,我想避免設計中的代碼味道。請在上面的場景中建議我使用替代設計,以便我的代碼仍然是模塊化的。 謝謝

+0

從beginNote開始,MonthNote,DayNote和ProductNote有什麼區別? –

+0

他們彼此有點不同,未來可能會非常不同。每個音符都綁定到一個用戶,並有一個長文本。 MonthNOte和DayNote分別有joda MonthYear和LocalDAte。產品注意事項沒有日期信息,而是有產品實例(另一個域對象),我們只是在UI上顯示產品的名稱。 – Joe

+0

擺脫他們的**沒有**延長JSomething,曾經 - 他們的目的是爲了使用 – kleopatra

回答

1

說「首先我想避免在我的設計中的代碼味道」是一個值得稱道的目標,但始終牢記,the core of design is to weigh costs

在我的應用程序中,我通常有模型類和配置。配置可以在模型中(註釋,內省方法)或作爲額外的文件。

UI層讀取此配置,然後從中構建UI。這意味着我的設計如下所示:

AbstractNote < MonthNote 
      < DayNote 
      < ProductNote 

NotePanel 
NoteEditorDialog 

這經常起作用,因爲對話框和麪板非常通用。當然,我的通用UI層非常複雜,因爲它必須處理每個角落的情況。因此,如果您只是查看文件數量或繼承層次結構,這可能看起來比您的設計好得多,但UI層中的代碼比您的UI複雜得多。另外,如果我在UI層添加一個功能/修復了一個bug,那麼我可能會在別的地方打破某些東西(因此,編輯DayNote更舒適的代碼會改變MonthNote)。

所以,除非您覺得您有很多代碼重複,您可以輕鬆避免或維護成本高,或者您只有幾種模型類型(而不是500),因此您的設計沒有任何問題。

+0

感謝亞倫爲您的迴應,我同意平衡成本效益和易維護矛盾的目標。基於註釋配置之類的通用NotePanel和NoteEditorDialog可能會引入switch語句代碼異味或複雜度,這將非常難以維護。如果我錯了,請糾正我。我寧願多態。 – Joe

+0

我沒有使用switch語句。我的用戶界面是一個網格。當我讀取配置時,我創建了不同的編輯器元素,每個編輯器都知道如何在沒有任何開關的情況下執加載的配置文件將編輯器放入每個網格單元格中(某些編輯器只是標籤)。 –

0

您可以在此處使用的重要API是BeanInfo API。熟悉它。在任何java類(bean)上,你都可以定義一個元級別的BeanInfo類。

一個用法是用這種方法你可以創建一個新的Swing組件,並在IDE中使用BeanInfo提供一個表組件屬性。 (在NetBeans IDE中,您可以將自己的組件添加到組件面板,並以此方式運行。)這與屬性編輯器(用於選取顏色/數據/ ..)配合使用。

+0

謝謝喬普。坦率地說,我從來沒有使用過BeanInfo API。另外我總是希望我的解決方案不受限於任何IDE。有沒有一種方法可以在沒有任何IDE的情況下使用BeanInfo? – Joe

+0

BeanInfo是一個描述「beans」類的屬性的標準。因此它是i.a.打算供幾個IDE使用。但它完全獨立於任何用例。在你的情況下,字段的通用描述可能更容易。雖然通過註釋,儘管通過XML,...或BeanInfo。 –