0

我正在设计一个简单的汽车租赁系统,并且想知道我是否使用了良好的设计实践。基本上,我有一个陈列室数组列表,它存储所有出租汽车(新对象)。每个汽车对象内部都有一个数组列表,用于表示该月该汽车的可用性。可用性包括 31 个值(对应于该月中的每一天),0 或 1(可用)。它们最初设置为 1,直到当天预订汽车。是否有另一种整合可用性的方法?

ArrayList<Car> showroom = new ArrayList<Car>();

ArrayList<Integer> Available1 = new ArrayList<Integer>();
ArrayList<Integer> Available2 = new ArrayList<Integer>();

setAllDatesAvailable(Available1);
setAllDatesAvailable(Available2);

Car number1 = new Car(objectitems, ... , Available1);
showroom.add(number1);
Car number2 = new Car(objectitems, ... , Available2);
showroom.add(number2);

//预约流程

setAllDatesAvailable(ArrayList Array) {
   for (int i = 0; i < 31; i++) {
      Array.add(1);
}

注意:

  • 我不担心时间戳,假设汽车被预订了一整天
  • 假设系统仅适用于单月 31 天
4

3 回答 3

3

将可用性记录为布尔值(或整数)数组会更简单。没有必要使用ArrayList这样的固定长度记录(主要好处ArrayList是它可以动态增长)。

我认为最好使用 boolean 或 int 的默认值来指示可用性 - 然后您根本不需要显式初始化数组。对于布尔值,这意味着记录预订不可用:

    boolean[] booked = new boolean[31];
    System.out.println(booked[0]);  // false

这也突出了一个潜在的混淆——一个月中的几天经常因为零索引而在软件中混淆,所以你需要清楚一个月的第一天是 0 还是 1。

在 Car 对象中存储(并在必要时初始化)预订/可用性,并在 Car 对象上提供方法以根据需要操作该数据会更好、更面向对象

于 2012-11-07T20:13:29.160 回答
3

以下是我建议对您的代码进行的一些改进:-

  1. 首先,遵循Java 命名约定。变量名应以小写字母开头。Available-> available,甚至更好,availableDates以匹配您的目的List

  2. 始终使用通用类型集合。

    setAllDatesAvailable(ArrayList Array)
    

    至:

    setAllDatesAvailable(ArrayList<Integer> array);
    
  3. 用作Interface您的参考类型。您应该将您的清单声明为:-

    List<Integer> availableDates = new ArrayList<Integer>();
    

    在您的方法中的形式参数中也是如此,如@Alex 的评论所示。

  4. 为变量选择有意义的名称。

    Car number1 = ...; <-- // makes no sense to reader
    

    将其更改为: -

    Car car1 = ...;
    
  5. 尽可能尝试将参数命名formal为与参数相同的名称actual

    setAllDatesAvailable(ArrayList<Integer> array);
    

    最好声明为:-

    setAllDatesAvailable(List<Integer> availableDates);
    

在所有这些更改之后,您可以期待即兴代码的功能,@DNA 在他的回答中写得非常好。

于 2012-11-07T20:13:59.087 回答
0

可能像下面这样 - 我会避免传递裸体系列。LocalDate 在 joda 库中。Car 的默认范围是经过深思熟虑的,并假设它们在同一个包中,但客户端不是:

public class Showroom {

    private Collection<Car> cars = new ArrayList<Car>();

    public boolean isCarAvailable(Car car, LocalDate day) {
        return car.isAvailable(day);
    }

    public void bookCarOnDate(Car car, LocalDate day) throws IlegalStateException {
          car.book(day);
    }

    public Collection<Car> getCars() {
          return Collection.unmodifiableCollection(cars);
    }
}

class Car {

    private Map<LocalDate, Boolean> dayAvailability = new HashMap<LocalDate, Boolean>();

    Car() {
        //add other private attributes
        //don't provide setters for these - create new whenever modified so don't leak 
        //state and thread safety
    }

    boolean isAvailable(LocalDate day) {
       return dayAvailability.get(day) != null && dayAvailability.get(day);
    }

    void book(LocalDate day) {
     if (isAvailable(day)) {
         dayAvailability.put(car, true);
     else {
         throw IllegalStateException("Car "+car+" not available for booking on date "+localDate);
     }
}
于 2012-11-07T20:56:21.757 回答