24.01.04 view model

KSang·2024년 1월 4일
0

TIL

목록 보기
25/101

View model

유효성검사를 하고 에러메세지를 띄우는 코드

변경 전 코드
SignUpActivity.kt

private fun getMessageErrorName(): String? {
        val text = inputName.text.toString()
        val errorCode = when{
            text.isEmpty() -> SignUpErrorMessage.NAME
            text.includeSpecialCharacters() -> SignUpErrorMessage.NAMESPECIAL
            else -> null
        }
        return errorCode?.let { getString(it.message) }
    }

변경 후
SignUpViewModel.kt

fun getMessageErrorName(name: String) {
    when {
        name.isEmpty() -> SignUpErrorMessage.NAME
        name.includeSpecialCharacters() -> SignUpErrorMessage.NAMESPECIAL
        else -> null
    }
}

SignUpActivity.kt

private fun getMessageErrorName() {
    val errorCode = viewModel.getMessageErrorName(inputName.text.toString())
    errorCode?.let { getString(it.message) }
}

액티비티의 코드가 단순해져서 이름,아이디,비밀번호등 유효성 검사가 차이가 났는데 유효성 검사를 뷰모델에서 하니 코드들이 매우 유사해짐

private fun getMessageError(
        input: EditText,
        getMessageError: (String) -> SignUpErrorMessage?
    ): String? {
        val errorCode = getMessageError(input.text.toString())
        return errorCode?.let { getString(it.message) }
    }
    private fun getMessageErrorName() = getMessageError(inputName, viewModel::getMessageErrorName)
    private fun getMessageErrorId() = getMessageError(inputId, viewModel::getMessageErrorId)
    private fun getMessageErrorEmail() = getMessageError(inputEmail, viewModel::getMessageErrorEmail)
    private fun getMessageErrorEmailId() = getMessageError(inputEmailId, viewModel::getMessageErrorEmailId)
    private fun getMessageErrorPassword() = getMessageError(inputPassword, viewModel::getMessageErrorPassword)

이런식으로 간략하게 나타낼수 있게되었다.

코드를 유닛화해서 재사용성을 높이기

Data에 유저 정보를 추가 or 수정하는 코드

private fun setSignButtonSendData() {
        signBtn.setOnClickListener {
            name = inputName.text.toString()
            if (inputId.isVisible) id = inputId.text.toString()
            password = inputPassword.text.toString()
            email = StringBuilder()
            viewModel.setSendData(
                name, id, inputEmailId.text.toString(),
                inputEmail.text.toString(), password, inputId.isVisible
            )
            val sendData = intent.apply {
                putExtra("id", id)
                putExtra("password", password)
            }
            setResult(RESULT_OK, sendData)

            if (!isFinishing) finish()
        }
    }
fun setSendData(name:String,id:String,emailId: String,emailService:String,password: String, idVisible: Boolean) {
        val email = StringBuilder()

        email.append(emailId)
        email.append("@")
        email.append(emailService)
        if (idVisible.not()) {
            UserList.userList.find { it.id == id }?.let {
                it.name = name
                it.password = password
                it.email = email.toString()
            }
        } else {
            val newUser = User(name, id, password, email.toString())
            UserList.userList.add(newUser)
        }
    }
private fun setTextChangedListener() {
        editTexts.forEach { editText ->
            editText.addTextChangedListener {
                editText.setErrorMessage()
                setConfirmButtonEnable()
            }
        }
    }

이런건 뷰와 관련된 코드기 때문에 뷰모델에 쓰긴 적합하지않음
그냥 액티비티에서 실행시키게 하면됨

editText, button, onfocus, textChangedListener, onClickButton등은 View와 관련된 코드라 액티비티에서 수행하고

예를 들어 ID를 적는 etId 에 사용자가 입력한 값(데이터)이 어떤지 특수문자를 사용했는지, DB에 유저 회원가입정보를 옮기는등
데이터와 관련된건 뷰 모델에서 수행하면됨

0개의 댓글