2009-04-27 170 views
11

我在python開發一個文件類,可以讀取和寫入文件,包含XYZ座標列表。在我的程序中,我已經有一個Coord3D類來保存xyz座標。返回一個對象和回訪元組

我的問題是相對於getCoordinate(index)方法的設計。我應該返回一個浮點數組,還是一個Coord3D對象?

在第一種情況下,我變得非常低耦合的,但後來我可能會無論如何都要實例與所獲得的值Coord3D對象,雖然文件類之外。在第二種情況下,我將使用與Coord3D類緊密結合的文件類。

請注意,我覺得有沒有上述兩種溶液之間的巨大差異,但我想讀你的答案和它背後的原因。


編輯:回顧一下我到現在爲止的答案,它看起來像有沒有皆伐選擇。據說(適當地)python不是Java,你不需要專門的類來處理任何事情,只是因爲你需要通過語言體系結構。然而,在我的情況下,我有以下情況:

  1. 我正在使用Coord3D對象的庫,其中原樣使用Coord3D對象。使用它會增加我的庫的凝聚力,因爲數據類型將被統一使用。
  2. 的Coord3D對象有狀態和行爲。事實上,Coord3D對象將座標和單元集中在一個實體中。 Coord3D對象之間的操作將考慮潛在的不同單位,並相應採取行動。
  3. 我可以把集中控制代碼插入到Coord3D類實例化拒絕,例如,長度爲4,或無單位的陣列。如果我使用元組,我無法執行此檢查。而且,如果某個方法接受Coord3D,則可以保證它的前期格式良好(可以加粗並檢查isinstance或檢查接口)。元組可以包含無效數據。雖然錯誤處理蟒蛇方法進行,其中的麻煩發生,一類阻止我有一個XYZ座標做出來的三根弦的是某種有益的(如果錯了糾正我,請)

在另一方面,使用一個元組具有以下優點:

  1. 少佔用資源的,在巨大的
  2. 簡單的設計情況相當危急。更多課程意味着更復雜的設計。元組是一種標準的數據類型,它很好理解,並且可以輕鬆解包。個性化的課程不是。
  3. 使用元組,XYZFile類與庫的其餘部分完全分離(因爲它不使用Coord3D對象)。這意味着它可以作爲一個獨立的實體完全重用。

進一步的意見非常歡迎!

回答

1

我問自己同樣的問題,雖然同時做二維幾何形狀的東西。

我發現自己的答案是,如果我打算編寫一個更大的函數庫和更多的函數庫,請繼續並返回Point,或者在您的情況下返回Coord3D對象。如果這只是一個拙劣的實現,這個元組將會讓你更快。最後,這就是你要做的事情,這是值得的。

1

如果它只會用在您的應用程序中,並且您要創建一個帶有值的Coord3D實例,那麼我只需返回一個Coord3D實例即可節省您的工作量。但是,如果您有興趣製作此便攜式/普通的,請返回一個元組。這將是很容易反正創建Coord3D,使用

c3d = Coord3D(*getCoordinate(index)) 

(假設你的構造函數是Coord3D.__init__(self, x, y, z)

+0

不確定我喜歡這一點。它似乎揭露了一些無用的細節。我認爲選擇一個代表並堅持下去會更好。 – 2009-04-27 16:40:31

2

如果其他人(除了你自己)將使用這個類,在我看來,返回一個對象會鼓勵某種數據類型的一致性。如果Coord3D類有一個方法或屬性來訪問這些座標元組,那麼這仍然給他們選擇,他們需要它:

# get the object 
coord_obj = my_obj.getCoordinate(my_index) 
# get the tuple (for example, via a property named "coords") 
coord_tup = my_obj.getCoordinate(my_index).coords 
2

的更根本的問題是「爲什麼你有Coord3D類? 「爲什麼不使用元組?

我們大多數人給Python n00bz的一般建議是「不要發明新的類,直到必須完成」。

您的Coord3D有獨特的方法嗎?也許你需要一個新班級。或者 - 也許 - 你只需要一些對元組進行操作的函數。

您的Coord3D有可改變的狀態嗎?幾乎不可能。一個不可變元組開始看起來比新類更好。

+0

一般來說,我同意你喜歡的。但是,事情實際上更復雜。 Coord3D在我的代碼中普遍存在,也因爲它與Unum Unit相關聯。 – 2009-04-27 16:20:23

+0

我認爲Python的口頭禪是「命名空間是一個好主意 - 讓我們做更多的!」。在這方面,不僅僅是一組更好的相關函數(即元組操作)嗎?爲什麼你需要一個班級的國家要求?順便說一句,我是Python的新手,但我認爲創建類的想法是一件好事 - 不是要避免的事情。 – Trent 2009-04-27 16:22:03

+0

+1:添加類增加了複雜性,所以避免它,除非有真正的好處(在這種情況下我沒有看到)。 – nikow 2009-04-27 16:39:02

1

返回一個對象將是最好的實踐,並會給你一個更好的整體軟件設計。我會建議這樣做

但是,請記住,創建/返回對象將需要更多的處理時間。它可以改變的東西,如果你做這個手術了很多,在這種情況下,你可能需要考慮一下......

13

折衷的解決方案:除了一類的,讓Coord3D一個namedtuple並返回:-)

用法:

Coord3D = namedtuple('Coord3D', 'x y z') 

def getCoordinate(index): 
    # do stuff, creating variables x, y, z 
    return Coord3D(x, y, z) 

返回值可以準確地作爲一個元組,並且具有相同的速度和內存性能,這樣你就不會丟失任何泛型。但是,您也可以通過名稱訪問其值:如果cgetCoordinate(index)的結果,那麼您可以使用c.xc.y等,以提高可讀性。

[如果你不上python2.6的,你可以從cookbook recipe namedtuples]

2

乘坐(顯然這如果您Coord3D類需要太多的其他功能有點不太有用)請看Will McGugan的Gameobjects library。他有一個Vector3 class,可以用另一個Vector3對象,一個元組,單獨的浮點值等來初始化。我認爲這會回答你的問題......再加上你最終可能會使用他的庫,因爲它已經被優化,並且有很多有用的方法已經。