2009-04-19 7 views
91

Concevoir un parking d'OO. Quelles classes et fonctions auront-ils? Il devrait dire, plein, vide et aussi être en mesure de trouver un endroit pour le stationnement avec voiturier. Le lot dispose de 3 types de parking différents: régulier, handicapé et compact.Question d'entrevue d'Amazone: Concevoir un stationnement d'OO

Merci!

+35

Avez-vous bondi et exclamé "qu'est-ce que cela a à voir avec les livres?" et sortir? –

+0

On m'a demandé cela par un gars qui est passé à une autre situation. Lorsque j'ai utilisé de manière appropriée un modèle de Gang of Four presque manuel, il m'a dit "Au moins, vous connaissez le polymorphisme". On m'a alors remercié d'être venu et on m'a dit de me le faire savoir. Je n'ai pas été impressionné. –

+0

Ce problème de gestion de la mémoire n'est-il pas présent? –

Répondre

129

Voici un démarrage rapide pour obtenir les engrenages tournent ...

Parkinglot est une classe.

ParkingSpace est une classe.

ParkingSpace a une entrée.

L'entrée a un emplacement ou plus précisément, la distance de l'entrée.

ParkingLotSign est une classe.

ParkingLot a un ParkingLotSign.

ParkingLot a un nombre fini d'espaces de stationnement. HandicappedParkingSpace est une sous-classe de ParkingSpace. RegularParkingSpace est une sous-classe de ParkingSpace.

CompactParkingSpace est une sous-classe de ParkingSpace. ParkingLot conserve un tableau d'espaces de stationnement, et un tableau distinct d'espaces de stationnement libres dans l'ordre de la distance de son entrée.

ParkingLotSign peut être dit pour afficher "complet" ou "vide" ou "blanc/normal/partiellement occupé" en appelant .Full(), .Empty() ou .Normal()

Parker est une classe.

Parker peut se garer().

Parker peut se démarquer(). Valet est une sous-classe de Parker qui peut appeler ParkingLot.FindVacantSpaceNearestEntrance(), qui renvoie un espace ParkingSpace.

Parker dispose d'un espace de stationnement.

Parker peut appeler ParkingSpace.Take() et ParkingSpace.Vacate().

Parker appelle Entrance.Entering() et Entrance.Exiting() et ParkingSpace notifie ParkingLot lorsqu'il est pris ou annulé afin que ParkingLot puisse déterminer s'il est plein ou non. Si elle est nouvellement remplie ou nouvellement vide ou si elle n'est pas pleine ou vide, elle doit changer ParkingLotSign.Full() ou ParkingLotSign.Empty() ou ParkingLotSign.Normal(). HandicappedParker pourrait être une sous-classe de Parker et de CompactParker une sous-classe de Parker et RegularParker une sous-classe de Parker. (peut être trop, en fait.)

Dans cette solution, il est possible que Parker soit renommé Car.

+19

S'il vous plaît ne pas oublier la voiture. – ojblass

+4

Pourquoi ParkingSpace doit-il être une classe? Je ne vois pas le besoin de créer un objet pour cela? En tout temps, tout espace de stationnement doit être soit un handicap, régulier ou compact. ParkingSpace devrait plutôt être une interface. –

+8

Probablement nous pouvons ajouter des étages au stationnement .. – Barry

5

Dans un stationnement orienté objet, il n'y aura pas besoin de préposés parce que les voitures «sauront se garer».

Il sera difficile de trouver une voiture utilisable sur le terrain; les modèles les plus courants auront toutes leurs parties mobiles exposées en tant que variables de membre public, ou ils seront des voitures «entièrement encapsulées» sans fenêtres ou portes.

Les places de stationnement dans notre stationnement OO ne correspondra pas à la taille et la forme des voitures (un « décalage de impediance » entre les espaces et les voitures)

balises de licence sur notre lot aura un point entre chaque lettre et chiffre. Le stationnement avec handicap ne sera disponible que pour les licences commençant par «_», et les licences commençant par «m_» seront remorquées.

4

vous auriez besoin d'un parking, qui contient un tableau multidimensionnel (spécifié dans le constructeur) d'un type "espace". Le parking peut garder une trace du nombre d'espaces pris par les appels aux fonctions qui remplissent et vides les espaces. Espace peut contenir un type énuméré qui indique quel type d'espace il est. L'espace a aussi une méthode prise(). Pour le service de voiturier, il suffit de trouver le premier espace qui est ouvert et mettre la voiture là-bas. Vous aurez également besoin d'un objet de voiture pour mettre dans l'espace, qui tient si c'est un véhicule handicapé, compact ou régulier.


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

Les modèles n'existent pas de manière isolée. Les structures que vous définissez pour une simulation de voitures entrant dans un parking, un système embarqué qui vous guide vers un espace libre, un système de facturation de parking ou pour les automatismes/distributeurs de billets habituels dans les parkings sont tous différents.

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

Utilisez HashMap à la place des listes avec le numéro de véhicule comme clé pour l'efficacité – user3716835

+4

Après avoir libéré le véhicule, 'vacantParkingSpaces' n'est plus trié. Vous devez le trier pour que 'findNearestVacant' renvoie l'espace de stationnement le plus proche. – laike9m

+0

Pourquoi la fonction s'appelle 'findNearestVacant', quand son implémentation trouve seulement un espace vide, pas forcément le" plus proche "? Pourquoi pas "findVacant"? Bien qu'il aurait été bon de retourner l'espace "le plus proche", en utilisant certains états stockés dans la classe. Peut-être, nous pouvons stocker les distances de l '"entrée" et "sortie" dans la classe "espace" de sorte que "plus proche" peut être calculé ou bien nous pouvons simplement les coordonnées de l'espace, de sorte que les distances de toutes les entrées et les sorties peuvent être calculées en cas de besoin. – Nawaz