Как лучше всего передавать результаты и ошибки в Android? - PullRequest
1 голос
/ 30 октября 2019

У меня есть класс DOMAIN, который будет обрабатывать всю бизнес-логику и проверки приложения. Кроме того, домен должен взаимодействовать с МОДЕЛЬЮ ПРОСМОТРА.

enter image description here

Допустим, в классе домена есть функция с именем validate_login , котораябудет вызван ВМ. Он выполнит несколько простых проверок, вызов API и вернет результат.

1. Использование TRY CATCH

class Domain{

    fun validateLogin(email:String?,password:String?):LoginModel{
        if(email.isNullOrBlank()){
            throw CustomException("Please provide the email address.",TAG_EMPTY_EMAIL)
        }else if(!email.isValidEmail()){
            throw CustomException("Invalid email address.",TAG_INVALID_EMAIL)
        }else if(password.isNullOrBlank()){
            throw CustomException("Please provide the password.",TAG_EMPTY_PASSWORD)
        }else{
            var loginModel = makeTheAPICall()
            return loginModel
        }
    }

}

В VM мы сможем обрабатывать исключения, используя try-catch.

class ViewModel{
    var domain = Domain()

    fun calling_validate_login(){
        try {
            var returnedLoginModel = domain.validateLogin("test@hmail.com","Password")
        }catch (exception:CustomException){
            when(exception.code){
                TAG_EMPTY_EMAIL->{}
                TAG_INVALID_EMAIL->{}
                TAG_EMPTY_PASSWORD->{}
                else -> {}
            }
        }
    }
}

2. Использование МОДЕЛИ

Здесь мы создадим модель для связи между доменом и виртуальной машиной.

class DomainStatusModel(
  var status: Int = -1,
  var resultObject:Any?=null
)

Теперь вместо создания исключений мы будем использовать вышеупомянутый класс модели внутри. домен. Мы просто назначим статус для ошибок проверки. Также после вызова API возвращаемый объект присваивается тому же классу модели.

class Domain{

    fun validateLogin(email:String?,password:String?):DomainStatusModel{
        val domainStatusModel = DomainStatusModel()
        if(email.isNullOrBlank()){
            domainStatusModel.status = DomainStatus.Validation.General.EMAIL_NULL
        }else if(!email.isValidEmail()){
            domainStatusModel.status = DomainStatus.Validation.General.EMAIL_INVALID
        }else if(password.isNullOrBlank()){
            domainStatusModel.status = DomainStatus.Validation.General.PASSWORD_NULL
        }else{
            var loginModel = makeTheAPICall()
            domainStatusModel.status = DomainStatus.API.Success
            domainStatusModel.resultObject = loginModel
        }
        return domainStatusModel
    }

}

Внутри виртуальной машины мы не хотим использовать try-catch.

class ViewModel{
    var domain = Domain()

    fun calling_validate_login(){
            var returnedDomainStatusModel = domain.validateLogin("test@hmail.com","Password")
            when(returnedDomainStatusModel.status){
                DomainStatus.Validation.General.EMAIL_NULL->{}
                DomainStatus.Validation.General.EMAIL_INVALID->{}
                DomainStatus.Validation.General.PASSWORD_NULL->{}
                DomainStatus.API.Success->{}
            }
        }
    }
}

Итак, вопрос в том, как лучше всего справиться с такой ситуацией? Используя try-catch, модель или любой другой способ сделать это?

...