2009-02-09 53 views
2

早上好,如何正確組織一個包/模塊依賴關係樹?

我目前正在寫一個python庫。目前,模塊和類以無組織的方式部署,沒有合理的設計。當我接近更正式的版本時,我想重新組織類和模塊,以便它們具有更好的總體設計。我繪製了一個導入依賴關係圖,並且我計劃按層級聚合類。另外,我正在考慮對類進行一些修改,以減少這些依賴關係。

對於一個潛在的複雜和潛在的Python庫的良好整體設計,你有什麼策略?你有沒有有趣的建議?

感謝

更新:

我確實是在尋找一個經驗法則。例如,假設這種情況發生(初始化的.py爲了清楚起見移除)

foo/bar/a.py 
foo/bar/b.py 
foo/hello/c.py 
foo/hello/d.py 

現在,如果你碰巧有d.py進口bar.b和a.py進口的hello.c,我會考慮這是一個糟糕的設置。另一種情況是

foo/bar/a.py 
foo/bar/baz/b.py 
foo/bar/baz/c.py 

假設a.py和b.py都導入c。你有三種解決方案:1)b進口c,a進口baz.c 2)你在foo/bar中移動c。 a.py進口c,b.py進口.c 3)你把c移到別的地方(比如foo/cpackage/c.py),然後a和b都輸入cpackage.c

我傾向於選擇3) ,但是如果c.py作爲一個獨立的模塊沒有意義,例如,因爲你想把它保留在bar包中,那麼我會優先考慮1)。

還有很多其他類似的情況。我的經驗法則是至少減少依賴和交叉的數量,以防止高度分支,高度交錯的設置,但我可能是錯的。

回答

6

「我畫了一個導入依賴關係圖,我打算按層級聚合類。」

的Python必須讀起來像英語(或者其他任何自然語言。)

的進口是,應該有實際意義一流的聲明。按照「層級」(不管那是什麼)組織事物應該清楚,有意義和明顯。

請勿將任意類的技術分組轉換爲模塊和模塊。

使模塊和軟件包變得明顯和合理,以便導入列表顯而易見,簡單且合乎邏輯。

「另外,我正在考慮對類進行一些修改,以減少這些依賴關係。」

減少依賴關係聽起來是技術性和任意性的。它可能不是,但聽起來就是這樣。沒有實際的例子,這是不可能的。

您的目標是清晰。

此外,模塊和軟件包是重用的獨立單元。 (不是類;一個類,但本身通常不可重用。)您的依賴關係樹應該反映這一點。您正瞄準可以整潔,乾淨地導入到應用程序中的模塊。

如果您有許多與模塊密切相關的模塊(或替代實現),那麼可以使用軟件包,但要謹慎使用。 Python庫相對平坦;那裏有一些智慧。


編輯

單向層之間的依賴關係是一個基本特徵。這更多的是關於正確的軟件設計,而不是關於Python。您應該(1)分層設計,(2)設計以便各層之間的依賴性非常嚴格,然後(3)在Python中實現它。

這些軟件包可能不一定適合您的分層。這些包實際上可能是一個平坦的目錄列表,其依賴關係僅通過import語句表示。

+0

對於層,我的意思是組織我的軟件包,以便它們的類/模塊依賴於該軟件包的內容或另一個包含「較低」服務的軟件包。我會將每個軟件包視爲一個「獨立庫」,最終依賴於其他軟件包,因此不會產生循環依賴。 – 2009-02-09 13:18:48

0

這個問題非常模糊。

您可以通過讓base/core的東西從庫的其餘部分不導入任何東西,以及從這裏導入具體的實現來實現這一點。除了「在導入時沒有兩個模塊相互導入」,你應該沒問題。

module1.py:

import module2 

module2.py:

import module1 

這樣可不行!

+0

其實,你的例子是/將/工作。我不會低調,因爲你的方法是一個很好的經驗法則:沒有兩個模塊相互導入,如果他們這樣做,修復你的設計。 – Yonatan 2012-11-14 20:15:33

0

這取決於該項目,對吧?例如,如果您使用的是模型 - 視圖 - 控制器設計,那麼您的軟件包的結構將使3組代碼無關。

如果您需要一些想法,請打開您的站點包目錄,並查看這些模塊中的一些代碼以瞭解它們的設置方式。

沒有更多關於模塊的知識,沒有正確的方法;正如阿里所說,這是一個模糊的問題。你真的只需要分析你面前的東西,並找出更好的方法。