Notice
Recent Posts
Recent Comments
Link
관리 메뉴

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

[Refactoring] 9-2. 조건부 로직 최소화 (조건문 통합하기) 본문

Refactoring (리펙토링)

[Refactoring] 9-2. 조건부 로직 최소화 (조건문 통합하기)

jake-kim 2023. 5. 29. 00:52

조건문 통합하기

  • 비교하는 조건이 다르지만 그 결과로 수행하는 동작들에 대해서 조건부 코드를 나누지 말고 하나로 통합하는 것

조건문 통합하기

리펙토링 전)

struct Employee {
    let salary: Int
    let month: Int
    let isPartTime: Bool
}

let employee1 = Employee(salary: 3, month: 12, isPartTime: false)

// Refactoring 전
func returnSome() -> Int {
    if employee1.salary > 2 {
        return 0
    }

    if employee1.month > 5 {
        return 0
    }

    if employee1.isPartTime {
        return 0
    }
    
    return 1
}

리펙토링 후)

func someCondition() -> Bool {
    return employee1.salary > 2
            || employee1.month > 12
            || employee1.isPartTime
}

func returnSome_refactor() -> Int {
    someCondition() ? 0 : 1
}
  • 조건부 코드를 나누지 않고 하나로 묶어야하는 이유
    • 비교하는 조건이 다르지만 그 결과로 수행하는 동작은 똑같다면, 조건부를 읽는 개발자는 독립된 검사들을 수행하는 것이라고 오해 발생하지만, 하나로 묶으면 조건문의 이유를 명확히 파악 가능
    • 조건부를 하나로 묶어놓으면 함수 추출하기 리펙토링의 효과가 있는 장점
      * 함수 추출하기: 의도가 훨씬 분명하게 드러나고, '무엇'을 하는던 코드를 '왜'하는지를 말해주는 효과

조건부 로직 최소화 예시

  • and 조건이 중첩되어 있을땐 하나로 합치기
// refactoring 전

func ex2() -> Int {
    if employee1.onVacation {
        if employee1.salary > 1 {
            return 0
        }
    }
    return 1
}
  • 리펙토링 수행
    • 함수로만들면 더욱 좋은 코드 (코드를 표현할때 '무엇을' 말해주는게 아닌, '왜'를 말해주어야 이해가 잘 되는 코드를 유지할 수 있음)
func ex2_refactor() -> Int {
    if (employee1.onVacation)
        && employee1.salary > 1 {
        return 0
    }
    return 1
}

* 참고

- Refactoring (Martin Flowler)

Comments