TIL - 2021.02.23 (Mon)

Youngwoo Lee·2021년 2월 25일
0

TIL

목록 보기
7/29
post-thumbnail

Today I Learned

학습 내용

  • 코드 설명, 리뷰

캠프 사전 과제로 작성했던 코드를 설명해보고, 리뷰하는 시간을 가졌다. 짧고 간단한 내용의 로직이지만 그 안에 API Design Guide를 준수하지 않았던 점도 있었으며, 메모리적으로 효율적이지 않은 코드를 발견할 수 있었다.

  • 짝 프로그래밍

팀 멤버들끼리 돌아가며 Timer, Navigator, Driver로 역할을 나눠 짝 프로그래밍을 진행하였는데, 아무 협의 없이 바로 진행하다 보니 naming이나 코드의 방향성을 정하기 어려웠다. 릴레이 그림그리기를 하는 느낌이었다. 이전 Navigator의 의도를 파악하기 위해 많이 노력했다.


문제점 / 고민한 점

  • 함수 분리

하나의 함수에 여러 기능을 같이 수행함에 따라 가독성이 떨어지고, 함수의 역할이 명확해지지 않다는 리뷰를 받았다. 그래서 짝 프로그래밍을 하면서 이 부분에 대해 많이 고민했다.

  • 예외 처리

짝 프로그래밍 중 input으로 -1, 0, 1 을 받는 것 외에 Neph가 사전과제에서 제안했던 여러 예외에 대해서 처리하는데 if문을 처음 사용하였는데, 코드 가독성이 떨어져서 가독성을 높이는 간단한 방법을 고민하였다.

  • if let 과 guard

getInput 함수를 통해 입력 값을 받으며 오류처리를 하는 과정에서 if let을 쓰는 것이 맞는지, guard 를 쓰는 것이 맞는지에 대한 고민을 하였다.


해결방안

  • 함수 분리
func printTable(number: Int) {
    // 하나의 구구단 세트 출력
}

func startGame() {
    // 전체 게임 실행
}

func getInput() throws -> Int {
    // input을 받으며 예외사항 처리
}

위와 같이 함수명에 맞게 로직을 작성하여 가독성을 높이고 함수를 명확하게 만들었다.

  • 예외처리
enum inputError: Error {
    case nonNumeric
    case overflow
    case nilInput
    case exitInput
    case unknownError
    case invalidNumber
}

//중략

func startGame() {
    //생략...
    do {
        userInput = try getInput()
        printTable(number: userInput)
    }
    catch {
        switch error {
            case inputError.nilInput:
                print("잘못된 입력입니다.")
            case inputError.nonNumeric:
                print("숫자를 입력해주세요.")
            case inputError.overflow:
                print("입력 가능한 범위를 초과했습니다.")
            case inputError.invalidNumber:
                print("입력값이 잘못되었습니다. 다시 입력해주세요.")
            case inputError.exitInput:
                return
            default:
                print("알수없는 오류")
        }
    }
}

//중략

func getInput() throws -> Int {
    let input = readLine()
    
    guard var safeInput = input else {
        throw inputError.nilInput
    }
    
    if safeInput == "exit" {
        throw inputError.exitInput
    }

    //생략
}

Error handling은 enum Error 프로토콜을 통해 구현했다.

스위프트 개념 공부를 하며 열거형과 Error이 굉장히 유용하게 서로 사용된다는 것을 읽은 기억이 있는데 바로 기억해 적용하지 못한 것이 많이 아쉽다. 개념을 배우는 것보다 직접 구현해보는 것이 중요한 것을 다시 한번 느꼈다..

그리고 Error case 중 overflow 부분은 제대로 구현하지 못하였는데, 이 점을 매우 아쉽게 생각한다. 기본 자료형에 대한 이해가 완벽하지 않은 것 같아 보완이 필요한 것 같다.

  • if let 과 guard

팀원들의 조언과 구글링을 통한 여러 예제를 통해서 해결하였다. if 구문을 사용하면 예외사항을 else 블록으로 처리해야 하지만 예외사항만을 처리하고 싶다면 guard 구문을 사용하는 것이 훨씬 간편하다는 것을 알게됐다.

profile
iOS Developer Student

0개의 댓글