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?
fuente
Respuestas:
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:
Cada ascensor tiene un conjunto de estados.
Hay señales adicionales:
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.
fuente
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
fuente
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:
Representación del controlador central (suponiendo que haya uno).
Representaciones de ascensores
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.
Representaciones de las flechas o indicadores en cada piso (casi una "vista" del modelo de ascensor).
Representación de un humano y carga (puede ser importante para factorizar cargas máximas)
Representación del edificio (en algunos casos, ya que ciertos pisos pueden estar bloqueados a veces, etc.)
fuente
Ver:
enlace
fuente
Respuesta detallada:
http://www.angelfire.com/trek/software/elevator.html
fuente
Cosas a tener en cuenta al diseñar el sistema de ascensor,
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.
fuente
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?
fuente