0

シンプルなレンタカーシステムを設計しているのですが、その設計に良い習慣を使っているのではないかと考えていました。基本的に、私はすべてのレンタカー(新しいオブジェクト)を格納するショールームの配列リストを持っています。各車のオブジェクトの中には、その月のその車の可用性の配列リストがあります。可用性は、0または1(使用可能)の31個の値(その月の各日に対応)で構成されます。その日に車が予約されるまで、最初は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);
}

注意:

  • タイムスタンプについては心配していません。車が1日中予約されていると仮定します。
  • システムは31日間の1か月のみであると想定します
4

3 に答える 3

3

可用性をブール値(またはint)の配列として記録する方が簡単です。ArrayListこのような固定長のレコードを使用する必要はありません(主な利点ArrayListは、動的に拡張できることです)。

可用性を示すためにデフォルト値のbooleanまたはintを使用する方がよいと思います。そうすれば、配列を明示的に初期化する必要はまったくありません。ブール値の場合、これは予約の記録が空室状況ではないことを意味します。

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

これは、潜在的な混乱も浮き彫りにします。インデックスがゼロであるためにソフトウェアで月の日が混乱することがよくあるため、月の1日が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 に答える