2016-11-20 38 views
1

如何設置以下類結構?爲什麼?設置屬於某個類的類的最有效方法是什麼

類人代表的是人物 課室代表室

在哪裏,我想存儲人的房間位置,以有效地問以下兩個問題的能力:

1)什麼房間是人X嗎?和, 2)哪些人在Y室?

我可以看到的選項是:

  • 類Person存儲間位置(問題2將是低效的),
  • 類間存儲其人(問題1是低效),
  • 上述兩種(機會數據完整性問題),並
  • 外部字典保存數據(似乎對OOP的精神)
+0

「最好」的方式?那是什麼意思?不要迂腐,但工程師應該在使用「最好」之前總是三思而後行。如果沒有價值體系,這個詞就毫無意義,如果讓隱含的話,答案就不明確。你可能會問,「以下哪種設計在存儲空間方面效率最高?」或者「以下哪種設計會產生最易讀的代碼?」或者乾脆,「你會怎麼做,爲什麼?」 –

+0

@JohnWu你說得對。在這種情況下,我在尋找有些主觀的答案,所以我會選擇「你會怎麼做,爲什麼?」。感謝回覆! – Harlekuin

回答

2

外部字典保存數據(似乎對OOP的精神)

或者你可以實現一次所有方法:你定義了兩個協會人有一個房間房間裏有很多人,你也可以使用適當的數據結構來索引一切,以光速訪問你的對象!也就是說,您可以使用面向對象的關聯(即組合)遍歷對象圖並且實現一些特定的需求,將圖存儲在某些數據結構中以滿足您的需求。

這不符合OOP的精神。它贊成採用良好的編碼習慣,而不是人爲的教條。

+0

感謝您的回答Matias!當你說定義兩個關聯時,你是說在外部結構層次,課堂層次還是概念上定義它?如果我想幫助一個人移動房間說,我想我會使用聚合而不是組成?另外,當你提到使用索引和正確的數據結構來實現特定的需求時,你在談論外部字典結構嗎?這是可能的python內,或者我必須將值存儲在數據庫中? – Harlekuin

+0

@Harlekuin嗯,AFAIK聚合是一種組合形式!所以是的,我會實現這一點,以便訪問哪個房間分配給給定的人,沒有更多的麻煩和噪音比獲得聚合。另一方面,當我向你解釋你可以索引你的數據時,我的意思是你可以在你的程序或系統的某個部分使用Python中的字典,集合,列表等數據結構來加速在特定條件下訪問你的對象。 –

+0

@Harlekuin這樣可以避免查詢整個對象集合,但這些對象已經以您需要列出的方式存儲。 –

1

肯定是一個外部結構。這是面向對象的精神。類表示對象。一個人既不是一個房間的財產,也不是一個人的財產,所以沒有理由把一個人放在另一個人的班上。相反,字典表示它們之間的關係,所以它應該是一個新的實體。

一個簡單的格式將是一個字典,其中每個鍵是一個房間,值是其中的人的列表。然而,你也許可以創建一個圍繞它的一類,如果你需要更復雜的功能

+0

恕我直言,好像你錯了** **既不是一個人的房間**,反之亦然。這不是一個財產,但是OP的域名可能需要人員和房間進行關聯,因爲這就是現實生活中業務的工作原理:D –

+0

我同意,最佳結構取決於對其進行的操作。不過,原則上,我認爲除非確實需要,否則協會不應該存儲在實體中。將人與房間關聯會降低兩者的可重用性並可能傷害可伸縮性(添加實體和關係後會發生什麼?我們是否必須修改所有現有類?)添加關係 –

+0

在這樣的* big *項目中,您將定義一個基類並且每個域可能會將關聯添加到房間和人員專業化。因此核心會議室和人員本身並不相關*,但可能取決於域名。 –

2

不是每個問題都適合OOP。這是其中之一。 :-)

你基本上在這裏是一個二維網格或矩陣。 一個軸代表人,另一個代表房間。限制是一個人只能在一個房間裏。

A list of(person,room)元組似乎是一種很好的方式來在Python中表示它。這裏有一個例子(在IPython中),用你的兩個查詢:

In [1]: locations = [('alfred', 'office'), ('ben', 'storage'), ('charlene', 'office'), ('deborah', 'factory')] 

In [2]: [room for person, room in locations if person == 'charlene'] 
Out[2]: ['office'] 

In [3]: [person for person, room in locations if room == 'office'] 
Out[3]: ['alfred', 'charlene'] 

查詢是列表解析,所以它們非常快。 除非你的位置列表是巨大的,我不認爲性能會是一個大問題。

請注意,這種解決方案將適用於空房間和不存在的人。

In [4]: [room for person, room in locations if person == 'zeke'] 
Out[4]: [] 

In [5]: [person for person, room in locations if room == 'maintenance'] 
Out[5]: [] 

您將不得不小心不要插入同一個人兩次。

+0

感謝您回覆羅蘭!我認爲即使在多對多的關係中,元組列表仍然可以工作,只要相同的組合沒有重複。如果我不得不使用上面的類,我仍然可以使用你的方法,使用指向Person和Room對象的指針來利用你的簡潔查詢(我,e,Person.name =='charlene') – Harlekuin

+0

@Harlekuin I爲了方便使用字符串。你可以使用任意的Python對象。 –

+0

噢,對不起羅蘭,我想你說的時候「不是所有的問題都適合OOP」,你的意思是我不應該用這個問題來解決這個問題 – Harlekuin

相關問題