我正在设计一个简单的汽车租赁系统,并想知道我是否在设计中使用了良好的实践。基本上,我有一个陈列室arraylist,存储所有租赁汽车(新物品)。在每个汽车对象内部是一个arraylist为该月的汽车可用性。可用性包含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);
}
注意:
答案 0 :(得分:3)
将可用性记录为一组布尔值(或整数)会更简单。对于这样的固定长度记录,没有必要使用ArrayList
(ArrayList
的主要好处是它可以动态增长)。
我认为最好使用boolean或int的默认值来表示可用性 - 然后你根本不需要显式初始化数组。对于布尔值,这意味着记录预订不可用:
boolean[] booked = new boolean[31];
System.out.println(booked[0]); // false
这也突出了一个潜在的混淆 - 由于零索引,本月的日子常常在软件中混淆,因此您需要清楚该月的第一天是0还是1。
在Car对象中存储(并初始化,如果需要)预订/可用性,并且在Car对象上提供方法以根据需要操作该数据,这将更好,更面向对象
答案 1 :(得分:3)
以下是我为您的代码建议的一些改进: -
首先,关注Java Naming Conventions。变量名称应以小写字母开头。 Available
- &gt; available
,甚至更好,availableDates
以符合List
始终使用通用类型集合。
setAllDatesAvailable(ArrayList Array)
到:
setAllDatesAvailable(ArrayList<Integer> array);
使用Interface
作为参考类型。您应将列表声明为: -
List<Integer> availableDates = new ArrayList<Integer>();
方法中的形式参数也是如此,如@Alex的评论所示。
为变量选择有意义的名称。
Car number1 = ...; <-- // makes no sense to reader
将其更改为: -
Car car1 = ...;
尽可能尝试将formal
参数命名为与actual
参数相同的参数。
setAllDatesAvailable(ArrayList<Integer> array);
最好声明为: -
setAllDatesAvailable(List<Integer> availableDates);
在完成所有这些更改之后,您可以期待即兴创建代码的功能,@ DNA在answer中已经很好地编写了。
答案 2 :(得分: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);
}
}