본문으로 건너뛰기

메서드가 길어질때

메서드가 길어진다 !!

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();
}
}