Существует ряд вопросов, которые обычно используются в интервью и на уроках, когда дело доходит до объектно-ориентированного проектирования и анализа. Это один из них; к сожалению, мой профессор ООП в колледже так и не дал ответа, и мне было интересно.
Проблема заключается в следующем: спроектировать базовый набор объектов / методов, которые будут использоваться для моделирования банка лифтов. Каковы объекты и их атрибуты / методы?
Ради аргумента давайте предположим, что наше здание имеет двадцать этажей; нижний этаж - вестибюль, а второй этаж соединен с парковкой (поэтому люди будут входить / выходить из здания на нижнем или втором этаже). Есть один банк лифтов, который обслуживает все этажи; Есть три шахты лифта в банке лифта, и один лифт на шахту.
Каков будет правильный способ моделировать это в объектно-ориентированной модели?
источник
Ответы:
Сначала есть лифт класса. Он имеет направление (вверх, вниз, стенд, обслуживание), текущий этаж и список запросов этажей, отсортированных по направлению. Он получает запрос от этого лифта.
Тогда есть банк. Он содержит лифты и получает запросы от этажей. Они запланированы для всех активных лифтов (не в обслуживании).
Планирование будет таким:
Каждый лифт имеет набор состояний.
Есть дополнительные сигналы:
РЕДАКТИРОВАТЬ: Некоторые лифты не начинаются с нижней / first_floor esp. в случае с небоскребами.
min_floor и max_floor - это два дополнительных атрибута для лифта.
источник
Дональд Кнут, «Искусство компьютерного программирования», том 1, демонстрирует лифт и структуры данных. Кнут представляет очень подробное обсуждение и программу.
Кнут (1997) "Информационные структуры", Искусство компьютерного программирования, вып. 1 с.302-308
источник
Я видел много вариантов этой проблемы. Одно из главных отличий (которое определяет сложность) заключается в том, существует ли какая-то централизованная попытка создать «умную и эффективную систему», которая бы обеспечивала балансировку нагрузки (например, отправлять больше неработающих лифтов в лобби утром). Если это так, то дизайн будет включать в себя целую подсистему с действительно интересным дизайном.
Полный дизайн, очевидно, слишком много, чтобы представить здесь, и есть много альтернатив. Ширина также не ясна. В интервью они попытаются выяснить, как вы думаете. Однако вот некоторые вещи, которые вам понадобятся:
Представление центрального контроллера (при условии, что есть один).
Представления лифтов
Представления интерфейсных блоков лифта (они могут отличаться от лифта к лифту). Очевидно также кнопки вызова на каждом этаже и т. Д.
Изображения стрелок или индикаторов на каждом этаже (почти «вид» модели лифта).
Представление человека и груза (может быть важно для учета максимальных нагрузок)
Представление здания (в некоторых случаях, поскольку некоторые этажи могут быть заблокированы время от времени, и т. Д.)
источник
Видеть:
ссылка на сайт
источник
Подробный ответ:
http://www.angelfire.com/trek/software/elevator.html
источник
Что следует учитывать при проектировании лифтовой системы,
Каждое нажатие кнопки приводит к запросу лифта, который должен быть обслужен. Каждый из этих запросов отслеживается в глобальном месте
Количество лифтов в здании будет определяться пользователем. Здание будет содержать фиксированное количество этажей. Количество пассажиров, которые могут поместиться в лифте, будет фиксированным. Пассажиры будут учтены при выходе из лифта на этаже их назначения. Этаж назначения будет определяться с использованием «случайного» интервала Пуассона. Когда все пассажиры в лифте достигнут этажей своего назначения, лифт вернется в вестибюль, чтобы забрать больше пассажиров
источник
Главное, о чем нужно беспокоиться, это как бы вы уведомили лифт о том, что он должен двигаться вверх или вниз. а также, если вы собираетесь иметь централизованный класс для управления этим поведением и как вы могли бы распределить контроль.
Кажется, что это может быть очень просто или очень сложно. Если мы не берем параллелизм или время, чтобы лифт добирался до одного места, то кажется, что это будет просто, поскольку нам просто нужно проверить состояния лифта, например, движется ли он вверх или вниз или стоит на месте. Но если мы заставим Elevator реализовать Runnable и постоянно проверять и синхронизировать очередь (connectedList). Класс Controller назначит, какой этаж идти в очереди. Когда очередь пуста, метод run () будет ждать (queue.wait ()), когда этаж назначен этому лифту, он вызовет queue.notify (), чтобы разбудить метод run (), и запустить ( ) вызовет метод goToFloor (queue.pop ()). Это сделает проблему слишком сложной. Я пытался написать это на бумаге, но не думаю, что это работает. Кажется, что нам не нужно принимать во внимание проблему параллелизма или синхронизации,
Любое предложение?
источник