Как я должен "строить" вещи теперь, когда я реализовал полиморфизм? (Java, сим игра) - PullRequest
1 голос
/ 03 августа 2009

Я работаю над небольшой Java-игрой, которая является своего рода клоном игровой тематической больницы 1995 года. Недавно я работал над графическим интерфейсом и структурой уровней, теперь у меня есть поиск пути и сетка. Мой нынешний способ «строить вещи» состоит из одной комнаты и одной стойки регистрации, и пока все работает нормально, но мне нужно реализовать способ добавления разных типов комнат и предметов. Вот мой текущий код на нажатие кнопки для создания объекта (http://snipt.org/lUm).

Я уверен, что должен быть лучший способ сделать это! Моя реализация плохая, я знаю, но я только недавно начал понимать, как использовать абстрактные классы и интерфейсы.

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

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

Заранее спасибо за ваше время и мысли!

Ответы [ 4 ]

3 голосов
/ 03 августа 2009

Проверьте фабричный шаблон . Фабрика - это средство создания объектов путем предоставления параметров и возврата объектов, которые придерживаются общего интерфейса. Реализация, однако, определяется фабрикой. Код вызова не должен знать это.

Инкапсулируя конструкцию объекта в другом объекте (фабрике), механизм выбора конкретного объекта для построения абстрагируется от вызывающего кода. Вы можете легко предоставить дополнительные подклассы позднее, только изменив саму фабрику.

Итак, в вашем примере кода метод buildMe() является формой фабрики. Требуется некоторый параметр, определяющий, что требуется для сборки - Room или ReceptionDesk. Оба они будут реализовывать один и тот же интерфейс (a HospitalComponent?), А вызывающий код будет помещать этот компонент в больницу. Вы можете добавить дополнительные подклассы HospitalComponent к фабрике (OperatingTheatre?), И код вызова не должен изменяться.

Стоит изучить шаблоны проектирования (в этом сценарии ознакомьтесь с этим списком шаблонов создания ), чтобы понять различные способы использования объектов для решения общих проблем и способы общения ваши решения с другими людьми. Книга Gang-of-Four является библией для этого предмета.

1 голос
/ 03 августа 2009

Полиморфизм может быть излишним для того, что вы делаете.

Лично у меня был бы класс Room с таблицей значений для каждого здания (максимальный размер, стоимость плитки и т. Д.). Затем, когда вы строите новую комнату, получите соответствующую запись в таблице и создайте объект Room с подробностями из таблицы.

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

0 голосов
/ 03 августа 2009

Я бы тщательно подумал, прежде чем моделировать эту проблему с полиморфизмом.

Вопрос в том, какое принципиально различное поведение будет демонстрировать каждый тип комнаты? Что общего между всеми ними?

Полиморфизм не всегда является ответом. Композиция иногда может сделать вещи более гибкими. Решение, управляемое данными, как было рекомендовано ранее, может быть лучше.

0 голосов
/ 03 августа 2009

Теперь у вас есть один класс с кучей статических функций. Это не очень ООП - класс - это просто способ сгруппировать все функции в один файл.

Если вы пойдете по маршруту ООП, вам понадобится базовый класс Room, тогда дочерние классы Room - OperatingRoom, ReceptionistDesk, Ванная, Офис (для персонала), MRIRoom, WaitingRoom и, возможно, даже Hall.

public class Room {
    protected int width, length;  //how many squares wide/long the room is

    protected int x, y;  //where it is on the gride

    protected float buildingProgress;  //how far construction has come

    protected bool isReady;  //is the building ready for use?

    protected Person occupants[];  //some list/array of people currently in the room

    protected Person resident;  //the person 'in charge' in the room--the receptionist, manager, MRI technician, etc etc.
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...