코드리뷰 멘토링을 받으면서, 내 코드에 아직 하드코딩으로 처리되어 있는 부분이 많다는 것을 느꼈다. 이번 기회에 오늘 피드백 받은 내용을 리팩토링 하면서 확장성있는 코드를 만드는 연습을 해보기로 했다.

기록으로 안남기면 까먹을 것 같아서..! go go!

확장성 높은 코드 만들기

주사위의 결과값을 sum 이라는 프로퍼티에 계속 더하는 간단한 반복문이다. 하지만 만약 주사위를 던져서 나올 수 있는 범위가 1에서 8까지라면? 20까지라면?? 다시 1...6 으로 표현한 곳을 찾아서 일일이 변경을 해주어야 한다.

// 기존 코드
for _ in 1...diceCount  {
    sum += Int.random(in: 1...6)
}

이렇게 직접적으로 숫자를 사용하기보단, 프로퍼티를 활용해서 조금 더 재사용 가능한 코드를 만들 수 있다.

// 수정한 코드 
private var rangeOfDiceValue: ClosedRange<Int> = 1...6

for _ in 1...diceCount  {
    sum += Int.random(in: rangeOfDiceValue)
}

의존성 주입!

하지만 아직도 뭔가 부족한 느낌이 든다! 만약 player마다 나올수 있는 주사위의 범위가 다르다면?? 이러한 경우는 의존성 주입을 활용해서 해결할 수 있다.

// 수정한 코드 
private var rangeOfDiceValue: ClosedRange<Int>

for _ in 1...diceCount  {
    sum += Int.random(in: rangeOfDiceValue)
}

init( ... , rangeOfDiceValue: ClosedRange<Int> = 1...6) { 
		...
    self.rangeOfDiceValue = rangeOfDiceValue
}

이렇게 의존성 주입을 활용하면, 조금 더 유연한 코드를 만들 수 있다. 자세한 내용이 궁금하다면 👉 (Swift) Dependency Injection, 의존성 주입이란? (feat. DIP)

Player 모델의 역할과 접근 권한

처음에 코드를 구현할 때에는, 모델이면 딱 데이터(프로퍼티)만 들고 있어야 하는게 아닐까? 라는 생각을 가지고 있었다. 그래서 기존의 코드를 보면 모든 모델들이 정말 데이터만 가지고 있는 방식으로 구현되어있다.

// 기존 코드
struct Player {
    var id: String
    var name: String
    var diceCount: Int
}