Почему мы должны использовать интерфейс в шаблоне MVP для Android?

Я делаю приложение Android с использованием Kotlin в первый раз, используя шаблон MVP. Мой вопрос: зачем мне нужны интерфейсы для View и Presenter, поскольку Kotlin предоставляет функции более высокого порядка? Разве мы не можем просто общаться, используя эти функции более высокого порядка? Плохо ли использование шаблона без интерфейсов?

Я просмотрел и прочитал много статей и руководств, но не ответил на свой вопрос. Является ли то, что я делаю в приведенном ниже коде, неправильной практикой? Может ли кто-нибудь объяснить это мне?

В моей активности

override fun init() {

    btn_login.setOnClickListener {
        LoginPresenter.userLogin(et_emailAddress.text.toString(),et_password.text.toString()){
            if (it){
                //do something
            }else{
                //do something
            }
        }
    }
}

Мой ведущий

object LoginPresenter {

fun userLogin(emailId: String, password: String, completion: (Boolean) -> Unit) {
    //do something
    completion(true)
 }
}

person Mandip Giri    schedule 24.03.2019    source источник
comment
зачем мне интерфейсы для View и Presenter - вам не нужно использовать интерфейсы, однако лучше программировать на абстракции, а не на реализации. Просто подумайте, как это может помочь вам в модульных тестах, или вы измените реализацию — контракт останется прежним. Я бы сказал, что нет смысла использовать интерфейс для докладчика, только вид. Наблюдение: ваш Presenter является синглтоном, он действительно должен быть привязан к Activity. Я не уверен в вашем аргументе в пользу функций более высокого порядка, поскольку вы могли бы указать Consumer<T> в java? Также это нарушает управление потоком MVP.   -  person Mark Keen    schedule 24.03.2019


Ответы (2)


зачем мне нужны интерфейсы для View и Presenter, поскольку Kotlin предоставляет функции более высокого порядка?

Это довольно распространенная практика в разработке программного обеспечения. И хотя вы можете не использовать интерфейсы, существует ряд ключевых моментов, по которым интерфейсы предпочтительнее. С верхней части моей головы:

  1. с интерфейсом вы можете иметь несколько его реализаций, не заботясь о конкретном типе реализации. Это то, чего вам не хватает в функциях более высокого порядка — вы ограничены единственным типом, LoginPresenter, при использовании метода LoginPresenter.userLogin().

  2. большинство шаблонов проектирования основано на отделении интерфейсов от их реализаций. Таким образом, программирование в реализации, а не в абстракции, не позволит вам их использовать.

  3. вы не сможете правильно классы модульного тестирования, которые зависят от других реализаций, поскольку в этом случае невозможно насмешки.

  4. поддержка и расширение кода становится намного сложнее с конкретной реализацией.

person Onik    schedule 24.03.2019

  1. #P1# #P2#
    #P3#
    #P4#

2. Интерфейсы могут содержать несколько функций, для которых вам понадобятся отдельные параметры функции при использовании функций более высокого порядка. Рассмотрим следующий случай,

interface UserLoginInterface {
      fun onLoginSuccess(loggedInUser: User)
      fun onLoginFailure(error: ErrorResponse)
      fun onRedirect(someOtherObjectWithDirectives: SomeDataClass)
 }

Чтобы перевести это на использование функций более высокого порядка, вам нужно будет использовать три параметра функции

person Maran Subburayan    schedule 24.03.2019
comment
Не знал, что использование функций более высокого порядка может привести к снижению производительности. Спасибо. - person Mandip Giri; 25.03.2019