2009-12-28 34 views
0

基本上我會列出DirectorsActors定義在一個xml中爲每個Movie類型的實例。如何在C#中實現電影導演和演員?

  1. 我應該使用什麼類型來定義集合? (Built-inBCLcustom?)

  2. 我應該使用stringsDirectorsActors或定義特定DirectorActor類型?

  3. 如果是(對於#2),我應該有一個Person類,DirectorActor均來自於。

我的這種關係的模型不會像IMDb一樣深。

我只是需要一種方法來列出基於某些演員,導演電影等

所以我不知道如何以最佳方式實現這一目標?只是要求意見。

+4

第三部電影實現的問題:也許你在做什麼可能帶來了有益的解答和建議高度概括? :) – 2009-12-28 18:54:17

+0

我認爲,語言問題是同一個項目:) – Diadistis 2009-12-28 18:58:14

+4

我想你會更好,只是僱人這裏寫這個程序對你的一部分。 – 2009-12-28 18:59:13

回答

1

同樣,一個簡單的String可能用於第一實現這樣做,但你可能會與沿線的一個類型更好:

class Person 
{ 
    public int ID { get; set; } 
    public string ForeName { get; set; } 
    public string SurName { get; set; } 
} 

然後,您可以存儲IDMovie類/表而你的Person類是可擴展的,例如「真實姓名」,「也稱爲」等等。但是這些只會在您希望將它們添加到您的應用程序時實施。

ID將是您添加該人時生成的唯一編號。如果您的應用程序使用數據庫,則可以將Person表設置爲爲您自動生成此值。

A List這些會做,雖然對於演員你需要存儲角色名稱和演員的名字。

+0

謝謝克里斯。什麼是ID會包含?我不確定。 – 2009-12-28 19:03:52

1
  1. 我一定會看看內置的List List。他們有一些內置的有用功能,並且經過了很好的測試。
  2. 您應該爲這些類型定義一個類型,因爲它會使代碼更加清晰,並且可以輕鬆實現未來的增強。
  3. 我沒有看到導演或演員的具體屬性,他們只是人。所以我只需要一個Person類,即單獨Movie類中的Field Director或Actor類型。這也優雅地解決了演員和導演同時出現的問題。

PS:這看起來像的OO中的書籍的那些第一示例的一個:-)

+0

THANKs#3很好。我詢問了名單,因爲我擔心名單會很短。我不會包括每一個演員,但主要的演員。所以大多數電影都不到10。所以認爲這可能是一個開銷。 – 2009-12-28 19:05:20

2

1.我喜歡和AddXXX/RemoveXXX方法一起暴露ReadOnlyCollection<>。您使用IList<>private種子收集; add/remove方法修改內部列表,然後將其反映在外部只讀列表中。

2.DirectorActor都是實體,這意味着它們存在一段時間。他們可以在很多地方被引用,而不需要在這些地方,類似於某人可以在你沒有進入房間的情況下與你交談。使用string的多個實例通過將不同的實例等同於相同的實體來打破這些類比。我可以改變我的名字,但我仍然是同一個人;這與string名稱不一致。

由於沒有DirectorActor之間的區別,你可能只需要你Movie對象命名DirectorsActorsPerson,然後集合。

+0

謝謝好主意。但是對於#1,你的意思是你修改ReadOnlyCollection?我以前沒有用過,所以它不是一成不變的? – 2009-12-28 19:12:42

+1

一個ReadOnlyCollection是不變的,但只包裝現有的集合這反而是可變的:如在原崗位指定,您將有持續的情況下,私人列表實例,但隨後你會暴露一個ReadOnlyCollection到的用戶你的類,以防止不安全的更改集合,並提供一些專門的方法來做到這一點(AddXXX,RemoveXXX等)。 – LorenzCK 2009-12-28 19:36:05

+1

@Lck感謝您的澄清。在'AddXXX' /'RemoveXXX'方法背後的主要思想是,包含實體在其子執行操作,而不是暴露於外部消費修改列表。這使您可以從問題域爲這些操作提供有意義的名稱,並控制數據修改。 – 2009-12-28 20:28:29

0

我推薦使用類型系統,爲PersonActorDirector作爲子類型。這樣你就可以在演員和導演上擁有可用作有用數據快捷方式的集合。喜歡的東西:

