메서드가 길어질때
메서드가 길어진다 !!
Private method를 사용하지 말라는 룰이 있다.
어떻게 할까?
메서드 추출
// 리팩토링 전
public class OrderProcessor {
public void processOrder(Order order) {
// 긴 처리 로직
// ...
}
public void validateOrder(Order order) {
// 유효성 검사 로직
}
public void calculateTotal(Order order) {
// 총액 계산 로직
}
public void generateInvoice(Order order) {
// 송장 생성 로직
}
}
// 리팩토링 후
public class OrderProcessor {
public void processOrder(Order order) {
ValidationHelper.validateOrder(order);
CalculationHelper.calculateTotal(order);
InvoiceHelper.generateInvoice(order);
}
}
public class ValidationHelper {
public static void validateOrder(Order order) {
// 유효성 검사 로직
}
}
public class CalculationHelper {
public static void calculateTotal(Order order) {
// 총액 계산 로직
}
}
public class InvoiceHelper {
public static void generateInvoice(Order order) {
// 송장 생성 로직
}
}
전략 패턴
// 리팩토링 전
public void processOrder(Order order) {
if (order.isInternational()) {
// 긴 처리 로직
// ...
} else {
// 긴 처리 로직
// ...
}
}
// 리팩토링 후
public void processOrder(Order order) {
OrderProcessorStrategy strategy;
if (order.isInternational()) {
strategy = new InternationalOrderProcessor();
} else {
strategy = new DomesticOrderProcessor();
}
strategy.processOrder(order);
}
public interface OrderProcessorStrategy {
void processOrder(Order order);
}
public class InternationalOrderProcessor implements OrderProcessorStrategy {
public void processOrder(Order order) {
// 국제 주문 처리 로직
}
}
public class DomesticOrderProcessor implements OrderProcessorStrategy {
public void processOrder(Order order) {
// 국내 주문 처리 로직
}
}
메서드 체이닝
// 리팩토링 전
public void processOrder(Order order) {
OrderValidator validator = new OrderValidator();
boolean isValid = validator.validate(order);
if (isValid) {
OrderCalculator calculator = new OrderCalculator();
double total = calculator.calculateTotal(order);
OrderProcessor processor = new OrderProcessor();
processor.process(order, total);
}
}
// 리팩토링 후
public void processOrder(Order order) {
double total = new OrderValidator()
.validate(order)
.calculateTotal()
.process(order);
}
public class OrderValidator {
public OrderValidator validate(Order order) {
// 유효성 검사 로직
return this;
}
public OrderCalculator calculateTotal() {
// 총액 계산 로직
return new OrderCalculator();
}
}
public class OrderCalculator {
public OrderProcessor process(Order order) {
// 처리 로직
return new OrderProcessor();
}
}