リファクタリング_既存コードの設計を改善する第1章再構成例

10623 ワード

/**

 * 

 */

package statedesignmodel;



import java.util.Enumeration;

import java.util.Vector;



/**

 * @author Administrator

 *

 */

public class Customer {



    private String _name;

    private Vector<Rental> _rentals = new Vector<Rental>();



    public Customer(String name) {

        this._name = name;

    }



    public void addRental(Rental arg) {

        this._rentals.addElement(arg);

    }



    public String getName() {

        return _name;

    }



    public String statement() {

        double totalAmount = 0;

        int frequentRenterPoints = 0;

        Enumeration<Rental> rentals = this._rentals.elements();

        String result = "Rental Record for " + this.getName() + "
"; 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; } } // add frequent renter points frequentRenterPoints++; // add bonus for a two day new release rental if ((each.getMovie().getPriceCode() == Movie.NEW_RELEASE) && each.getDaysRented() > 1) { frequentRenterPoints++; } // show figures for this rental result += "\t" + each.getMovie().getTitle() + "\t" + String.valueOf(thisAmount) + "
"; totalAmount += thisAmount; } // add footer lines result += "Amount owed is " + String.valueOf(totalAmount) + "
"; result += "You earned " + String.valueOf(frequentRenterPoints) + " frequent renter points"; return result; } }

 
/**

 * 

 */

package statedesignmodel;



/**

 * @author Administrator

 *

 */

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) {

        this._title = title;

        this._priceCode = priceCode;

    }



    public String getTitle() {

        return _title;

    }



    public void setTitle(String _title) {

        this._title = _title;

    }



    public int getPriceCode() {

        return _priceCode;

    }



    public void setPriceCode(int _priceCode) {

        this._priceCode = _priceCode;

    }



}

 
/**

 * 

 */

package statedesignmodel;



/**

 * @author Administrator

 *

 */

public class Rental {

    private Movie _movie;

    private int _daysRented;



    public Rental(Movie movie, int daysRented) {

        this._movie = movie;

        this._daysRented = daysRented;

    }



    public Movie getMovie() {

        return _movie;

    }



    public int getDaysRented() {

        return _daysRented;

    }



}