Моделирование лифта с использованием объектно-ориентированного анализа и проектирования

Существует ряд вопросов, которые, как представляется, обычно используются в интервью и классах, когда речь идет об объектно-ориентированном проектировании и анализе. Это один из них; к сожалению, мой профессор ООП в колледже никогда не давал ответа на него, и поэтому мне было интересно.

Проблема заключается в следующем: создать базовый набор объектов/методов, которые будут использоваться для имитации банка лифта. Каковы объекты и их атрибуты/методы?

Ради аргумента, допустим, что у нашего здания двадцать этажей; нижний этаж - вестибюль, а второй этаж соединяется с гаражом (поэтому люди будут выходить/выходить из здания на нижнем этаже или на втором этаже). Существует один лифт, обслуживающий все этажи; в лифтовой шахте есть три шахты лифта и один лифт на вал.

Каким будет правильный способ моделирования этого в объектно-ориентированной модели?

Ответ 1

Сначала есть класс лифта. Он имеет направление (вверх, вниз, стоять, обслуживание), текущий этаж и список запросов на пол, отсортированных в направлении. Он получает запрос от этого лифта.

Тогда есть банк. Он содержит лифты и принимает запросы с этажей. Они запланированы для всех активных лифтов (не в обслуживании).

Планирование будет выглядеть следующим образом:

  • если доступно, выберите стоящий лифт для этого этажа.
  • еще выберите лифт, перемещающийся на этот этаж.
  • еще выберите стоящий лифт на другом этаже.
  • еще выберите лифт с наименьшей нагрузкой.

Каждый лифт имеет набор состояний.

  • Техническое обслуживание: лифт не реагирует на внешние сигналы (только на собственные сигналы).
  • Стенд: лифт закреплен на полу. Если он получает вызов. И лифт на том этаже, двери открыты. Если он находится на другом этаже, он перемещается в этом направлении.
  • Вверх: лифт поднимается вверх. Каждый раз, когда он достигает пола, он проверяет, нужно ли останавливаться. Если это так, он останавливается и открывает двери. Он ждет определенное количество времени и закрывает дверь (если только что-то не проходит через них, а затем удаляет пол из списка запросов и проверяет, есть ли другой запрос. Если тогда лифт снова начинает двигаться, если он не входит в государственный стенд.
  • Вниз: как вверх, но в обратном направлении.

Есть дополнительные сигналы:

  • сигнал тревоги. Лифт останавливается. И если он находится на полу, двери открываются, список запросов очищается, запросы возвращаются в банк.
  • дверь открыта. Открывает двери, если лифт находится на полу и не двигается.
  • закрывается дверь. Закрыли дверь, если они открыты.

EDIT: Некоторые лифты не начинаются снизу /first _floor esp. в случае небоскребов.

min_floor и max_floor - два дополнительных атрибута для лифта.

Ответ 2

Я видел много вариантов этой проблемы. Одно из основных отличий (которое определяет трудность) заключается в том, есть ли какая-то централизованная попытка иметь "умную и эффективную систему", которая бы имела балансировку нагрузки (например, отправлять более холостые лифты в лобби утром). Если это так, дизайн будет включать в себя целую подсистему с действительно забавным дизайном.

Полная конструкция, очевидно, слишком много, чтобы присутствовать здесь, и есть много вариантов. Широта также не ясна. В интервью они попытаются выяснить, как вы думаете. Однако это некоторые из вещей, которые вам понадобятся:

  • Представление центрального контроллера (предполагается, что оно есть).

  • Представления лифтов

  • Представления интерфейсных блоков лифта (они могут отличаться от лифт до лифта). Очевидно, также кнопки вызова на каждом этаже и т.д.

  • Представления стрелок или индикаторов на каждом этаже (почти "вид" модели лифта).

  • Представление человека и груза (может быть важно для факторинга при максимальных нагрузках)

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

Ответ 3

Дональд Кнут Искусство компьютерного программирования Vol.1 демонстрирует лифт и структуры данных. Кнут представляет собой очень подробное обсуждение и программу.

Кнут (1997) "Информационные структуры", "Искусство компьютерного программирования". 1 pp.302-308

Ответ 4

См:

Lu Luo, A UML Documentation for a Elevator System
Distributed Embedded Systems, Fall 2000
Ph.D. Project Report
Carneghie Mellon University

ссылка

Ответ 6

Следует учитывать, что Проектирование системы лифта,

Elevator
Floor/Location Identifier
Number of steps
Rotation speed
Daterange
InstallationDate
MaintainenceDate
Department Identifier
AllowedWeight
Detail / Description
Poison Ratio (Statistics)
Start
Stop
SetDirection
SetRotationSpeed
EmergencyStop = Stop + Alert
EmergencyAccidentSenser Handler

Каждое нажатие кнопки приводит к запросу лифта, который должен быть подан. Каждый из этих запросов отслеживается в глобальном месте

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

Ответ 7

Главное, о чем нужно беспокоиться, - как бы вы уведомили лифт о необходимости двигаться вверх или вниз. а также если у вас будет централизованный класс для управления этим поведением и как вы можете распределить элемент управления.

Кажется, это может быть очень просто или очень сложно. Если мы не возьмем concurrency или время для лифта, чтобы добраться до одного места, то кажется, что это будет просто, так как нам просто нужно проверить состояние лифта, например, двигаться вверх или вниз или стоять все еще. Но если мы сделаем "Лифт" Runnable и постоянно проверяем и синхронизируем очередь (linkedList). Класс Controller назначит, какой этаж будет в очереди. Когда очередь пуста, метод run() будет ждать (queue.wait()), когда пол назначен этому элементу, он вызовет queue.notify(), чтобы разбудить метод run() и запустить ( ) вызовет goToFloor (queue.pop()). Это сделает проблему слишком сложной. Я попытался написать его на бумаге, но не думаю, что это работает. Похоже, нам не нужно принимать во внимание concurrency или временную проблему, но нам нужно как-то использовать очередь для распространения элемента управления.

Любое предложение?