Как смоделировать это в ОО

голоса
2

У меня есть UI-диалог что-то вроде этого: Вы должны выбрать книгу из списка. При желании, вы можете либо выбрать издатель (другой класс) из списка или введите имя-издателя в виде строки.

Я думаю, что это дает мне 3 типа в качестве выхода из диалогового окна.

  1. книга
  2. Книга с издателем-класса
  3. книга с издателем струной

Как бы вы модель это в объектах? Мне кажется, что имея книгу базового класса, а затем два подкласса для издателя и имени издателя, является правильным выбором. Существует ли какая-либо альтернатива, возможно, в пользу композиции, которая дала бы лучшую модель?


Я попытаюсь объяснить немного больше. Книга не нужно иметь издателя. Объект издателя не то же самое, как-имя издателя, введенное в виде строки.

Вы должны
-Выберите книгу из существующего списка

Вы можете один из следующих
-Выбери издатель из существующего списка или
-вы могут ввести имя издателя или
-вы не могут заполнить ничего издатель

Задан 09/12/2008 в 20:58
источник пользователем
На других языках...                            


8 ответов

голоса
5

Номер два был бы мой подход.

Я бы класс для Publisher со свойством называется имя, наряду с любыми другими свойствами, необходимыми для описания издателя.

Тогда я бы класс для книги со свойствами, чтобы описать это, наряду со свойством типа Publisher.

Если пользователь вводит новый издатель в виде строки, создать новый объект Publisher.

Если пользователь не вводит издатель, оставьте свойство нуль. Это будет удовлетворять условию, что книга не имеет издателей. В качестве альтернативы, вы можете иметь издатель с названием «Нет издателя», но я думаю, что будет слишком далеко от пути, чтобы избежать аннулирует.

Ответил 09/12/2008 в 21:01
источник пользователем

голоса
2

Я должен согласиться с этим утверждением в последнем абзаце:

Мне кажется, что имея книгу базового класса, а затем два подкласса для издателя и имени издателя, является правильным выбором.

Подклассы используются для представления «является в своем роде, из» отношений. (Старый усталый стереотип класс фрукты, с Apple, и Orange в качестве подклассов.) Более реалистичный пример будет система начисления заработной платы с классом Employee, специализирующийся на HourlyEmployee и SalariedEmployee классов. В каждом случае подкласс представляет собой определенную категорию в пределах суперкласса.

В отличие от этого, издатель не вид книги. Лучше модель будет иметь класс книги и класс Издательства, с многими к одному отношениям между ними (в книге есть один издатель, но издатель может производить несколько книг).

Книга имеет много потенциальных атрибутов, такие как название, ISBN, издатель и автор; потенциальные атрибуты издателя включают название и адрес (возможно, несколько адресов), а также список книг, изданных.

В зависимости от того, что вы пытаетесь модель, вам может понадобиться класс Автор, но это выходит за рамки вашего первоначального вопроса.

Ответил 09/12/2008 в 21:21
источник пользователем

голоса
2

С точки зрения ОО, HAS-A отношения решить эту проблему лучше, чем взаимоотношения IS-A в этом случае. Книга HAS-издатель (1: 1) и издатель-список книг, которые он публикует (1: многие). Создание класса Book, который содержит ссылку на издателе и класс Издательство, который имеет список ссылок на книги. Кроме того, издатель-Строка, которую можно использовать для поиска конкретного издателя

Ответил 09/12/2008 в 21:19
источник пользователем

голоса
1

Я попытаюсь объяснить немного больше. Книга не нужно иметь издателя. Объект издателя не то же самое, как-имя издателя, введенное в виде строки.

Вы должны -Выберите книгу из существующего списка

Вы можете один из следующих -Выбери издатель из существующего списка или -вы могут ввести имя издателя или -вы не могут заполнить ничего издатель

