2008-12-09 55 views
2

我有一個UI對話框,如下所示:您必須從列表中選擇一本書。或者,您可以從列表中選擇一個發佈者(另一個類),或者以字符串形式輸入publisher-name。如何在OO中對此進行建模

我想這給了我3種類型作爲對話框的輸出。

  1. 書出版商級
  2. 書出版商串

你將如何在對象進行建模呢?在我看來,擁有一本書的基本類,然後是出版商和出版商名稱的兩個子類是正確的選擇。有沒有其他的選擇,也許有利於組合,可以提供更好的模型?


我會盡量多解釋一下。 一本書不需要有一個發佈者。 發佈者對象與作爲字符串輸入的發佈者名稱不同。

您必須
- 選擇一本書從現有列表

您可以在以下
- 選擇一個出版商從現有列表或
- 您就可以進入發行人名稱的一個或
- 你可以填寫任何關於出版商

回答

1

我會盡量多解釋一下。一本書 不需要有發佈者。 發佈者對象與作爲字符串輸入的 發佈者名稱不同。

您必須 從現有列表 - 選擇一本書

您可以在以下 - 選擇一個出版商從現有列表或 - 您就可以進入發行人名稱中的一個或 - 你可以填什麼關於發佈商

仍然要求定製結果對象。現在,您有三個字段:書籍對象,發佈者對象和發佈者字符串。然後將它傳遞給可以智能處理的代碼。您可以添加方法來解決自定義處理需求。但最終它是THAT對話的專門結果,不應該是書籍或出版商或任何其他對象的某個子字段。

如果這本書沒有什麼,你知道你有一個錯誤,因爲你需要一本書。您還有四種發佈者對象和Publisher_String組合來處理。這表明你需要一個班級專門處理結果。

5

第二個將是我的方法。

我有一個名爲Name的屬性的Publisher類,以及描述發佈者所需的任何其他屬性。

然後,我將有一個書的屬性來描述它的類,以及一個屬性類型發佈者。

如果用戶以字符串形式輸入新的發佈者,請創建一個新的發佈者對象。

如果用戶沒有輸入發佈者,請將該屬性留空。這將滿足書中沒有出版商的條件。或者,您可以讓出版商的名稱爲「無發佈者」,但我認爲這樣做可能會過度避免空值。

+0

忘了告訴Publisher類是相當複雜的,有一些其他的屬性不僅僅是名字。 – Karsten 2008-12-09 20:03:30

1

我不會創建一個Publisher類來繼承Book,因爲 Publisher不是一本書,它是元數據信息一本書。 雖然聖經,會繼承書。

我的建議是在書上創建一個Publisher屬性。 此發佈者可以是IPublishInformation類型, ,並且字符串發佈者可以使用NamedPublisher {string Name}類實現IPublishInformation。

無論如何,這是我的想法!

0

我認爲很難僅基於這個對話框做出設計決定。例如,你是從一組現有書籍中挑選的?在這種情況下,如果用戶輸入不存在的發佈者會怎麼樣?在這種情況下,您可能根本不想返回任何Book類的實例,但會引發某種異常。

您的案例中的所有書籍是否都有發佈者?如果是這樣,那麼我同意@Bob,你可以做一個Publisher類,並有一個Book類包含一個Publisher對象的實例。如果只有一些書有發佈者,那麼你可以使用你描述的繼承模型,但是我會將選項2和3摺疊爲一個選項(再次使用發佈者對象),否則可能會得到兩個相同的實例本書是不同類型的對象(用戶以字符串形式輸入發佈者,以及從列表中選擇一個)。

--Phil

2

從面向對象的角度來看,HAS-A關係,解決這個問題比在這種情況下,IS-A關係要好。一本書HAS-A出版商(1:1)和一個出版商HAS-A出版的書籍清單(1:多)。創建一個Book類,其中包含對發佈者和發佈者類的引用,該類具有對書籍的引用列表。此外,發佈者有-A,你可以用它來查找特定出版商串

2

我必須在最後一段不同意這種說法:

在我看來,該有一本書基類,然後出版商和出版商名稱的兩個子類是正確的選擇。

子類用於表示「是一種」關係。 (舊的疲憊刻板印象是Fruit類,蘋果和Orange是子類。)更實際的例子是帶有Employee類的工資系統,由HourlyEmployee和SalariedEmployee類專門開發。在每種情況下,子類都表示超類中的特定類別。

相比之下,出版商不是一種書。一個更好的模式是擁有一個Book類和一個Publisher類,它們之間有多對一的關係(一本書只有一個發佈者,但一個發佈者可能會生成多本書)。

一本書有許多潛在的屬性,如標題,ISBN,出版商和作者;發佈者的潛在屬性包括公司名稱和地址(可能爲多個地址)以及發佈的書籍列表。

根據您要建模的內容,您可能還需要一個作者類,但這不在原始問題的範圍之內。

0

如果您認爲圖書可以有多個發佈者。然後我會返回兩個BookSelectonResult結果。一個設置爲一本書,另一個設置爲選定的發佈者。這個答案也假定你有一個書類,一個發佈者類和每個類的集合類。

對話框的要點是返回用戶選擇的內容。這是一個獨特的「東西」,值得自己上課。如果你所做的只是返回一本書或一個發佈者,那麼直接使用原始類就行了。但是在這裏你有多種可能的結果,所以需要一個獨特的結果類。

其他的考慮是這個對話是多麼微不足道?例如選擇一個文件名來打開一本書。文件名的存在只是你想要存儲在系統中的圖書的轉瞬即逝。選擇書籍和出版商的結果也是一樣的。如果你有另一個對象來保存結果(比如檢出列表),那麼我建議不要打擾任何特殊的方法或類。將對話框捆綁到一個Command對象中,並將結果返回到對話框類的成員中。然後將結果處理到最終存儲的位置。

在我的CAM軟件中,我經常使用對話框來操作配置選項,而不是使用我精心設計的模型 - 視圖 - 演示者體系結構。我可以逃避這個原因是因爲當用戶點擊一個項目或執行一個動作時,UI控制器執行一個Command對象,然後操作該模型。一切都通過我的設置中的命令對象。因此,對於微不足道的對話,我只是將它們與使用對話框的命令對象捆綁在一起,而不是創建整個MVP圖層。

最終它是一個判斷呼叫。

0

試試這個(C#):

Class Book 
{ 
    public string Name; 
    public List<Publisher> publishers = new List<Publishers>; 

    Book() 
    { 
     // Load publishers array with relevant instances of Publisher class... 
    } 
} 

Class Books 
{ 
    private List<Book> books = new List<Book>; 
    public Books() 
    { 
     // Load books array with all books... 
    } 

    public List<Book> GetBook (string publisher) 
    { 
     List<Book> retVal = new List<Book>; 
     foreach (Book item in books) 
     { 
     if (item.Publisher.Name == publisher) 
     { 
      retVal.Add(item); 
     } 
     } 
    } 

    public List<Book> GetBook (Publisher publisher) 
    { 
     List<Book> retVal = new List<Book>; 
     foreach (Book item in books) 
     { 
     if (item.Publisher.Name == publisher.Name) 
     { 
      retVal.Add(item); 
     } 
     } 
    } 
} 

Class Publisher 
{ 
    public string Name; 
}