Нужен совет по правильному дизайну класса - PullRequest
7 голосов
/ 17 октября 2010

Я должен написать простую систему бронирования фильмов, которая позволяет заказчику бронировать фильмы.Кинотеатр состоит из разных театров, с разным количеством посадочных мест, ценой и киносеансами.Пользователь должен иметь возможность ввести свое имя и другие учетные данные, а затем сделать заказ на 1 или более фильмов и мест.Когда он завершит бронирование, система должна вывести квитанцию, указав его имя, фильм (ы), время (а) показа и номер бронирования.

Я пытался следовать принципам ООП как можно лучше для моих текущих возможностей.

Классы, которые я настроил, будут следующими:

  • CinemaBooking -> точка входа в программу
  • Комната -> получает свой размер сидения через [ряд][col]
  • Movie -> имеет movietitle, shwotime, комнату и цену.
  • Клиент -> должен хранить любую информацию о пользователе, такую ​​как имя, адрес электронной почты и телефон, и генерировать
    номер бронирования

Я немного не уверен в том, куда поместить пользователя-я /o в этом случае: должно ли оно оставаться в CinemaBooking, или я должен создать отдельный класс, который выполняет только ввод-вывод?Или я должен просто переместить весь материал ввода / вывода в другой класс (например, в класс клиента)?

Ответы [ 4 ]

6 голосов
/ 17 октября 2010

Есть много советов, которые я дам, я дам только самые важные.

Во-первых, основная идея ООП заключалась в том, чтобы соответствовать реальному миру, поэтому лучше сделать ваши классы максимально приближенными к реальным объектам.Создайте класс бронирования, который будет просто эквивалентом билета, а не точкой входа в программу.Т.е. он будет содержать информацию о пользователе, театре, месте и стоимости.Создайте класс Театр, который будет содержать количество мест (не ряды х столбцы - некоторые места могут быть зарезервированы, некоторые могут быть разбиты, а некоторые театры просто не имеют квадратной структуры).В качестве альтернативы, поскольку в одном театре может быть несколько комнат, вы можете создать класс Room, который будет иметь свойство «места», а затем добавить комнаты в театр.Также создайте класс Movie.Фильмы и Театры / Комнаты будут ссылаться друг на друга: фильм будет содержать список театров, в которых он показан, а театр будет иметь список фильмов, которые он показывает.Затем создайте класс Seance, который будет содержать время и фильм.Создавайте класс Customer только в том случае, если вы позже будете работать с этим клиентом и захотите сохранить его атрибуты (имя, историю бронирований и т. Д.).Иначе нет смысла создавать еще один класс.Это ваша модель .Классы могут очень немного, но если у вас есть основная идея, это не будет проблемой.

Во-вторых, создайте класс BookingSystem, который будет обобщать функциональность всех предыдущих классов.Это будет реализация шаблона проектирования фасада , и она действительно упростит доступ к вашей подсистеме бронирования.

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

Наконец, создайте основной класс программы.Вы можете дать ему то же имя, что и сама программа.Этот будет просто контролировать поток программы от просмотра к моделям и обратно.Итак, эта часть называется контроллер , а общая идея известна как модель модель-представление-контроллер .

3 голосов
/ 17 октября 2010

Всякий раз, когда я делаю урок, в нем есть следующее: -

  1. Все переменные экземпляра имеют значение private.

  2. Реализация геттеров и сеттеров.

  3. Реализация метода toString ().

Если вы используете Eclipse, это поможет вам автоматически реализовать эти методы. Просто введите переменные экземпляра, щелкните правой кнопкой мыши в редакторе -> Source -> Generate getter and setters.

2 голосов
/ 17 октября 2010

На самом деле, билет не будет содержать информацию о месте в театре пользователя или его стоимости.Он будет содержать ссылки на другие объекты: Пользователь, Театр, Стоимость мест.

Вам понадобится o0ne класс типа «manager», который будет содержать остальную часть программы: это может быть BookingApp, у которого есть main ().Я согласен, что пока не очень беспокоюсь об интерфейсе, но НЕ печатайте на терминале из классов Domain.Используйте toString () для проверки содержимого объекта, но метод main () должен вызвать getters для других классов и создать выходные данные.Очень плохая идея и форма иметь классы домена, пишущие непосредственно в пользовательский интерфейс.Итак, у вас есть Театр, Пользователь, Место, Билет, Цена.Рассмотрим зависимости.Я полагаю, что сиденье привязано к театру, а цена зависит от театра и места.Начните с вещей и нарисуйте линии между ними, чтобы показать, как они будут общаться или ссылаться друг на друга.Например, предоставленный Пользователем, найти все свои билеты - от билетов найти место и от места найти театр.Затем добавьте атрибуты (частные, как сказал JavaGeek).Начните с малого.Возможно только Театры и Места.Получите это на работу, затем добавьте следующий класс.Добавляйте в свой дизайн постепенно и итеративно.НЕ пытайтесь написать и скомпилировать все сразу.Я предлагаю книгу Питера Коада по Java Design (очень дешёвую и очень хорошую) как хорошее введение в дизайн Java.

2 голосов
/ 17 октября 2010

Запись методов toString () для всех классов. Беспокойство о вводе / выводе позже. Получите отношения правильно сначала. I / O - это наименьшее из ваших беспокойств.

...