Amazon Röportaj Sorusu: Bir OO otoparkı tasarlayın [kapalı]


114

Bir OO otoparkı tasarlayın. Hangi sınıflara ve işlevlere sahip olacağı. Dolu, boş ve ayrıca Vale park yeri bulabilmeli. Arazide 3 farklı park türü vardır: normal, engelli ve kompakt.

Teşekkürler!


39
Ayağa sıçrayıp "Bunun kitaplarla ne alakası var?" Diye bağırdınız mı? ve fırtına mı?
JP Alioto

Bunu başka bir duruma giren bir adam sordu. Neredeyse ders kitabındaki Gang of Four modelini uygun bir şekilde kullandığımda, "En azından polimorfizmi biliyorsunuz" dedi. Daha sonra geldiğim için teşekkür edildim ve bana haber vereceklerini söylediler. Ben etkilenmedim.
David Thornley

Bu hafıza yönetimi sorunu değil mi?
Sanjeev Kumar Dangi

1
Bu soru sorulduğunda, CollabEdit'teki sınıfları ve fonksiyonları gerçekten yazmanız mı gerekiyordu yoksa sadece onlardan bahsetmek zorunda mıydınız?
committedandroider

Şuna bir göz at. github.com/shanshaji/parking-lot , umarım yardımcı olur
Shan

Yanıtlar:


159

İşte vitesleri döndürmek için hızlı bir başlangıç ​​...

ParkingLot bir sınıftır.

ParkingSpace bir sınıftır.

ParkingSpace'de bir Giriş vardır.

Girişin bir konumu veya daha spesifik olarak Girişten uzaklığı vardır.

ParkingLotSign bir sınıftır.

ParkingLot'ta bir ParkingLotSign vardır.

ParkingLot'un sınırlı sayıda ParkingSpace'i vardır.

HandicappedParkingSpace, ParkingSpace'in bir alt sınıfıdır.

RegularParkingSpace, ParkingSpace'in bir alt sınıfıdır.

CompactParkingSpace, ParkingSpace'in bir alt sınıfıdır.

ParkingLot, bir dizi Park Alanını ve ayrı bir boş Otopark Alanı dizisini Girişinden uzaklık sırasına göre tutar.

ParkingLotSign'a .Full (), .Empty () veya .Normal () çağrılarak "dolu" veya "boş" veya "boş / normal / kısmen dolu" görüntülenmesi söylenebilir.

Parker bir sınıftır.

Parker, Park edebilir ().

Parker Unpark () olabilir.

Vale, bir ParkingSpace döndüren ParkingLot.FindVacantSpaceNearestEntrance () öğesini çağırabilen bir Parker alt sınıfıdır.

Parker'ın bir Park Alanı var.

Parker, ParkingSpace.Take () ve ParkingSpace.Vacate () çağrılarını yapabilir.

Parker, Entrance.Entering () ve Entrance.Exiting () 'i çağırır ve ParkingSpace, park yeri alındığında veya boşaltıldığında, ParkingLot'a bildirimde bulunur, böylece ParkingLot dolu olup olmadığını belirleyebilir. Yeni doluysa veya yeni boşsa veya yeni dolu veya boş değilse, ParkingLotSign.Full () veya ParkingLotSign.Empty () veya ParkingLotSign.Normal () değerini değiştirmesi gerekir.

HandicappedParker, Parker'ın ve CompactParker'in bir alt sınıfı, Parker'ın bir alt sınıfı ve RegularParker'ın bir Parker alt sınıfı olabilir. (aslında aşırı olabilir.)

Bu çözümde, Parker'ın Car olarak yeniden adlandırılması mümkündür.


32
Lütfen arabayı unutma.
ojblass

5
ParkingSpace neden bir sınıf olmak zorunda? Bunun için bir nesne yaratmaya gerek görmüyor muyum? Her zaman, herhangi bir park yeri ya Engelli, Normal ya da Kompakt olmalıdır. ParkingSpace daha çok bir arayüz olmalıdır.
name_masked

11
Muhtemelen park yerine kat ekleyebiliriz ..
Barry

13
ParkingLotSign sınıfı neden var? Bir öznitelik (örneğin, bool isFull;) çalışmaz mı?
Chinmay Nerurkar

3
Park yeri neden genişletilebilir hale getirilsin? Neden sadece bir IsHandicapped alanı ve park yerine bir isCompact alanı olmasın?
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,
}

6
Verimlilik için anahtar olarak araç numarasına sahip listeler yerine HashMap kullanın
sanath_p

5
Aracı bıraktıktan sonra vacantParkingSpacesartık sıralanmaz. En findNearestVacantyakın park yerini döndürmesi için onu sıralamak zorundasınız .
laike9m

1
findNearestVacantUygulanması zorunlu olarak "en yakın" olanı değil de yalnızca boş bir alan bulduğunda işlev neden adlandırılır ? Neden "Vacant'ı bulmuyorsun"? Sınıfta depolanan bazı durumları kullanarak "en yakın" alanı döndürmek iyi olurdu. Belki, "giriş" ve "çıkış" dan olan mesafeleri "uzay" sınıfında saklayabiliriz, böylece "en yakın" da hesaplanabilir. Veya basitçe mekanın koordinatlarını, böylece tüm girişlerden ve çıkışlar ihtiyaca göre hesaplanabilir.
Nawaz

1
Ayrıca işlev parkVehicle, aracın park halinde olup olmadığını gösteren bir boole değeri döndürmelidir.
Nawaz

Boş kontrol yok. NPE atacak
hitesh

10

Modeller tek başına varolmaz. Bir otoparka giren araçların simülasyonu, sizi boş bir alana yönlendiren gömülü bir sistem, bir otopark faturalama sistemi veya otoparklarda olağan otomatik kapılar / bilet makineleri için tanımlayacağınız yapılar birbirinden farklıdır.


6

Nesne Tabanlı bir otoparkta, araçlara "nasıl park edileceğini bileceği" için görevliye ihtiyaç olmayacaktır.

Arazide kullanılabilir bir araba bulmak zor olacak; en yaygın modellerin ya tüm hareketli parçaları genel üye değişkenleri olarak açığa çıkacak ya da penceresiz ya da kapısı olmayan "tamamen kapsüllenmiş" arabalar olacaktır.

OO otoparkımızdaki park alanları, arabaların boyutuna ve şekline uymayacaktır (alanlar ve arabalar arasında bir "engelleme uyuşmazlığı")

Partimizdeki lisans etiketlerinde her harf ve rakam arasında bir nokta olacaktır. Engelli otoparkı yalnızca "_" ile başlayan lisanslar için geçerli olacak ve "m_" ile başlayan lisanslar çekilecektir.


5

"boşluk" türünde çok boyutlu bir diziyi (kurucuda belirtilmiş) tutan bir park yerine ihtiyacınız olacaktır. Park yeri, boşlukları dolduran ve boşaltan işlevlere yapılan çağrılar yoluyla kaç adet alan alındığını takip edebilir. Alan, ne tür bir alan olduğunu söyleyen numaralandırılmış bir tür tutabilir. Space ayrıca alınan bir yönteme () sahiptir. Vale park hizmeti için, açılan ilk boşluğu bulun ve arabayı oraya koyun. Ayrıca boşluğa koymak için engelli, kompakt veya normal bir araç olup olmadığını tutan bir Araba nesnesine de ihtiyacınız olacak.


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

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.