株式会社エス・スリー・フォー

C++/C#/VB.NETによる リファクタリング – リファクタリング前(Java)

Movie.java

// Movie.java

public class Movie {

  public static final int CHILDRENS = 2;
  public static final int REGULAR = 0;
  public static final int NEW_RELEASE = 1;

  private String _title;
  private int _priceCode;

  public Movie(String title, int priceCode) {
    _title = title;
    _priceCode = priceCode;
  }

  public int getPriceCode() {
    return _priceCode;
  }

  public void setPriceCode(int arg) {
    _priceCode = arg;
  }

  public String getTitle() {
    return _title;
  }

}

Rental.java

// Rental.java

public class Rental {

  private Movie _movie;
  private int _daysRented;

  public Rental(Movie movie, int daysRented) {
    _movie = movie;
    _daysRented = daysRented;
  }

  public int getDaysRented() {
    return _daysRented;
  }

  public Movie getMovie() {
    return _movie;
  }

}

Customer.java

// Customer.java
import java.util.*;

public class Customer {

  private String _name;
  private Vector _rentals = new Vector();

  public Customer(String name) {
    _name = name;
  }

  public void addRental(Rental arg) {
    _rentals.addElement(arg);
  }

  public String getName() {
    return _name;
  }

  public String statement() {
    double totalAmount = 0;
    int frequentRenterPoints = 0;
    Enumeration rentals = _rentals.elements();
    String result = "Rental Record for " + getName() + "\n";
    while ( rentals.hasMoreElements() ) {
      double thisAmount = 0;
      Rental each = (Rental)rentals.nextElement();
      // 一行ごとに金額を計算
      switch ( each.getMovie().getPriceCode() ) {
        case Movie.REGULAR :
          thisAmount += 2;
          if ( each.getDaysRented() > 2 )
            thisAmount += (each.getDaysRented() - 2) * 1.5;
          break;
        case Movie.NEW_RELEASE :
          thisAmount += each.getDaysRented() * 3;
          break;
        case Movie.CHILDRENS :
          thisAmount += 1.5;
          if ( each.getDaysRented() > 3 )
            thisAmount += (each.getDaysRented() - 3) * 1.5;
          break;
      }
      // レンタルポイントを加算
      frequentRenterPoints++;
      // 新作を二日以上借りた場合はボーナスポイント
      if ( (each.getMovie().getPriceCode() == Movie.NEW_RELEASE) &&
           each.getDaysRented() > 1 )
        frequentRenterPoints++;
      // この貸し出しに対する数値の表示
      result += "\t" + each.getMovie().getTitle() + "\t" +
                String.valueOf(thisAmount)+ "\n";
      totalAmount += thisAmount;
    }
    // フッタ部分の追加
    result += "Amount owed is " + String.valueOf(totalAmount) + "\n";
    result += "You earned " + String.valueOf(frequentRenterPoints) +
              " frequent renter points";
    return result;
  }
}