Refactoring is the process of restructuring existing code without changing its external behavior. The goal is to improve code quality, readability, and maintainability while preserving functionality.
// Before Refactoring
class Order {
public double calculateTotal() {
double total = 0;
for(Item item : items) {
// Calculate price
double price = item.getPrice();
// Add tax
price = price * 1.2;
// Apply discount if quantity > 10
if(item.getQuantity() > 10) {
price = price * 0.9;
}
total += price * item.getQuantity();
}
return total;
}
}
// After Refactoring
class Order {
private static final double TAX_RATE = 1.2;
private static final double BULK_DISCOUNT = 0.9;
private static final int BULK_THRESHOLD = 10;
public double calculateTotal() {
return items.stream()
.mapToDouble(this::calculateItemTotal)
.sum();
}
private double calculateItemTotal(Item item) {
return applyDiscount(
calculatePriceWithTax(item),
item.getQuantity()
) * item.getQuantity();
}
private double calculatePriceWithTax(Item item) {
return item.getPrice() * TAX_RATE;
}
private double applyDiscount(double price, int quantity) {
return quantity > BULK_THRESHOLD
? price * BULK_DISCOUNT
: price;
}
}