2010-05-12 104 views
1

我正在研究兩個產品之間共享的python類。 90%的功能適用於這兩種產品。對於10%這是不同的代碼充滿了這樣的事情:Python模塊在多個產品之間共享

#Start of file 
project = 'B' 

#Some line of code 

if project == 'A': 
    import moduleA 
elif project == 'B': 
    import moduleB 

#Many lines of code 

if project == 'A': 
    print moduleA.doA(2) 
elif project == 'B': 
    print moduleB.doB(2) 

這似乎並不很優雅還是很可讀,有沒有人遇到過這樣的事情?有沒有更好的方法來做到這一點?

+0

我懷疑你的兩個項目之間共享的軟件包的設計不夠模塊化。你能否給我們提供更多的代碼共享的例子?重構可能是關鍵。 – 2010-05-12 23:25:46

+0

誰是誰?班級在哪裏?你能更精確地闡述這個問題嗎? – joaquin 2010-05-12 23:32:29

回答

3

不,這是非常糟糕的設計。如果你的模塊的行爲受到它所使用的項目的影響,那麼它應該接受一個對象,函數或其他特定行爲的回調函數。我的建議是將共享內容分解成單個模塊,並針對特定於項目的任何內容添加對需要傳入的對象的依賴關係,並要求該對象符合某些接口。然後,將您的項目特定行爲包裝在符合所需接口的對象中,並將其傳遞給公共共享模塊。

+0

似乎是一個功能良好的地方。 – Xorlev 2010-05-13 04:23:05

+0

感謝您的建議,我會放棄這一點。 – MattyW 2010-05-13 09:45:20

0

你的共享模塊應該實現一個基類和兩個使用模塊通用的功能,然後每個使用模塊將繼承該基類並添加或調整必要的內容。還有其他很好的方法(比如@ Michael的答案中的建議,即所謂的依賴注入設計模式),但通常子類化和重寫是針對不同特定需求「定製」功能的最簡單方法(它會導致高和剛性耦合,但這通常是簡單的成本)。

0

另一個可能的方法是,如果兩個答案都不是實際可行的,則是在導入級別定義接口。例如:

if project == 'A': 
    from moduleA import doA as doproject 
elif project == 'B': 
    from moduleB import doB as doproject 

# many lines of code 

doproject(2) 

這個概念(雖然不是這一特定問題)是的是「進口X的Y」是真的很不錯的事情之一。

您還可以根據項目名稱構建導入,使項目具有鍵值,以項目的值作爲其調用的模塊的值以及類似的東西。但是我不會朝那個方向發展,除非我真的確定重構,所以我可以通過我需要的模塊不起作用。