2012-02-09 1 views
0

The question is actually derived from this link.Как реорганизовать этот код так, чтобы он соответствовал принципу Open-Close?

Пусть у меня есть проблемы, как это:


книга-магазин покупает и продает два типа книг: (1) Нетехническое {Названия, Автор, Цена} (2) Технический {Название, Автор, Цена, CD}

Также клиент получает компакт-диск, когда покупает техническую книгу. Объект CD определяется как CD (Название, Цена).

Цена нетехнической книги будет только ценой книги. Цена технической книги будет представлять собой сумму стоимости книги и компакт-диска.

Создать C# программу, чтобы показать следующую информацию:

Total number of book Bought & Price: XXX & XXX.XX 
Total number of book Sold & Price: XXX & XXX.XX 
Total Technical Book Sold & Price: XXX & XXX.XX 
Total Non-technical Book sold & Price: XXX & XXX.XX 

abstract class Publication 
{ 
    public virtual string Title { get; set; } 
    public virtual double Price { get; set; } 
} 

class CD : Publication 
{ 
} 

abstract class Book : Publication 
{ 
    public virtual string Author { get; set; } 
} 

class TechnicalBook : Book 
{ 
    public CD Cd { get; set; } 
    public override double Price 
    { 
     get 
     { 
      return (base.Price + Cd.Price); 
     } 
    } 
} 

class NonTechnicalbook : Book 
{ 
} 

class Shop 
{ 
    private IDictionary<string, Book> boughtDictionary; 
    private IDictionary<string, Book> soldDictionary; 

    public Shop() 
    { 
     boughtDictionary = new Dictionary<string, Book>(); 
     soldDictionary = new Dictionary<string, Book>(); 
    } 

    public virtual void Buy(Book item) 
    { 
     boughtDictionary.Add(item.Title, item); 
    } 

    public virtual void Sell(string title) 
    { 
     Book book = boughtDictionary[title]; 
     boughtDictionary.Remove(book.Title); 
     soldDictionary.Add(book.Title, book); 
    } 

    public virtual int GetBoughtBookCount() 
    { 
     return boughtDictionary.Count; 
    } 

    public virtual double GetBoughtBookPrice() 
    { 
     double price = 0.0; 

     foreach (string title in boughtDictionary.Keys) 
     { 
      price = price + boughtDictionary[title].Price; 
     } 
    } 

    public virtual int GetSoldBookCount() 
    { 
     return boughtDictionary.Count; 
    } 

    public virtual double GetSoldBookPrice() 
    { 
     double price = 0.0; 

     foreach (string title in soldDictionary.Keys) 
     { 
      price = price + soldDictionary[title].Price; 
     } 
    } 

    public virtual double GetTotalBookCount() 
    { 
     return this.GetBoughtBookCount() + this.GetSoldBookCount(); 
    } 

    public virtual double GetTotalBookPrice() 
    { 
     return this.GetBoughtBookPrice() + this.GetSoldBookPrice(); 
    } 

    public virtual void Show() 
    { 
     Console.WriteLine("Total number of books Bought & Price: ", this.GetTotalBookCount() + " & " + this.GetTotalBookPrice()); 
     Console.WriteLine("Total number of books Sold & Price: ", this.GetSoldBookCount() + " & " + this.GetSoldBookPrice()); 
    } 
} 

Как показать цены технических и нетехнических книг, сохраняя при этом принцип Открыт-Закрыт?

Получение класса Shop не имеет никакого смысла.

Если я код так:

if(book is TechnicalBook) { 
    // ... 
} else if(book is NonTechnicalBook) { 
    // ... 
} 

Я не думаю, что он держит OCP.

Тогда что делать?

ответ

0

вы можете иметь метод

getTotal(Option op) 

где Option является delagte, который берет книгу и возвращает истину, если она соответствует вашим критериям, в вашем случае, если книга TechnicalBook или NonTechnicalBook.

getTotal Метод будет охватывать все книги, суммируя только те, что делегат Option возвращает true. и возврата суммы.

надеюсь, что это то, что вы имели в виду.