亚马逊访谈问题:设计一个OO停车场

bur*_*1ce 110 oop

设计一个OO停车场.它将具有哪些类别和功能.它应该说,全,空,也能找到代客泊车的地方.该地段有3种不同类型的停车场:普通,残疾人和紧凑型.

谢谢!

Chr*_*ley 155

这是一个让齿轮转动的快速入门......

ParkingLot是一个班级.

ParkingSpace是一个类.

ParkingSpace有一个入口.

入口有一个位置或更具体地说,距离入口的距离.

ParkingLotSign是一个班级.

ParkingLot有ParkingLotSign.

ParkingLot拥有有限数量的ParkingSpaces.

HandicappedParkingSpace是ParkingSpace的子类.

RegularParkingSpace是ParkingSpace的子类.

CompactParkingSpace是ParkingSpace的子类.

ParkingLot保留了一系列ParkingSpaces,以及一系列独立的ParkingSpaces,距离入口有一定距离.

可以通过调用.Full(),. Empty()或.Normal()来告知ParkingLotSign显示"full","empty"或"blank/normal/partial occupied"

帕克是一个班级.

派克可以停车().

派克可以Unpark().

Valet是Parker的子类,可以调用ParkingLot.FindVacantSpaceNearestEntrance(),它返回一个ParkingSpace.

帕克有一个停车位.

Parker可以调用ParkingSpace.Take()和ParkingSpace.Vacate().

Parker呼叫Entrance.Entering()和Entrance.Exiting()和ParkingSpace在停放时通知ParkingLot,以便ParkingLot可以确定它是否已满.如果它是新满或新空或新未满或空,则应更改ParkingLotSign.Full()或ParkingLotSign.Empty()或ParkingLotSign.Normal().

HandicappedParker可以是Parker的子类,CompactParker是Parker的子类,而ParkP的子类是RegularParker.(实际上可能有点矫枉过正了.)

在这个解决方案中,Parker可能会被重命名为Car.

  • 请不要忘记车. (28认同)
  • 为什么ParkingLotSign类存在?一个属性(比如bool isFull;)不会起作用吗? (13认同)
  • 可能我们可以在停车场添加地板.. (11认同)
  • 为什么ParkingSpace必须是一个班级?我认为没有必要为它创建一个对象?在任何时候,任何停车位必须是残疾人,普通人或紧凑型.ParkingSpace应该是一个界面. (5认同)
  • 为什么要让停车位可扩展?为什么不在停车位上放置一个isHandicapped字段和一个isCompact字段? (3认同)

小智 64

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,
}
Run Code Online (Sandbox Code Playgroud)

  • 使用HashMap代替带有车辆编号的列表作为提高效率的关键 (6认同)
  • 释放版本后,`vacantParkingSpaces`不再排序了.你必须对它进行排序,以便`findNearestVacant`返回最近的停车位. (5认同)
  • 此外,函数`parkVehicle` 应返回一个布尔值,指示车辆是否已停放。 (2认同)

Pet*_*ham 10

模型不是孤立存在的.您为进入停车场的汽车模拟定义的结构,引导您进入自由空间的嵌入式系统,停车计费系统或停车场中常见的自动门/售票机都是不同的.


Pau*_*ter 5

在面向对象的停车场,不需要服务员,因为汽车将"知道如何停车".

在这个地段找到一辆可用的汽车将很困难; 最常见的模型要么将所有活动部件暴露为公共成员变量,要么将是"完全封装"的汽车,没有窗户或门.

我们的OO停车场的停车位与汽车的大小和形状不匹配(空间与汽车之间的"阻碍不匹配")

我们地段的许可证标签在每个字母和数字之间都有一个点.Handicaped parking仅适用于以"_"开头的许可证,以及以"m_"开头的许可证将被拖走.


Sco*_* M. 5

你需要一个停车场,它拥有一个"空间"类型的多维数组(在构造函数中指定).停车场可以通过调用填充和清空空间的函数来跟踪占用的空间数量.空间可以保持枚举类型,告诉它是什么类型的空间.空间也有一个方法().代客泊车,找到第一个打开的空间,把车放在那里.您还需要一个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;
}