Вопрос для собеседования с Amazon: проектирование ОО-стоянки [закрыто]

114

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

Спасибо!

burnt1ce
источник
39
Вы вскочили и воскликнули: "При чем здесь книги?" и штурмовать?
JP Alioto
Меня спросил об этом парень, который попал в другую ситуацию. Когда я надлежащим образом использовал почти хрестоматийный паттерн «Банда четырех», он сказал: «По крайней мере, вы знаете полиморфизм». Затем меня поблагодарили за то, что я пришел, и сказали, что они дадут мне знать. Я не впечатлен.
Дэвид Торнли,
Разве это не проблема с управлением памятью?
Санджив Кумар Данги
1
Когда вам задали этот вопрос, действительно ли вам приходилось писать классы и функции в CollabEdit или вам просто нужно было о них говорить?
совершеноандройдер
Посмотри на это. github.com/shanshaji/parking-lot , надеюсь, это поможет
Шан,

Ответы:

159

Вот быстрый старт, чтобы включить шестеренки ...

ParkingLot - это класс.

ParkingSpace - это класс.

ParkingSpace имеет вход.

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

ParkingLotSign - это класс.

ParkingLot имеет знак ParkingLotSign.

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

HandicappedParkingSpace - это подкласс ParkingSpace.

RegularParkingSpace - это подкласс ParkingSpace.

CompactParkingSpace - это подкласс ParkingSpace.

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

Можно указать ParkingLotSign для отображения «полный», «пустой» или «пустой / нормальный / частично занятый» путем вызова .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. (на самом деле может быть излишним.)

В этом решении возможно, что Parker следует переименовать в Car.

Крис Морли
источник
32
Пожалуйста, не забывайте машину.
ojblass
5
Почему ParkingSpace должно быть классом? Не вижу необходимости создавать для него объект? В любое время любое парковочное место должно быть либо для инвалидов, либо для обычного, либо для компактного. ParkingSpace должно быть скорее интерфейсом.
name_masked
11
Возможно, мы сможем добавить этажи на стоянку ..
Барри
13
Почему существует класс ParkingLotSign? Разве атрибут (скажем, bool isFull;) не работал бы?
Chinmay Nerurkar
3
Зачем делать парковочное место расширяемым? Почему бы просто не иметь поля isHandicapped и isCompact для места парковки?
совершиландройдер
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,
}
Шрикант Аггарвал
источник
6
Используйте HashMap вместо списков с номером автомобиля в качестве ключа для повышения эффективности
sanath_p
5
После того, как вы отпустите автомобиль, vacantParkingSpacesон больше не сортируется. Вы должны сделать так, чтобы оно findNearestVacantвозвращало ближайшее парковочное место.
laike9m 03
1
Почему функция названа findNearestVacant, если ее реализация находит только свободное место, не обязательно «ближайшее»? Почему бы не найти "findVacant"? Хотя было бы хорошо вернуть «ближайшее» пространство, используя некоторые состояния, хранящиеся в классе. Возможно, мы можем сохранить расстояния от «входа» и «выхода» в классе «space», чтобы также можно было вычислить «ближайший». Или мы можем просто координаты пространства, чтобы расстояния от всех входов и выходы могут быть рассчитаны по мере необходимости.
Наваз
1
Кроме того, функция parkVehicleдолжна возвращать логическое значение, указывающее, был ли автомобиль припаркован или нет.
Наваз
Никаких нулевых проверок. Выбросите NPE
Hitesh
10

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

Пит Киркхэм
источник
6

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

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

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

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

Пол Кейстер
источник
5

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


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

Скотт М.
источник