프로그래밍 초식 : for 문에서 하는 두가지 일 분리

Donghun Seol·2023년 4월 25일
0

프로그래밍 초식

목록 보기
7/13

레퍼런스

일반적인 for 루프 구조

처음엔 한가지 작업만 수행하는 for 루프였다.

그러나 항상 문제는 기능 추가 또는 변경시에 발생한다.

// version 1
const results: Result[] = [{...}, {...}, {...}];
for (let result of results) {
  const modification = doSome(result);
  result.apply(modification)
}


// version 2
for (let result of results) {
  const modification = doSome(result);
  if (!modification) {
    const transform = doTransform(result);
    result.apply(transform)
  }
}

// version 3
for (let result of results) {
  const modification = doSome(result);
  result.apply(modification)
  if (!modification) {
    const transform = doTransform(result);
    result.apply(transform)
  }
  externalStorage.save(result)
}

여러가지 일을 하나의 for 루프에서 수행하면?

서로 다른 목적을 가진 코드가 뒤섞인다. 따라서 코드의 복잡도가 증가하여, 이해가 어려워지고 유지보수성이 떨어진다.

그래서 for 루프 기능단위로 분리해야 한다.
기능단위로 분리된 for 루프의 내부는 별도의 함수로 추출하기 편해진다.
추출한 함수명을 선언적으로 지으면 가독성이 더더욱 향상된다.
관련 계산 로직이 함수안에만 존재하므로, 기능추가와 테스트가 더욱 편해진다.

개선

// version 3 refactored
modificationResults: boolean[] = []
for (let result of results) {
  const modification = doSome(result);
  result.apply(modification)
  modificationResults.push(!!modification)
}

for (let result of modificationResults) {
  const transform = doTransform(result);
  result.apply(transform)
  // 아래와 같이 함수화 시키기 용이하다. 테스트도 더욱 간단.
  applyTransformation(result)
}

for (let result of results) {
  externalStorage.save(result)
}

function applyTransformation(result) {
  const transform = doTransform(result);
  result.apply(transform)
}

근데 성능은? O(N)이 O(3N)으로 바뀌었는데? 문제가 되진 않을까?

좋은 코드의 요건은 성능보다 가독성 이다. 따라서 일단 가독성 좋게 작성하는 것이 먼저.
나중에 진짜 성능이 문제가 된다면 (프로파일링을 통해 확인 가능하다면), 그 때 개선하면 된다.

profile
I'm going from failure to failure without losing enthusiasm

1개의 댓글

comment-user-thumbnail
2023년 5월 13일

sample mocking comment for api test

답글 달기