2010-05-17 40 views
0

我不知道如何在我的應用程序中設計幾個類。 基本上這是一個情況:問題與類設計模擬不同類的用戶首選項

  • 每個用戶可以有許多偏好
  • 每個偏好可以被稱爲不同的類的一個目的
  • 偏好被表示爲(例如專輯,電影,書籍等)一組值(例如分數等)。

的問題是,許多用戶可能對同一對象的首選項,例如:

John: score=5 for filmid=apocalypsenow 
Paul: score=3 for filmid=apocalypsenow 

,自然我不想複製的對象電影中的每個用戶。

所以我可以創建一個名爲「偏愛」拿着得分,然後一個目標對象,像類:

User{ 
    hasMany preferences 
} 

Preference{ 
    belongsTo User 
    double score 

    Film target 
    Album target 
    //etc 
} 

,然後定義只是一個目標。 然後我會創建目標類(專輯,電影等)的接口:

Interface canBePreferred{ 
    hasMany preferences 
} 

而實現所有這些類的。 這可以工作,但它看起來很醜,需要大量的連接才能工作。 你有一些模式可以用來模擬這個很好嗎?

乾杯, Mulone

回答

0

的喜好與用戶和對象既有關係。可能有一個或多個用戶表示的偏好。可能會有一個或多個關於對象的偏好。

用數據建模術語來說,用戶與首選項有0到N的關係,而對象與首選項有0到N的關係。

首選項應該是與用戶和對象分開的類。

+0

謝謝! 有沒有一種優雅的方式來建模與不同類別的關係? 現在我會用不同的成員做到這一點: 電影targetFilm 專輯targetAlbum 等等 但是,這是非常醜陋的,需要的邏輯。 有什麼想法? – Mulone 2010-05-17 14:02:36

+0

另外,是否可以在Grails中使用接口? 我找不到關於它的文檔。 – Mulone 2010-05-17 14:10:00

+0

對不起。我是一名數據建模師,而不是Grails開發人員。就你的對象而言,你可以有一個龐大的類,它擁有你想要建模的所有不同對象的所有元素。空間有點浪費,但在概念上更簡單。 或者,您可以擁有一個基礎對象類,定義常用元素,並讓您的電影和專輯類繼承基礎對象,並分別定義特定於電影和專輯的元素。 – 2010-05-17 14:26:41

0

我更喜歡創建接口的概念,例如IPreferrable,我相信這些接口在Grails中通過Groovy基礎支持。我同意首選項應該與用戶對象分離,但是如果其他對象有效地代表了您的偏好分類標準,那麼您可以在構建首選項對象圖時重用它們。從領域建模的角度來看,你提出的建議沒有問題,但用戶對象可能會變得相當沉重。

從持久性的角度來看......因爲這些只是首選項,您可能能夠將整個首選項對象圖序列化爲XML。根據您的數據庫引擎,您可以使用SQLXML,這意味着您仍然使用XQuery/XPath來處理原生的XML DOM類型和原生查詢。這不應該做,以避免正確的數據庫設計,但在某些情況下是合理的。考慮到這一點,從性能的角度來看,(de)序列化總是更加昂貴,儘管向JSON對象,Meta標籤結構和其他格式轉換變得更容易。當然還有其他的方法可以解決這個問題,但是由於你想要替代方案,這只是另外一種選擇。