Интервью с Amazon: спроектируйте автостоянку OO

Создайте автостоянку OO. Какие классы и функции у него есть. Он должен сказать, полный, пустой и также сможет найти место для парковки автомобилей. Участок имеет 3 различных типа парковки: обычные, инвалиды и компактные.

Спасибо!

Ответ 1

Вот быстрый старт для переключения передач...

ParkingLot - это класс.

ParkingSpace - это класс.

В ParkingSpace есть вход.

Вход имеет местоположение или, более конкретно, расстояние от входа.

ParkingLotSign - это класс.

У ParkingLot есть парковкаLotSign.

ParkingLot имеет конечное число парковочных пространств.

HandicappedParkingSpace является подклассом ParkingSpace.

RegularParkingSpace является подклассом ParkingSpace.

CompactParkingSpace является подклассом ParkingSpace.

ParkingLot хранит массив парковочных пространств и отдельный массив вакантных парковок в порядке убывания от его входа.

ПарковкаLotSign может указывать на "полный" или "пустой" или "пустой/нормальный/частично занятый", вызывая .Full(),.Empty() или .Normal()

Паркер - класс.

Паркер может парковать().

Паркер может отменить().

Valet - это подкласс Parker, который может вызвать ParkingLot.FindVacantSpaceNearestEntrance(), который возвращает ParkingSpace.

У Паркера есть парковка.

Паркер может вызвать ParkingSpace.Take() и ParkingSpace.Vacate().

Паркер звонит Entrance.Entering() и Entrance.Exiting() и ParkingSpace уведомляет ParkingLot, когда он взят или освобожден, так что ParkingLot может определить, заполнено или нет. Если он вновь заполнен или вновь пуст или не полностью заполнен или пуст, он должен изменить параметры ParkingLotSign.Full() или ParkingLotSign.Empty() или ParkingLotSign.Normal().

HandicappedParker может быть подклассом Parker и CompactParker подклассами Parker и RegularParker подкласса Parker. (на самом деле может быть чрезмерным.)

В этом решении возможно, что Паркер должен быть переименован в Car.

Ответ 2

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,
}

Ответ 3

Модели не существуют изолированно. Структуры, которые вы определили для моделирования автомобилей, входящих в автостоянку, встроенная система, которая ведет вас к свободному пространству, системе биллинга автостоянки или автоматическим затворам/билетным автоматам, обычным на автостоянках, все разные.

Ответ 4

В объектно-ориентированной автостоянке для обслуживающего персонала не будет необходимости, потому что автомобили "будут знать, как парковать".

Найти пригодный для использования автомобиль на участке будет сложно; наиболее распространенные модели будут либо иметь все движущиеся части, выставленные как переменные открытого члена, либо они будут "полностью инкапсулированы" автомобилями без окон или дверей.

Парковочные места на нашей автостоянке OO не будут соответствовать размеру и форме автомобилей ( "несоответствие сопротивления" между пространствами и автомобилями).

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

Ответ 5

вам понадобится автостоянка, в которой содержится многомерный массив (указанный в конструкторе) типа "пространство". На стоянке можно отслеживать, сколько пробелов выполняется через вызовы функций, которые заполняют и пустые пробелы. В пространстве может храниться перечисляемый тип, который указывает, в каком пространстве он находится. Пространство также имеет метод(). для парковки камердинера, просто найдите первое открытое пространство и поставьте там автомобиль. Вам также понадобится объект "Автомобиль", который будет помещен в пространство, в котором будет находиться ли это автомобиль с ограниченными физическими возможностями, компактный или обычный автомобиль.


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;
}