Тем не менее требует настраиваемого объекта результата. Теперь у вас есть три поля Книга объект, Издательство объектов и Издательство String. Затем передать его в код, который может иметь дело с ним разумно. Вы можете добавить методы для удовлетворения потребностей пользовательских обработки. Но в конце концов, это специализированный результат этого диалога и не должно быть каким-то подполом книги или издателя или любого другого объекта.

Если книга не что иное, вы знаете, что вы получили сообщение об ошибке, потому что вам нужна книга. У вас есть четыре комбинации Publisher Object и Publisher_String для решения, а также. Из этого указывает мне, что вам нужен класс, чтобы иметь дело именно с результатом.

Ответил 09/12/2008 в 21:50
источник пользователем

голоса
1

Я бы не создать класс Publisher наследовать книги, поскольку Издательство не книга, это метаданные информация о книге. В Библии , хотя, унаследует книгу.

Мой совет должен был бы создать свойство Publisher на книгу. Это Издательство может быть типа IPublishInformation, а строка издатель может использовать {строка Name} класс NamedPublisher, внедрение IPublishInformation.

Вот мои мысли так или иначе!

Ответил 09/12/2008 в 21:12
источник пользователем

голоса
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;
}
Ответил 09/12/2008 в 22:00
источник пользователем

голоса
0

Если предполагается, что книги могут иметь несколько издателей. Тогда я возвратит BookSelectonResult с двумя приличий. Один комплект к книге и другой набор для выбранного издателя. Этот ответ также предположить, что у вас есть класс книги, класс издателя и класс коллекции для каждого.

Суть диалога является возвращение того, что пользователь выбрал. Это уникальная «вещь», поэтому заслуживает свой собственный класс. Если все, что вы делаете, это вернуть одну книгу или один издатель затем, используя исходный класс непосредственно будет нормально. Но здесь у вас есть несколько возможностей в результатах, так что требует уникального класса результата.

Другое соображение, как тривиальное это диалог? Например выбирая имя файла, чтобы открыть книгу. Существование имени файла мимолетное, что вы хотите, это книга, которая будет храниться в вашей системе. То же самое для результата выбора книги и издателя. Если у вас был другой объект для хранения результата уже (как список проверить), то я предлагаю не заморачиваться с какими-либо специальными методами или классов. Свяжите диалоговое окно в объект Command и просто возвращает результат в элементах диалогового класса. Затем обработать результат, когда они, наконец, сохраняются.

В моем CAM программное обеспечение Я делаю это часто с диалогом, которые манипулируют параметры конфигурации вместо того, чтобы использовать свою сложную архитектуру модель-представление-ведущий. Поэтому я могу уйти с этим, потому что, когда пользователь нажимает на элемент или выполнить действие, контроллер интерфейса выполняет объект Command, который затем манипулирует модель. Все идет через Command Object в моей установке. Так что для тривиальных диалогов я просто связать их с командными объектами, которые используют диалог, а не создавать весь слой MVP.

В конечном счете это решение вызова.

Ответил 09/12/2008 в 21:35
источник пользователем

голоса
0

Я думаю, что это трудно сделать проектное решение на основе только в этом диалоге. Например, вы выбирая из множества существующих книг? В таком случае, что если пользователь вводит издатель, который не существует? В этом случае, вы не можете вернуть экземпляр любого класса Book вообще, но поднять какое-то исключение.

Все ли книги в вашем случае есть издатели? Если это так, то я согласен с @Bob, что вы могли бы сделать класс издателя, и есть класс Книга содержит экземпляр объекта Publisher. Если только некоторые книги имеют Publishers, то вы могли бы пойти с моделью наследования вы описали, но я бы разрушиться варианты 2 и 3 в один выбор (опять-таки с помощью объекта Publisher), так как в противном случае вы могли бы в конечном итоге с двумя экземплярами одного и того же книги, которые являются объектами различных типов (один, где пользователь ввел издатель в виде строки, и один раз, выбирая из списка).

--Фил

Ответил 09/12/2008 в 21:15
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more