관리 메뉴

김종권의 iOS 앱 개발 알아가기

[Refactoring] 7-7. 기능 이동 (함수 이동, 중첩함수 제거, 모듈성) - 반복문 쪼개기 본문

Refactoring (리펙토링)

[Refactoring] 7-7. 기능 이동 (함수 이동, 중첩함수 제거, 모듈성) - 반복문 쪼개기

jake-kim 2023. 4. 27. 01:33

반복문 쪼개기 개념

  • 그저 두 일을 한꺼번에 처리할 수 있어서 한 반복문 안에 두 가지의 일을 처리하는 경우가 있는데, 이렇게되면 반복문을 수정할 때 마다 두 가지 일 모두를 이해하고 진행해야 하므로, 분리해둘때 더욱 리펙토링이 용이
// 하나의 반복문에서 두 가지의 일 (averageAge, totalSalary를 처리하는 상황)

struct Person {
    var age = 1
    var salary = 2
}

var averageAge = 0
var totalSalary = 0
let people = [Person(), Person(), Person()]

for p in people {
    averageAge += p.age
    totalSalary += p.salary
}

averageAge /= people.count

print(averageAge, totalSalary)

반복문 쪼개기

  • 반복문 쪼개기로 리펙토링
    • 반복문이 분리되어 각 반복문 안의 하나의 동작만 이해하면됨
    • 반복문을 두 번 실행해야 하므로 안좋게 생각할 수 있지만, 해당 리펙토링의 진정한 의미는 하나의 반복문에서 하나만 고려할 수 있다는 것이고, 이렇게 된다면 해당 코드 뭉치를 함수로 뺄 수 있다는 의미
struct Person {
    var age = 1
    var salary = 2
}

var averageAge = 0
let people = [Person(), Person(), Person()]

for p in people {
    averageAge += p.age
}

var totalSalary = 0
for p in people {
    totalSalary += p.salary
}

averageAge /= people.count
print(averageAge, totalSalary)
  • 최적화
    • 리펙토링을 통해 반복문에서 하나만 고려하게 되었으므로 이 코드 뭉치를 함수로 뺄 수 있음
struct Person {
    var age = 1
    var salary = 2
}

let people = [Person(), Person(), Person()]

var averageAge = getSumOfAge()
var totalSalary = getSomOfSalary()

averageAge /= people.count
print(averageAge, totalSalary)

func getSumOfAge() -> Int {
    var sum = 0
    for p in people {
        sum += p.age
    }
    return sum
}

func getSomOfSalary() -> Int {
    var sum = 0
    for p in people {
        sum += p.salary
    }
    return sum
}

정리

  • 하나의 반복문에서는 하나만 처리하도록 리펙토링
    • 반복문이 여러개 생성되어 이 리펙토링은 비효율으로 비춰질수 있으나, 하나의 반복문에서 하나만 처리하므로 더욱 이해하기 쉽고 함수로 빼는 최적화를 통해 더욱 좋은 코드를 만들 수 있음
  • 하나만 처리하도록 되면 하나의 함수로 뺄 수 있고, 함수로 빼고 수정하면 완료

* 참고

- Refactoring (Marting Flowler)

Comments