Modelado de un ascensor utilizando análisis y diseño orientado a objetos [cerrado]

134

Hay un conjunto de preguntas que parecen ser de uso común en entrevistas y clases cuando se trata de diseño y análisis orientado a objetos. Este es uno de ellos; desafortunadamente, mi profesor de OOP en la universidad nunca dio una respuesta, por lo que me he estado preguntando.

El problema es el siguiente: diseñe un conjunto básico de objetos / métodos para simular un banco de ascensores. ¿Cuáles son los objetos y sus atributos / métodos?

En aras de la discusión, supongamos que nuestro edificio tiene veinte pisos; el piso inferior es el vestíbulo, y el segundo piso se conecta con el estacionamiento (por lo tanto, las personas entrarán / saldrán del edificio en el piso inferior o en el segundo piso). Hay un banco de ascensores que da servicio a todos los pisos; Hay tres pozos de ascensor en el banco de ascensores, y un ascensor por pozo.

¿Cuál sería la forma correcta de modelar esto en un modelo orientado a objetos?

Kate Bertelsen
fuente
9
Esta es mi pregunta de entrevista favorita. Es simple de preguntar pero sorprendentemente complejo para acertar. Implica cosas como colas y puede extenderse fácilmente para lanzar más desafíos. Por ejemplo, ¿cómo optimizaría el algoritmo para reducir los tiempos de espera?
Rob Di Marco el
Sí, es una gran pregunta abierta. Nunca me preguntaron eso, desafortunadamente :(
Uri

Respuestas:

165

Primero hay una clase de ascensor. Tiene una dirección (arriba, abajo, soporte, mantenimiento), un piso actual y una lista de solicitudes de piso ordenadas en la dirección. Recibe solicitud de este ascensor.

Entonces hay un banco. Contiene los ascensores y recibe las solicitudes de los pisos. Estos están programados para todos los ascensores activos (no en mantenimiento).

La programación será como:

  • si está disponible, elija un elevador de pie para este piso.
  • De lo contrario, elija un ascensor que se mueva a este piso.
  • De lo contrario, elija un ascensor de pie en otro piso.
  • De lo contrario, elija el ascensor con la carga más baja.

Cada ascensor tiene un conjunto de estados.

  • Mantenimiento: el ascensor no reacciona a las señales externas (solo a sus propias señales).
  • Soporte: el elevador se fija en un piso. Si recibe una llamada. Y el ascensor está en ese piso, las puertas se abren. Si está en otro piso, se mueve en esa dirección.
  • Arriba: el ascensor se mueve hacia arriba. Cada vez que llega al piso, verifica si necesita detenerse. Si es así, se detiene y abre las puertas. Espera una cierta cantidad de tiempo y cierra la puerta (a menos que algo se mueva a través de ellos. Luego elimina el piso de la lista de solicitudes y verifica si hay otra solicitud. De ser así, el elevador comienza a moverse nuevamente. Si no, ingresa al soporte del estado.
  • Abajo: como arriba pero en sentido inverso.

Hay señales adicionales:

  • alarma. El ascensor se detiene. Y si está en el piso, se abren las puertas, se borra la lista de solicitudes y las solicitudes se devuelven al banco.
  • puerta abierta. Abre las puertas si un elevador está en el piso y no se mueve.
  • la puerta se cierra. Cerró la puerta si están abiertos.

EDITAR: Algunos ascensores no comienzan en el fondo / primer_piso esp. en caso de rascacielos.

min_floor y max_floor son dos atributos adicionales para Elevator.

Toon Krijthe
fuente
16
Elevator simulation play.elevatorsaga.com
Samar Panda
1
Parece que a este enfoque de programación le faltan algunas optimizaciones, por ejemplo, si un elevador ya está yendo a un piso donde una persona ha solicitado un elevador, entonces no hay necesidad de programar otro elevador para que venga.
Liron Yahdav
¿La solicitud de recepción y la programación serían síncronas o asíncronas? Si es asíncrono, ¿cómo lo lograríamos?
Rohitashwa Nigam
18

The Art of Computer Programming Vol.1 de Donald Knuth tiene una demostración del elevador y las estructuras de datos. Knuth presenta una discusión y un programa muy completo.

Knuth (1997) "Estructuras de información", El arte de la programación de computadoras vol. 1 págs. 302-308

viña
fuente
9
vinculado a los libros de google anteriores.
vine'th
2
Esta sección del libro describe (en detalles) cómo ejecutar una simulación de ascensor. NO describe cómo modelarlo (de una manera OOP). Pero sí ... ¡gran libro!
usuario7
17

He visto muchas variantes de este problema. Una de las principales diferencias (que determina la dificultad) es si hay algún intento centralizado de tener un "sistema inteligente y eficiente" que tenga un equilibrio de carga (por ejemplo, enviar más ascensores inactivos al lobby por la mañana). Si ese es el caso, el diseño incluirá un subsistema completo con un diseño realmente divertido.

Obviamente, un diseño completo es demasiado para presentar aquí y hay muchas altenativas. La amplitud tampoco está clara. En una entrevista, intentarán descubrir cómo pensarías. Sin embargo, estas son algunas de las cosas que necesitaría:

  1. Representación del controlador central (suponiendo que haya uno).

  2. Representaciones de ascensores

  3. Representaciones de las unidades de interfaz del ascensor (pueden ser diferentes de un ascensor a otro). Obviamente también los botones de llamada en cada piso, etc.

  4. Representaciones de las flechas o indicadores en cada piso (casi una "vista" del modelo de ascensor).

  5. Representación de un humano y carga (puede ser importante para factorizar cargas máximas)

  6. Representación del edificio (en algunos casos, ya que ciertos pisos pueden estar bloqueados a veces, etc.)

Uri
fuente
7

Ver:

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

enlace

Arun
fuente
2

Cosas a tener en cuenta al diseñar el sistema de ascensor,

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

Cada vez que se presiona un botón se genera una solicitud de ascensor que debe ser atendida. Cada una de estas solicitudes se rastrea en un lugar global

El número de ascensores en el edificio será determinado por el usuario. El edificio contendrá un número fijo de pisos. Se fijará la cantidad de pasajeros que pueden caber en el elevador. Los pasajeros serán contados cuando salgan del elevador en su piso de destino. El piso de destino se determinará utilizando un intervalo de Poisson "aleatorio". Cuando todos los pasajeros en el elevador hayan alcanzado sus pisos de destino, el elevador regresará al lobby para recoger más pasajeros.

user2603625
fuente
2

Lo principal de qué preocuparse es cómo notificaría al elevador que necesita moverse hacia arriba o hacia abajo. y también si va a tener una clase centralizada para controlar este comportamiento y cómo podría distribuir el control.

Parece que puede ser muy simple o muy complicado. Si no tomamos la concurrencia o el tiempo para que un elevador llegue a un lugar, entonces parece que será simple ya que solo necesitamos verificar los estados del elevador, como si se mueve hacia arriba o hacia abajo, o si está parado. Pero si hacemos que Elevator implemente Runnable, y constantemente verifiquemos y sincronicemos una cola (LinkedList). Una clase de Controlador asignará a qué piso ir en la cola. Cuando la cola está vacía, el método run () esperará (queue.wait ()), cuando se asigne un piso a este elevador, llamará a queue.notify () para activar el método run () y ejecutar ( ) llamará a goToFloor (queue.pop ()). Esto hará que el problema sea demasiado complicado. Traté de escribirlo en papel, pero no creo que funcione. Parece que realmente no necesitamos tener en cuenta la concurrencia o el problema de tiempo aquí,

¿Cualquier sugerencia?

usuario3216886
fuente