2010-08-19 147 views
0

爲了最大限度地實現代碼重用,我爲我的Python代碼創建了一個相當複雜的類層次結構。它是這樣的:簡化複雜的類層次結構

class ElectionMethod 
    class IterativeMethod 
     class SNTV 
     ... 
    class NonIterativeMethod 
     class OrderDependent 
      class CambridgeSTV 
      ... 
     class OrderIndependent 
      class WIGM 
       class ERS97STV 
       ... 
      class Recursive 
       class MeekSTV 
       ... 

只有類層次結構的葉子被實例化到對象中。這確實能夠最大限度地實現代碼重用,但代碼本身很複雜(有些類有20多個方法),並且考慮到許多級別,可能會耗費時間來查找實現的地方。

我試過拔出大塊的功能並將該功能放入單獨的對象中,但是我沒有找到一個好方法來做到這一點,因爲幾乎所有的功能都取決於公用數據。也就是說,我可以將一些代碼移動到不同的對象上,但它需要引用大型複雜層次結構來獲取所需的數據,因此它不是真正的封裝。

有沒有人有任何建議如何使這更易於管理?

+1

如果不知道項目的具體細節,我們可以說不多。你需要仔細檢查設計,找出需要繼承的東西。 – katrielalex 2010-08-19 17:56:46

+0

感謝您的建議。我將不得不仔細觀察一下,看看他們是否能爲我工作。 – 2010-08-20 12:56:56

回答

1

Multi-method根據您的體系結構,這可能是解決這類問題的另一種有效方法。這個想法是使方法模塊級別的函數可以作用於任何需要傳遞給它們的類實例。這是另一個鏈接,將其作爲alternative to multiple inheritance進行檢查。它稱它們爲通用函數,但這個想法是相似的。它還討論了python的未記錄內置實現概念。

如果您可以將所有與設置或獲取特定實例值無關的所有內容移到模塊級函數中,並且只需將類級代碼與實現狀態暴露/修改界面有關,那麼你可能甚至不需要多種方法。

+0

儘管如此,您的鏈接有一個錯字,順便說一句,來自我的+1。 – 2010-08-19 19:51:31

+0

@Joe好看。固定。看看它 - Guido展示瞭如何實現它們。 – aaronasterling 2010-08-19 20:02:48

2

如果唯一的困難是找到某些東西被實現,也許你不需要重構。相反,請查找當前編輯器的擴展名,或切換到支持跳轉到定義的擴展名。

例如,emacs with ropemacs installed會在將光標放在對象名稱上時跳轉到定義,並且按下Ctrl-c g

我相信如果你使用vi/vim也有類似的技巧。

+0

@〜unutbu我的想法,聽起來更像是一個文檔/編輯器問題,而不是一個糟糕的設計問題 – Chris 2010-08-19 18:41:47

+0

感謝您的建議。我使用具有相似功能的WingIDE。 – 2010-08-19 19:02:49

0

這是經典問題,所以沒有普遍的答案(否則它不是問題)。但有幾個常用的解決方案。其中之一 - SOLID設計原則。因此,您不必通過層次結構級別來搜索功能,您可以通過適當的單一責任代碼元素輕鬆找到或實施它。如果您需要訪問某些常用數據,則應該創建負責訪問此數據的對象。

合同設計尤其是依賴注入技術通常需要一些框架支持,因此請搜索suitable platform