(※ 실제 코드 유출 방지를 위해 약간의 코드 변형을 하였습니다.)
아래 코드는 사용자의 상태에 따라 UI에 그려줄 화면을 지정하는 함수이다.
func checkViewState() {
if let userData = AuthManager.sharedInstance.getUserData() {
if userData.member {
if let _ = userData.memberId {
self.userData = userData
viewState = .main(userData: userData)
} else {
viewState = .launch
}
} else {
viewState = .verificationWait
}
} else {
viewState = .intro
}
}
func checkViewState() {
if let userData = AuthManager.sharedInstance.getUserData() {
setViewStateIfIsMember(userData)
} else {
viewState = .intro
}
}
func setViewStateIfIsMember(_ userData: UserData) {
if userData.member {
setViewStateIfMemberIdExists(userData)
} else {
viewState = .verificationWait
}
}
func setViewStateIfMemberIdExists(_ userData: UserData) {
if let _ = userData.memberId {
self.localData = localData
viewState = .main(localData: localData)
} else {
viewState = .launch
}
}
// setViewStateIfMemberIdExists()에 대한 테스트 코드
func testSetViewStateIfMemberIdExists() {
let localData = LocalData(accessToken: accessToken, accountId: accountId, zoneIds: zoneIds, activeZoneId: activeZoneId, member: true, memberId: 123, activeZoneName: activeZoneName, activeZoneType: activeZoneType, addressDetailACode: addressDetailACode, addressDetailAName: addressDetailAName, addressDetailB: addressDetailB, username: nil, apartmentResident: false, sendbirdAccessToken: nil, invalidInfo: nil, isWewootCrew: isWewootCrew)
viewModel.setViewStateIfMemberIdExists(localData)
let exp: WewootAppViewState = .main(localData: localData)
XCTAssertEqual(viewModel.viewState, exp)
}
func testSetViewStateIfMemberIdNotExists() {
let localData = LocalData(accessToken: accessToken, accountId: accountId, zoneIds: zoneIds, activeZoneId: activeZoneId, member: true, memberId: nil, activeZoneName: activeZoneName, activeZoneType: activeZoneType, addressDetailACode: addressDetailACode, addressDetailAName: addressDetailAName, addressDetailB: addressDetailB, username: nil, apartmentResident: false, sendbirdAccessToken: nil, invalidInfo: nil, isWewootCrew: isWewootCrew)
viewModel.setViewStateIfMemberIdExists(localData)
let exp: WewootAppViewState = .launch
XCTAssertEqual(viewModel.viewState, exp)
}
코드를 수정하기 전에는 '나한테는' 익숙했기 때문에 인식하지 못한 문제였지만, Bad Practice의 코드는 다른 팀원들과의 협업 및 유지보수 관점에서 좋지 못한 코드임을 느끼게 되었다.
함수를 작게 분리하는 것이 생각보다 개발 초보자들한테는 익숙하지 않은 것 같아서 꾸준히 작게, 더 작게 만드려는 노력을 해야겠다.