public class Actor : Person 
{ 
    //Name and whatnot inherits from Person 
    public List<Movie> PerformedIn 
    { 
     get 
     { 
      return myGlobalMovieList.Where(movie=>movie.Actors.Contains(this.Name)); 
     } 
    } 
} 

這讓你很輕鬆地拿到一個演員一直在一旦有演員的所有電影的列表,所以如果有人說,你的應用中搜索湯姆·克魯斯,你可以加載「Tom Cruise」演員對象,如果有人要點擊「Show All Movies For This Actor」按鈕,只需引用TomCruise.PerformedIn屬性,然後就可以開始了!

+0

這也很有趣。謝謝。 – 2009-12-28 19:20:02

+0

你還需要考慮一個人是否可以兼任演員和導演?像這樣實施將使這不可能。 – markt 2009-12-28 19:23:18

+0

是的,它可以是兩個。像Braveheart的梅爾吉布森一樣。 – 2009-12-28 19:30:15

2

如果您的XML中演員和導演名單的目的是識別演員/導演,那麼我將專注於識別的形式,而不是用什麼樣的類層次結構來表示引用的身份。例如,郵寄名單 - 郵寄名單不會集中在建築類型上,而是集中精力提供一張表格來確定位置。

這同樣可能適用於這裏,尤其是因爲它聽起來像你不是(也可能不應該)直接在你的電影元素中聲明你的演員/導演'人'的屬性。

相反,它聽起來像你真正想要的電影元素是一個可以用來交叉引用一個人的標識。

使用的標識形式取決於您,但是用於包含人員全名的字符串可能就足夠了。當然還有無數其他選擇可以選擇......例如你可以使用分裂成Forename,姓氏,中間初始組件的'Name'結構,或者你可以使用唯一的整數ID(假設你使用這個ID來查找具有名稱屬性等的Person對象)。

下面是XML結構的例子,假設你是兩個人都和電影存儲在單個文檔中:

<yourDocument> 
    <movies> 
     <movie id="Bladerunner"> 
     <actorRoles> 
      <actorRole id="Rutger Hauer" character="Roy Batty"/> 
      <actorRole id="Harrison Ford" charactor="Rick Deckard"/> 
     </actorRoles> 
     <directorRoles> 
      <directorRole id="Ridley Scott" category="Principle"/> 
      <directorRole id="Jordan Cronenweth" category="Cinematography"/> 
     </directorRoles> 
     </movie> 
     <movie id="The Room"> 
     <actorRoles> 
      <actorRole id="Rutger Hauer" character="Harry"/> 
     </actorRoles> 
     <directorRoles> 
      <directorRole id="Rutger Hauer" category="codirector"/> 
      <directorRole id="Erik Lieshout" category="codirector"/> 
     </directorRoles> 
     </movie> 
    </movies> 

    <persons> 
     <person id="Ridley Scott"> 
     <nationality>English</nationality> 
     <birth>11/30/1937</birth> 
     </person> 
     <person id="Harrison Ford"> 
     <nationality>American</nationality> 
     <birth>7/13/1942</birth> 
     </person> 
     <person id="Rutger Hauer"> 
     <nationality>Dutch</nationality> 
     <birth>1/23/1944</birth> 
     </person> 
     <person id="Jordan Cronenweth"> 
     <nationality>American</nationality> 
     <birth>2/20/1935</birth> 
     </person 
    </persons> 
</yourDocument> 

明白我的意思嗎?

你真正擁有的是使用ID的交叉參考人對象的演員和導演的角色 - 你可能只是一個名稱屬性一樣輕鬆添加到人對象,並使用唯一的整數ID來交叉引用您的Person對象你在哪裏然後可以檢索他們的名字和任何其他財產。(採用獨特的非變化的整數ID也將允許更新一個人的名字,而不會造成問題的交叉引用的支持)

因爲有可能是不常見到的演員和導演角色的任何屬性,我可能會避免爲「角色」設置基類。連續

+0

我認爲這樣做最有意義 - 演員,導演更像角色。這是非常靈活的,並容易允許多個角色和未來的擴展.. – markt 2009-12-30 07:53:09