2009-04-19 8 views
91

Diseñar un estacionamiento de OO. ¿Qué clases y funciones tendrá? Debería decir, lleno, vacío y también ser capaz de encontrar un lugar para el estacionamiento con valet. El lote tiene 3 tipos diferentes de estacionamiento: regular, para discapacitados y compacto.Amazon Entrevista Pregunta: Diseñar un estacionamiento de OO

Gracias!

+35

¿Saltaste y exclamas "¿qué tiene esto que ver con los libros?" y salir de la tormenta? –

+0

Me lo preguntó un tipo que pasó a otra situación. Cuando utilicé un patrón de Gang of Four casi textual, dijo "Al menos conoces el polimorfismo". Luego me dieron las gracias por venir y me dijeron que me avisarían. No estaba impresionado. –

+0

¿No es este problema de gestión de memoria? –

Respuesta

129

Aquí es una guía de inicio rápido para obtener los engranajes girando ...

ParkingLot es una clase.

ParkingSpace es una clase.

ParkingSpace tiene una entrada.

Entrance tiene una ubicación o más específicamente, la distancia de Entrance.

ParkingLotSign es una clase.

ParkingLot tiene un ParkingLotSign.

ParkingLot tiene un número finito de ParkingSpaces.

HandicappedParkingSpace es una subclase de ParkingSpace.

RegularParkingSpace es una subclase de ParkingSpace.

CompactParkingSpace es una subclase de ParkingSpace.

ParkingLot guarda un conjunto de espacios de estacionamiento, y una variedad separada de espacios de estacionamiento vacantes en orden de distancia desde su entrada.

ParkingLotSign se puede contar para mostrar "completa", o "vacío", o "blanco/normales/parcialmente ocupado" llamando, Full(), .Empty() o .Normal()

Parker es una clase.

Parker can Park().

Parker puede Unpark().

Valet es una subclase de Parker que puede llamar a ParkingLot.FindVacantSpaceNearestEntrance(), que devuelve un ParkingSpace.

Parker tiene un ParkingSpace.

Parker puede llamar a ParkingSpace.Take() y ParkingSpace.Vacate().

Parker llama a Entrance.Entering() y Entrance.Exiting() y ParkingSpace notifica a ParkingLot cuando se toma o se desocupa para que ParkingLot pueda determinar si está lleno o no. Si está recién lleno o recientemente vacío o no está lleno o vacío recientemente, debería cambiar el ParkingLotSign.Full() o ParkingLotSign.Empty() o ParkingLotSign.Normal().

HandicappedParker podría ser una subclase de Parker y CompactParker, una subclase de Parker y RegularParker, una subclase de Parker. (podría ser una exageración, de hecho.)

En esta solución, es posible que se cambie el nombre de Parker a Automóvil.

+19

Por favor, no olvide el automóvil. – ojblass

+4

¿Por qué ParkingSpace tiene que ser una clase? No veo ninguna necesidad de crear un objeto para ello? En todo momento, cualquier espacio de estacionamiento debe ser discapacitado, regular o compacto. ParkingSpace debería ser una interfaz más bien. –

+8

Probablemente podemos agregar pisos al estacionamiento. – Barry

5

En un estacionamiento orientado a objetos, no habrá necesidad de asistentes porque los autos "sabrán cómo aparcar".

Encontrar un auto utilizable en el lote será difícil; los modelos más comunes tendrán todas sus partes móviles expuestas como variables de miembros públicos, o serán autos "completamente encapsulados" sin ventanas ni puertas.

Las plazas de aparcamiento en el estacionamiento OO no coincidirá con el tamaño y forma de los coches (un "desajuste impediance" entre los espacios y los coches) etiquetas

licencia en nuestro lote tendrá un punto entre cada uno letra y dígito. El estacionamiento para discapacitados solo estará disponible para las licencias que comiencen con "_", y las licencias que comiencen con "m_" serán remolcadas.

4

necesita un estacionamiento, que contiene una matriz multidimensional (especificada en el constructor) de un tipo "espacio". El estacionamiento puede realizar un seguimiento de cuántos espacios se toman mediante llamadas a funciones que llenan y vacian espacios. El espacio puede contener un tipo enumerado que indique el tipo de espacio que es. Space también tiene un método tomado(). para el servicio de aparcacoches, busque el primer espacio que esté abierto y coloque el automóvil allí. También necesitará un objeto de automóvil para poner en el espacio, que se mantenga si es un vehículo para discapacitados, compacto o regular.


