변경 전 코드 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): SignUpErrorMessage? {
return when {
name.isEmpty() -> SignUpErrorMessage.NAME
name.includeSpecialCharacters() -> SignUpErrorMessage.NAMESPECIAL
else -> null
}
}
SignUpActivity.kt
private fun getMessageErrorName(): String? {
val errorCode = viewModel.getMessageErrorName(inputName.text.toString())
return 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)
이런식으로 간략하게 나타낼수 있게되었다.
코드를 유닛화해서 재사용성을 높이기
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에 유저 회원가입정보를 옮기는등 데이터와 관련된건 뷰 모델에서 수행하면됨