Pregunta de la entrevista de Amazon: Diseñe un estacionamiento OO [cerrado]

114

Diseñe un estacionamiento OO. Qué clases y funciones tendrá. Debería decir, lleno, vacío y también poder encontrar un lugar para el servicio de aparcacoches. El lote cuenta con 3 tipos diferentes de estacionamiento: regular, minusválidos y compacto.

¡Gracias!

quemado
fuente
39
¿Saltaste y exclamaste "¿qué tiene esto que ver con los libros?" y salir corriendo?
JP Alioto
Me preguntó eso un tipo que pasó a otra situación. Cuando usé apropiadamente un patrón de cuadrilla de cuatro casi de libro de texto, dijo: "Al menos conoces el polimorfismo". Luego me agradecieron por venir y me dijeron que me lo harían saber. No me impresionó.
David Thornley
¿No es este un problema de gestión de la memoria?
Sanjeev Kumar Dangi
1
Cuando se le hizo esta pregunta, ¿realmente tuvo que escribir las clases y funciones en CollabEdit o simplemente tuvo que hablar sobre ellas?
committedandroider
Échale un vistazo. github.com/shanshaji/parking-lot , espero que ayude
Shan

Respuestas:

159

Aquí hay un comienzo rápido para hacer girar los engranajes ...

ParkingLot es una clase.

ParkingSpace es una clase.

ParkingSpace tiene una entrada.

La entrada tiene una ubicación o, más específicamente, la distancia desde la entrada.

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 mantiene una variedad de ParkingSpaces y una serie separada de ParkingSpaces vacantes en orden de distancia desde su Entrada.

Se puede indicar a ParkingLotSign que muestre "lleno", "vacío" o "en blanco / normal / parcialmente ocupado" llamando a .Full (), .Empty () o .Normal ()

Parker es una clase.

Parker puede aparcar ().

Parker puede desaparcar ().

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 Entrance.Entering () y Entrance.Exiting () y ParkingSpace notifica a ParkingLot cuando está ocupado o desocupado para que ParkingLot pueda determinar si está lleno o no. Si está lleno o vacío recientemente o no está lleno o vacío, debe cambiar 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 exagerado, en realidad).

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

Chris Morley
fuente
32
Por favor, no olvide el coche.
ojblass
5
¿Por qué ParkingSpace tiene que ser una clase? ¿No veo la necesidad de crear un objeto para él? En todo momento, cualquier espacio de estacionamiento debe ser para discapacitados, regular o compacto. ParkingSpace debería ser más bien una interfaz.
name_masked
11
Probablemente podamos agregar pisos al estacionamiento ..
Barry
13
¿Por qué existe la clase ParkingLotSign? ¿No funcionaría un atributo (por ejemplo, bool isFull;)?
Chinmay Nerurkar
3
¿Por qué hacer que la plaza de aparcamiento sea extensible? ¿Por qué no tener un campo isHandicapped y un campo isCompact en el lugar de estacionamiento?
committedandroider
67
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,
}
Srikant Aggarwal
fuente
6
Use HashMap en lugar de listas con el número de vehículo como clave para la eficiencia
sanath_p
5
Después de liberarVehicle, vacantParkingSpacesya no se ordena. Tienes que ordenarlo para que findNearestVacantdevuelva el espacio de estacionamiento más cercano.
laike9m
1
¿Por qué se nombra la función findNearestVacant, cuando su implementación solo encuentra un espacio vacío, 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, podamos almacenar las distancias desde la "entrada" y la "salida" en la clase "espacio" para que el "más cercano" se pueda calcular también O podemos simplemente las coordenadas del espacio, de modo que las distancias desde todas las entradas y las salidas se pueden calcular según sea necesario.
Nawaz
1
Además, la función parkVehicledebe devolver un valor booleano que indique si el vehículo estaba estacionado o no.
Nawaz
Sin cheques nulos.
Lanzará
10

Los modelos no existen de forma aislada. Las estructuras que definiría para una simulación de automóviles que ingresan a un estacionamiento, un sistema integrado que lo guía 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 estacionamientos son todas diferentes.

Pete Kirkham
fuente
6

En un estacionamiento Orientado a Objetos, no habrá necesidad de asistentes porque los autos "sabrán estacionar".

Será difícil encontrar un automóvil utilizable en el lote; 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.

Los espacios de estacionamiento en nuestro estacionamiento OO no coincidirán con el tamaño y la forma de los autos (una "falta de coincidencia de impedancia" entre los espacios y los autos)

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

Paul Keister
fuente
5

necesitaría un estacionamiento, que contenga una matriz multidimensional (especificada en el constructor) de un tipo "espacio". El estacionamiento puede realizar un seguimiento de cuántos espacios se toman a través de llamadas a funciones que llenan y vacían espacios. El espacio puede contener un tipo enumerado que indica qué tipo de espacio es. El espacio también tiene un método tomado (). para el servicio de aparcacoches, busque el primer espacio que esté abierto y coloque el coche allí. También necesitará un objeto de automóvil para colocar en el espacio, ya sea 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;
}

Scott M.
fuente