class ParkingLot 
{ 
    Space[][] spaces; 

    ParkingLot(wide, long); // constructor 

    FindOpenSpace(TypeOfCar); // find first open space where type matches 
} 

enum TypeOfSpace = {compact, handicapped, regular }; 
enum TypeOfCar = {compact, handicapped, regular }; 

class Space 
{ 
    TypeOfSpace type; 
    bool empty; 
    // gets and sets here 
    // make sure car type 
} 

class car 
{ 
    TypeOfCar type; 
} 
 
10

Los modelos no existen de forma aislada. Las estructuras que definiría para una simulación de automóviles que ingresan en un estacionamiento, un sistema integrado que lo guíe a un espacio libre, un sistema de facturación de estacionamiento de automóviles o para las puertas automáticas/máquinas expendedoras de boletos habituales en los aparcamientos son todas diferentes.

50
public class ParkingLot 
{ 
    Vector<ParkingSpace> vacantParkingSpaces = null; 
    Vector<ParkingSpace> fullParkingSpaces = null; 

    int parkingSpaceCount = 0; 

    boolean isFull; 
    boolean isEmpty; 

    ParkingSpace findNearestVacant(ParkingType type) 
    { 
     Iterator<ParkingSpace> itr = vacantParkingSpaces.iterator(); 

     while(itr.hasNext()) 
     { 
      ParkingSpace parkingSpace = itr.next(); 

      if(parkingSpace.parkingType == type) 
      { 
       return parkingSpace; 
      } 
     } 
     return null; 
    } 

    void parkVehicle(ParkingType type, Vehicle vehicle) 
    { 
     if(!isFull()) 
     { 
      ParkingSpace parkingSpace = findNearestVacant(type); 

      if(parkingSpace != null) 
      { 
       parkingSpace.vehicle = vehicle; 
       parkingSpace.isVacant = false; 

       vacantParkingSpaces.remove(parkingSpace); 
       fullParkingSpaces.add(parkingSpace); 

       if(fullParkingSpaces.size() == parkingSpaceCount) 
        isFull = true; 

       isEmpty = false; 
      } 
     } 
    } 

    void releaseVehicle(Vehicle vehicle) 
    { 
     if(!isEmpty()) 
     { 
      Iterator<ParkingSpace> itr = fullParkingSpaces.iterator(); 

      while(itr.hasNext()) 
      { 
       ParkingSpace parkingSpace = itr.next(); 

       if(parkingSpace.vehicle.equals(vehicle)) 
       { 
        fullParkingSpaces.remove(parkingSpace); 
        vacantParkingSpaces.add(parkingSpace); 

        parkingSpace.isVacant = true; 
        parkingSpace.vehicle = null; 

        if(vacantParkingSpaces.size() == parkingSpaceCount) 
         isEmpty = true; 

        isFull = false; 
       } 
      } 
     } 
    } 

    boolean isFull() 
    { 
     return isFull; 
    } 

    boolean isEmpty() 
    { 
     return isEmpty; 
    } 
} 

public class ParkingSpace 
{ 
    boolean isVacant; 
    Vehicle vehicle; 
    ParkingType parkingType; 
    int distance; 
} 

public class Vehicle 
{ 
    int num; 
} 

public enum ParkingType 
{ 
    REGULAR, 
    HANDICAPPED, 
    COMPACT, 
    MAX_PARKING_TYPE, 
} 
+2

Utilice HashMap en lugar de listas con número de vehículo como clave para la eficacia – user3716835

+4

Después de liberar el vehículo, 'vacantParkingSpaces' ya no está ordenado. Tienes que ordenarlo para que 'findNearestVacant' devuelva el espacio de estacionamiento más cercano. – laike9m

+0

¿Por qué la función se llama 'findNearestVacant', cuando su implementación solo encuentra un espacio vacante, no necesariamente el más cercano? ¿Por qué no "findVacant"? Aunque hubiera sido bueno devolver el espacio "más cercano", usando algunos estados almacenados en la clase. Tal vez, podemos almacenar las distancias desde la "entrada" y "salir" en la clase "espacio" para que también se pueda calcular "más cercano" O podemos simplemente las coordenadas del espacio, de modo que las distancias desde todas las entradas y las salidas se pueden calcular según la necesidad. – Nawaz

Cuestiones relacionadas