리팩터링/냄새 (리팩터링할 시점)

냄새 13. 반복문(Loops)

developer-tj 2023. 4. 5. 12:00
반응형

반복문(Loops)을 사용하는 것이 코드 작성의 효율성을 높일 수 있지만, 반복문이 중첩되거나 복잡한 조건문과 함께 사용되는 경우 코드의 복잡성이 증가하고 코드를 이해하기 어려워질 수 있습니다.

반복문의 문제점 중 하나는 다른 로직과 함께 사용되는 경우 유지보수성이 낮아질 수 있다는 것입니다.

예를 들어, 아래의 코드에서 반복문은 사이즈를 계산하고, 각 색상의 평균값을 계산하는 두 가지 다른 로직과 함께 사용됩니다.


int size = 0;
double redSum = 0.0;
double greenSum = 0.0;
double blueSum = 0.0;
for (int i = 0; i < pixels.size(); ++i) {
    size++;
    redSum += pixels[i].red();
    greenSum += pixels[i].green();
    blueSum += pixels[i].blue();
}
double redAverage = redSum / size;
double greenAverage = greenSum / size;
double blueAverage = blueSum / size;


위 코드를 아래와 같이 수정한다면 반복문을 포함하지 않고도 코드의 가독성과 유지보수성을 높일 수 있습니다.


int size = pixels.size();
double redSum = std::accumulate(pixels.begin(), pixels.end(), 0.0,
    [](double sum, const Pixel& p) { return sum + p.red(); });
double greenSum = std::accumulate(pixels.begin(), pixels.end(), 0.0,
    [](double sum, const Pixel& p) { return sum + p.green(); });
double blueSum = std::accumulate(pixels.begin(), pixels.end(), 0.0,
    [](double sum, const Pixel& p) { return sum + p.blue(); });
double redAverage = redSum / size;
double greenAverage = greenSum / size;
double blueAverage = blueSum / size;


위 코드에서는 std::accumulate()를 사용하여 반복문 없이 요소의 합을 계산할 수 있습니다.
이렇게 하면 코드의 가독성이 높아지고, 필요한 로직을 분리할 수 있으며, 재사용성도 높아집니다.
이와 같은 방식으로 반복문을 대체하여 코드를 개선할 수 있습니다.


적용 가능한 리팩터링 기법

  • 반복문을 파이프라인으로 바꾸기(Replace Loop with Pipeline)