Question: REFACTORING A SIMPLE PROGRAM In this homework, you are given the simple program to support the management of a movie rental place. You are required

REFACTORING A SIMPLE PROGRAM

In this homework, you are given the simple program to support the management of a movie rental

place.

You are required to perform refactoring on that program to improve its quality. Then, you are required 1) to add a main() method to test the program; and 2) to add a new method to print the statement for a customer in HTML format.

Please submit your resulting code and a short Word document explaining the rationales behind your

refactoring changes. Your solution must at least contain:

1. At least 3 method extraction operations

2. At least 3 creation of 3 new classes

3. At least 3 moving method operations

4. At least 3 renaming operations

5. 1-2 replacements of data types

You are free to add more operations as you like.

////////////////////////////////////////////////////////

///////////////Customer Class////////////////////////

///////////////////////////////////////////////////////

import java.util.Enumeration;

import java.util.Vector;

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() + " ";

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;

}

}

/////////////////////////////////////////////////////////////////////////

/////////////////// Movie Class ///////////////////////////////////

////////////////////////////////////////////////////////////////////////

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 Class ////////////////////

////////////////////////////////////////////////

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;

}

}

Here are the suggestions of the professor:

// the Customer class is too long, its Statement() method is too long and contains message chaining in the switch statements just to print the price.

// make subclasses of movie to create a price. use polymorphism instead of switch.

//extract this switch statements to rental class

//extrace method line 37 - 53 Statement() ----> ComputPrice() and put it to Rental class

//movie Rental(movie.getprice, days rented)

//3 instance of movie class = regular, new_release, children and compute price there, and in

//rental class just call one function in movie_Rental which is get.price

Step by Step Solution

There are 3 Steps involved in it

1 Expert Approved Answer
Step: 1 Unlock blur-text-image
Question Has Been Solved by an Expert!

Get step-by-step solutions from verified subject matter experts

Step: 2 Unlock
Step: 3 Unlock

Students Have Also Explored These Related Databases Questions!