validateUserInputNumber(input:) : 0과 3사이의 값이 아닐때, user input을 Bool형태로 검증해주는 함수
makeStringToInt : String 타입의 input값을 Int로 변환해주는 함수
setHandTypeForRockScissorPaper(userHandnumber:Int) : 유저 손 타입과 컴퓨터 손 타입을 지정해주는 함수
compareHandsForRockScissorPaper(hands:) : 유저 손 타입과 컴퓨터 손 타입을 비교해주고 결과를 출력해주는 함수. 비길 시 game을 재귀하여 재 실행하고, 이기거나 질 경우 playMukZipa를 지정된 턴과 함께 실행함.
playMukZiPa(turn:) : 사용자 혹은 컴퓨터의 턴에 따라 묵찌빠 게임을 실행하는 함수
printMukZiPaMenu : 묵찌빠 메뉴를 출력하는 함수
userInput() : user input을 get하는 함수
validateUserInputNumber(input:) : 0과 3사이의 값이 아닐때, user input을 Bool형태로 검증해주는 함수
makeStringToInt : String 타입의 input값을 Int로 변환해주는 함수
setHandTypeForMukZiPa(userHandnumber:Int) : 묵찌빠 순서에 따른 유저 손 타입과 컴퓨터 손 타입을 지정해주는 함수
compareHandsForMukZiPa(hands:) : 유저 손 타입과 컴퓨터 손 타입을 비교해주고 결과를 출력해주는 함수. 비길 시 현재 턴의 플레이어가 승리함을 프린트함. 이기거나 질 경우 playMukZipa를 지정된 턴과 함께 실행하여 누군가가 묵찌빠에서 승리할때까지 재귀함.
7. 트러블 슈팅
switch 문 활용: 저희가 공식 문서를 읽던 중 새로운 방법으로 분기를 할 수 있게 되었습니다. 변경된 로직은 다음과 같습니다
이전에는 공식문서를 읽기 전이어서, 모든 userHand와 computerHand의 경우의 수를 switch내의 if문으로 처리해주려고 했는데, 공식 문서를 읽은 후 깨달음을 얻어 다른 로직으로 작성할 수 있었습니다.
이전에 생각했던 로직
if userHand == computerHand {print("비겼습니다!")playRockScissorPaper()return}
switch userHand {case.scissor:
if computerHand ==.rock {print("졌습니다!")}else{print("이겼습니다!")}case.rock:
if computerHand ==.paper {print("졌습니다!")}else{print("이겼습니다!")}case.paper:
if computerHand ==.scissor {print("졌습니다!")}else{print("이겼습니다!")}}
공식 문서를 읽은 후 수정한 로직
lethands=(userHand, computerHand)
switch hands {caselet(user, computer)where user == computer:print("비겼습니다!")playRockScissorPaper()case(.scissor,.paper),(.paper,.rock),(.rock,.scissor):print("이겼습니다!")default:print("졌습니다!")}
함수 기능 분리
하나의 함수에서 입력, 검증, 타입변환을 모두 수행하였는데 네이밍과 함수 내부에서 수행하는 작업이 일치하지 않다는 생각을 하게 되어서 3가지 기능을 모두 다른함수로 분리하였다.
getUserNumberWithValidation() -> userInput(), validateUserInputNumber(), makeStringToInt()로 분리
8. 배운점
네이밍:
set, get: get의 경우 생략해주는 것이 좋고, set의 경우에는 fetch, request, perform을 사용해주는 것이 좋지만 왕도는 아니다.
줄임말: 줄임말은 사용을 자제하고, 최대한 설명을 해주는 편이 읽는 사람에게 편하다.
명확한 기능에 따른 네이밍: 두가지 기능을하는데 한가지 기능만 설명되어 있는 함수 등은 지양하는 것이 좋고, 하나의 함수에 하나의 기능만 넣는 편이 좋다.
switch문의 활용:
단순히 값을 switch하는 것을 넘어서 값을 할당(let)하여 where로 비교해줄 수 있다는 점을 공식문서를 읽으며 추가적으로 배웠다. switch가 복잡한 분기에서 if보다 효율적인 사용이 될 수 있다는 것을 배울 수 있었다.
공식문서의 중요성:
안다고 자만하지 않고, 천천히 공식문서를 읽어보면서 놓쳤던 부분을 짚어보며 새로운 코드들을 작성해 볼 수 있었다.