2009-04-19 29 views
91

Thiết kế bãi đỗ xe OO. Những lớp và chức năng nào nó sẽ có. Nó nên nói, đầy đủ, trống rỗng và cũng có thể tìm chỗ cho bãi đậu xe có người phục vụ. Lô có 3 loại bãi đậu xe khác nhau: thường xuyên, khuyết tật và nhỏ gọn.Câu hỏi phỏng vấn Amazon: Thiết kế bãi đỗ xe OO

Cảm ơn!

+35

Bạn đã nhảy lên và kêu lên "điều này có liên quan gì đến sách?" và bão ra? –

+0

Tôi đã được hỏi bởi một anh chàng đã đi đến một tình huống khác. Khi tôi sử dụng một cuốn sách gần như sách giáo khoa Gang of Four một cách thích hợp, ông ấy nói "Ít nhất bạn biết đa hình." Sau đó tôi được cảm ơn vì đã đến và bảo họ sẽ cho tôi biết. Tôi không ấn tượng. –

+0

Không phải vấn đề quản lý bộ nhớ này phải không? –

Trả lời

129

Đây là một sự khởi đầu nhanh chóng để chuyển bánh răng ...

ParkingLot là một lớp học.

ParkingSpace là một lớp học.

ParkingSpace có Lối vào.

Lối vào có vị trí hoặc cụ thể hơn, khoảng cách từ Lối vào.

ParkingLotSign là một lớp.

Chỗ đỗ xeKhông có ParkingMotSign.

ParkingLot có số lượng ParkingSpaces hữu hạn.

HandicappedParkingSpace là phân lớp của ParkingSpace.

RegularParkingSpace là một phân lớp của ParkingSpace.

CompactParkingSpace là một phân lớp của ParkingSpace.

ParkingKhông giữ mảng ParkingSpaces, và một mảng riêng biệt của ParkingSpaces trống theo thứ tự khoảng cách từ lối vào của nó.

ParkingLotSign có thể được thông báo để hiển thị "đầy đủ", hay "trống rỗng", hay "trống/bình thường/phần chiếm" bằng cách gọi .Full(), .Empty() hoặc .Normal()

Parker là một lớp học.

Parker có thể đỗ xe().

Parker có thể Unpark().

Giá trị là một phân lớp của Parker có thể gọi ParkingLot.FindVacantSpaceNearestEntrance(), trả về một ParkingSpace.

Parker có ParkingSpace.

Parker có thể gọi ParkingSpace.Take() và ParkingSpace.Vacate().

Parker gọi Entrance.Entering() và Entrance.Exiting() và ParkingSpace thông báo ParkingLot khi nó được thực hiện hoặc bỏ trống để ParkingLot có thể xác định xem nó có đầy đủ hay không. Nếu nó vừa mới đầy hoặc mới trống hoặc mới không đầy hoặc trống, nó sẽ thay đổi ParkingLotSign.Full() hoặc ParkingLotSign.Empty() hoặc ParkingLotSign.Normal().

HandicappedParker có thể là phân lớp của Parker và CompactParker một phân lớp của Parker và RegularParker là phân lớp của Parker. (có thể là quá mức cần thiết.)

Trong giải pháp này, có thể Parker được đổi tên thành Ô tô.

+19

Xin đừng quên xe. – ojblass

+4

Tại sao ParkingSpace phải là một lớp học? Tôi không thấy cần phải tạo một đối tượng cho nó? Tại mọi thời điểm, bất kỳ chỗ đỗ xe nào đều phải là Người khuyết tật, Thường xuyên hoặc Nhỏ gọn. ParkingSpace nên là một giao diện thay thế. –

+8

Có lẽ chúng ta có thể thêm sàn vào bãi đậu xe .. – Barry

5

Trong bãi đỗ xe hướng đối tượng, sẽ không cần người tham dự vì xe sẽ "biết cách đỗ xe".

Tìm một chiếc xe có thể sử dụng trên lô hàng sẽ rất khó khăn; các mô hình phổ biến nhất sẽ có tất cả các bộ phận chuyển động của chúng tiếp xúc dưới dạng biến thành viên công cộng hoặc chúng sẽ được "đóng gói hoàn toàn" không có cửa sổ hoặc cửa ra vào.

Các chỗ đậu xe trong bãi đậu xe OO của chúng tôi sẽ không phù hợp với kích thước và hình dạng của những chiếc xe (một "impediance không phù hợp" giữa các không gian và những chiếc xe) thẻ

Giấy phép trên rất nhiều của chúng tôi sẽ có một dấu chấm giữa mỗi chữ cái và chữ số. Bãi đậu xe có hình dáng chỉ có sẵn cho giấy phép bắt đầu bằng "_" và giấy phép bắt đầu bằng "m_" sẽ được kéo.

4

bạn sẽ cần một bãi đỗ xe, chứa một mảng đa chiều (được chỉ định trong hàm tạo) của một loại "khoảng trống". Bãi đậu xe có thể theo dõi bao nhiêu không gian được thực hiện thông qua các cuộc gọi đến các chức năng điền vào và các khoảng trống. Không gian có thể chứa một loại liệt kê cho biết loại không gian đó là gì. Không gian cũng có một phương thức được thực hiện(). cho dịch vụ đỗ xe cho khách, chỉ cần tìm không gian đầu tiên mở và đặt xe ở đó. Bạn cũng sẽ cần một đối tượng xe hơi để đặt trong không gian, mà giữ cho dù đó là một chiếc xe tàn tật, nhỏ gọn, hoặc thường xuyên.


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

Mô hình không tồn tại trong sự cô lập. Các cấu trúc bạn định nghĩa cho mô phỏng xe ô tô vào bãi đậu xe, hệ thống nhúng hướng dẫn bạn đến một không gian trống, hệ thống thanh toán xe hơi hoặc các máy bán vé tự động thông thường trong bãi đậu xe đều khác nhau.

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

Sử dụng HashMap thay vì danh sách có số hiệu là chìa khóa để có hiệu quả – user3716835

+4

Sau khi bạn phát hànhVehicle, 'vacantParkingSpaces' không được sắp xếp nữa. Bạn phải làm cho nó được sắp xếp để 'findNearestVacant' trả về chỗ đậu xe gần nhất. – laike9m

+0

Tại sao hàm này được đặt tên là 'findNearestVacant', khi việc thực thi của nó chỉ tìm thấy một khoảng trống, không nhất thiết phải là dấu cách "gần nhất"? Tại sao không phải "findVacant"? Mặc dù nó sẽ là tốt để trả lại không gian "gần nhất", sử dụng một số tiểu bang được lưu trữ trong lớp. Có lẽ, chúng ta có thể lưu trữ khoảng cách từ "lối vào" và "thoát" trong lớp "không gian" để "gần nhất" cũng có thể được tính hoặc chúng ta chỉ đơn giản là tọa độ của không gian, để khoảng cách từ tất cả các lối vào và lối ra có thể được tính khi cần. – Nawaz