2009-04-19 12 views
91

Progettare un parcheggio OO. Quali classi e funzioni avrà. Dovrebbe dire, pieno, vuoto e anche essere in grado di trovare posto per il parcheggio custodito. Il lotto ha 3 diversi tipi di parcheggio: regolare, portatori di handicap e compatto.Domanda intervista Amazon: progettare un parcheggio OO

Grazie!

+35

Ti sei fatto avanti ed esclamai "che cosa ha a che fare con i libri?" e si precipita fuori? –

+0

Mi è stato chiesto da un ragazzo che è passato ad un'altra situazione. Quando ho usato un modello di Gang of Four quasi da manuale, ha detto "Almeno conosci il polimorfismo". Sono stato ringraziato per essere venuto e ho detto che me lo avrebbero fatto sapere. Non ero impressionato –

+0

Non si tratta di un problema di gestione della memoria? –

risposta

129

Ecco un rapido avvio per ottenere i ingranaggi che girano ...

parkinglot è una classe.

ParkingSpace è una classe.

ParkingSpace ha un'entrata.

L'ingresso ha una posizione o, più specificamente, la distanza dall'ingresso.

ParkingLotSign è una classe.

ParkingLot dispone di un ParcheggioLotSign.

ParkingLot dispone di un numero limitato di ParkingSpaces.

HandicappedParkingSpace è una sottoclasse di ParkingSpace.

RegularParkingSpace è una sottoclasse di ParkingSpace.

CompactParkingSpace è una sottoclasse di ParkingSpace.

ParkingLot mantiene una serie di ParkingSpaces e una serie separata di ParkingSpaces liberi in ordine di distanza dall'ingresso.

ParkingLotSign può essere detto per visualizzare "pieno", o "vuoto", o "vuoto/normale/parzialmente occupato" chiamando .Full(), .Empty() o .Normal()

Parker una classe.

Parker può parcheggiare().

Parker può Unpark().

Valor è una sottoclasse di Parker che può chiamare ParkingLot.FindVacantSpaceNearestEntrance(), che restituisce un ParkingSpace.

Parker dispone di un parcheggio.

Parker può chiamare ParkingSpace.Take() e ParkingSpace.Vacate().

Parker chiama Entrance.Entering() e Entrance.Exiting() e ParkingSpace notifica ParkingLot quando viene preso o lasciato in modo che ParkingLot possa determinare se è pieno o meno. Se è pieno o vuoto o non è pieno o vuoto, dovrebbe cambiare ParkingLotSign.Full() o ParkingLotSign.Empty() o ParkingLotSign.Normal().

HandicappedParker potrebbe essere una sottoclasse di Parker e CompactParker una sottoclasse di Parker e RegularParker una sottoclasse di Parker. (potrebbe essere eccessivo, in realtà.)

In questa soluzione, è possibile che Parker debba essere rinominato Car.

+19

Si prega di non dimenticare l'auto. – ojblass

+4

Perché ParkingSpace deve essere una classe? Non vedo alcuna necessità di creare un oggetto per questo? In ogni momento, qualsiasi spazio di parcheggio deve essere un Handicappato, Regolare o Compatto. ParkingSpace dovrebbe essere piuttosto un'interfaccia. –

+8

Probabilmente possiamo aggiungere piani al parcheggio .. – Barry

5

In un parcheggio orientato agli oggetti, non ci sarà bisogno di assistenti perché le macchine sapranno "parcheggiare".

Trovare un'auto utilizzabile sul lotto sarà difficile; i modelli più comuni avranno tutte le loro parti mobili esposte come variabili dei membri pubblici, oppure saranno auto "completamente incapsulate" senza finestre o porte.

I posti auto nel nostro parcheggio OO non corrisponderà la dimensione e la forma delle vetture (una "impediance non corrispondente" tra gli spazi e le vetture) tag

di licenza sulla nostra sorte avrà un punto tra ogni lettera e cifra. Il parcheggio con handicap sarà disponibile solo per le licenze che iniziano con "_" e le licenze che iniziano con "m_" verranno rimorchiate.

4

è necessario un parcheggio, che contiene un array multidimensionale (specificato nel costruttore) di un tipo "spazio". Il parcheggio può tenere traccia di quanti spazi sono occupati tramite chiamate a funzioni che riempiono e svuotano spazi. Lo spazio può contenere un tipo enumerato che indica il tipo di spazio che è. Anche lo spazio ha un metodo(). per il parcheggio custodito, basta trovare il primo spazio che è aperto e mettere la macchina lì. Avrai anche bisogno di un oggetto Car da inserire nello spazio, che trattiene se si tratta di un veicolo per disabili, compatto o normale.


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

I modelli non esistono isolati. Le strutture che definiresti per una simulazione di auto che entrano in un parcheggio, un sistema integrato che ti guida verso uno spazio libero, un sistema di fatturazione di parcheggi per auto o per i distributori automatici/biglietterie normalmente nei parcheggi sono tutti diversi.

50
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, 
} 
+2

Usa HashMap invece di elenchi con numero di veicolo come chiave per l'efficienza – user3716835

+4

Dopo aver rilasciato Veicolo, 'vacantParkingSpaces' non è più ordinato. Devi renderlo ordinato in modo che 'findNearestVacant' restituisca lo spazio di parcheggio più vicino. – laike9m

+0

Perché la funzione è denominata 'findNearestVacant', quando la sua implementazione trova solo uno spazio vuoto, non necessariamente quello "più vicino"? Perché non "findVacant"? Anche se sarebbe stato opportuno restituire lo spazio "più vicino", utilizzando alcuni stati memorizzati nella classe. Forse, possiamo memorizzare le distanze tra "entrata" e "uscita" nella classe "spazio" in modo che anche "più vicino" possa essere calcolato O possiamo semplicemente le coordinate dello spazio, in modo che le distanze da tutte le entrate e le uscite possono essere calcolate in base alle necessità. – Nawaz