[리팩토링] 악취 13 : 반복문

 

✍️ 악취 13 : 반복문

프로그래밍 언어 초기엔 for와 while을 사용해서 반복문을 구현했지만, 비교적 최근 Java와 같은 언어에서 함수형 프로그래밍을 지원하게 되며 반복문의 대안인 파이프라인이 등장했다. Java의 Stream이 대표적인 예시인데, Collection의 Stream을 열고 중개 오퍼레이션을 호출하며 연산을 수행하는 일련의 흐름을 Stream pipeline이라 부른다. 파이프라인을 사용하면 코드가 간결해지고 의도가 명확하게 드러나 가독성이 증가한다는 장점이 있기에 충분히 활용할만하다.

 

하지만 파이프라인이 고전적인 반복문보다 항상 좋다고 말하긴 어렵다. 반복문이 보다 효율적이고 가독성이 좋은 경우는 무수히 많기에 적절한 판단을 거쳐서 사용해야 한다.

 

여기 반복문 악취를 해결하기 위한 리팩토링 기법이 있다.

1. "반복문을 파이프라인으로" 파이프라인 오퍼레이션으로 의도를 명확하게

 

🍊 반복문을 파이프라인으로 바꾸기

Java 기준, 고전적인 반복문을 Stream과 중개 오퍼레이션을 사용해서 구현한다면 코드의 가독성이 증가한다.

 

고전적인 반복문으로 구현된 코드를 Stream pipeline 형태로 변경해 보자. 

@AllArgsConstructor
@Getter
public class Employee {

    private int id;

    private String type;
}
public class EmployeeService {

    public List<Integer> findManagerIds(List<Employee> employees){
        List<Integer> managerIds = new ArrayList<>();

        for(Employee employee : employees){
            if(employee.getType().equals("manager")){
                managerIds.add(employee.getId());
            }
        }

        return managerIds;
    }
}

 

public class EmployeeService {

    public List<Integer> findManagerIds(List<Employee> employees){
       return employees.stream()
               .filter(e->e.getType().equals("manager"))
               .map(Employee::getId)
               .collect(Collectors.toList());
    }
}