2011-09-21 109 views
0

我正在尋找更多關於處理類實例的樹的信息,以及如何最好地從樹幹上的樹葉上調用方法。我有一個包含許多分支實例的主幹實例(在字典中),並且每個實例都有許多葉子實例(以及分支中的字典)。葉子是行動真正發生的地方,因此葉子中有方法來查詢價值,恢復價值和許多其他事情。在Python中使用類實例的樹

這導致了代碼重複的感覺,因爲我可能想對某個分支的所有葉做些什麼,所以在分支中有一些方法用於對葉,指定葉集或全部葉子知道這個分支,儘管這些通過簡單地循環葉子並要求他們自己做這些事情(因此實際工作的代碼在葉子類中的一個地方)來減少代碼重複。

然後樹幹進來,在那裏我可能想要對整個樹(即所有樹葉)做一些事情,所以我有方法讓所有已知對象運行它們的全葉函數。我開始覺得從這種方式的葉子中真正的動作中移除了,雖然它工作的很好,而且代碼看起來相當緊密 - 非常簡短,可讀性和運行良好。

另一個問題出現在邏輯分組中。有些數據可能要與某些,大部分或全部葉子相關聯,以表明它們是某個邏輯組的一部分,所以目前葉子本身都存儲了這種數據。當我想要得到一個邏輯組時,我必須掃描所有的樹葉並將它們收集起來,而不是在樹幹層面有某種列表。這實際上一切正常,甚至是非常合乎邏輯的,但它感覺瘋了。這僅僅是因爲它們的複雜性,還是有其他方法來處理這些類型的事物,而與樹狀結構一起工作的本質?我不想建立二級結構來從相反方向連接到事物 - 例如用一個邏輯組中的樹葉作爲參照,然後從那個更像列表的方向接近它們。將所有東西都保存在一棵大樹中的一個好處就是它可以用醃菜一次性傾倒和裝載。

我很樂意聽到別人對這些事情的經驗 - 任何和所有 - 的想法。

回答

0

我從你的問題中拿走的是「一切正常」,但是代碼開始感覺難以理解和難以推理,並且:有沒有更好的方法來做到這一點?

您的問題缺失的一件事是一個堅實的背景。你的樹結構實際上解決了什麼樣的問題?這些對象實際上做了什麼?他們都是同一類型的對象,還是有混合的對象?有了這些細節,你可能會得到更多的實際答案。

現在,我建議檢查一下design patterns上的一些資源。具體來說就是compositevisitor模式。

在書結束的事情,你可以看看Design Patterns和/或Refactoring to Patterns。這些代碼都沒有任何Python代碼,但如果你不介意Java,後者是一個很好的介紹,它很難推斷代碼結構並使用模式來更好地組織事物。

你也許還會看看Alex Martelli在Python Design Patterns上的演講。

question還有一些關於模式和python的資源鏈接。

希望有所幫助。

+0

謝謝,馬克。你對我的模糊問題基本上是正確的。你也不是第一個向我推薦設計模式的人。我想我終於準備好了提示。我目前正在尋找一份Design Patterns書。 –