[리팩토링] 악취 15 : 추측성 일반화

 

✍️ 악취 15 : 추측성 일반화

지금 당장 불필요함에도 나중에 필요할 것 같다는 추측으로 코드를 일반화 시켜 작성했지만 결국엔 사용되지 않는 상황이 발생한다. 모든 경우가 그렇진 않지만 특정 기능을 구현한 코드보다 일반화시킨 코드가 더 복잡하고 이해하기 어려운 경우가 많다. 그렇기에 일반화된 코드가 범용적으로 사용하지 않는다면, 앞으로도 그럴 계획이 없다면 리팩토링을 적용해볼만 하다. 

 

여기 추측성 일반화를 위한 네 가지 리팩토링 기법이 있다.

1. "계층 합치기", 추상 클래스를 만들었지만 유효하지 않다면

2. "함수 인라인, 클래스 인라인",  불필요한 위임이 있다면

3. "함수 선언 변경하기", 재사용을 고려해 추가했지만 사용하지 않는 매개변수가 존재한다면

4. "죽은 코드 제거하기", 실행되지 않는 코드라면

 

본 포스팅에서 관심있게 살펴볼 리팩토링은 "죽은 코드 제거하기"이다.

 

🍊 죽은 코드 제거하기

메서드의 도입부에서 customer의 null 여부를 체크했기에, ofNullable로 한 번 더 체크하는 것은 무의미하다. 

// before
public class OrderService {

    public List<Order> findCustomerOrders(Customer customer, List<Order> orders) {
        if (customer == null || orders == null)
            return Collections.emptyList();

        int customerId = Optional.ofNullable(customer).map(Customer::getId).orElse(0);

        return orders.stream()
                .filter(Objects::nonNull)
                .filter(o -> o.getCustomerId() == customerId)
                .collect(Collectors.toList());
    }
}


// after
public class OrderService {

    public List<Order> findCustomerOrders(Customer customer, List<Order> orders) {
        if (customer == null || orders == null)
            return Collections.emptyList();

        int customerId = customer.getId();

        return orders.stream()
                .filter(Objects::nonNull)
                .filter(o -> o.getCustomerId() == customerId)
                .collect(Collectors.toList());
    }
}