Как я могу уменьшить количество методов в моей деятельности в шаблоне MVP?

Я создаю свое приложение в архитектуре MVP, и у меня возникают проблемы со многими функциями в моей деятельности и презентаторе. Как я могу уменьшить количество методов?

Я уже слышал о некоторых решениях:

  • Разделите большого ведущего на более мелкие, но тогда мне придется создать другие методы в своей деятельности для подключения ведущих.
  • Создайте новый класс и создайте его экземпляр в моей деятельности, который будет реализовывать интерфейс View и потребует все представления, необходимые для управления докладчиками. Но я не убежден в этом решении. Я думаю, что это может добавить еще один беспорядок в мою архитектуру.

Есть ли у вас другие идеи или преимущества/недостатки описанного выше?


person Patryk Kubiak    schedule 11.06.2019    source источник
comment
почему вы хотите уменьшить количество методов? Можете ли вы поделиться каким-либо кодом, где, по вашему мнению, присутствуют некоторые избыточные методы.   -  person Asad Ali Choudhry    schedule 11.06.2019
comment
Теперь моя активность запускает другие действия, фрагменты, получает разрешения и результаты действий и выполняет множество других основных операций действия. С другой стороны, он также обновляет представление из многих методов интерфейса View. Я хочу разделить эту ответственность.   -  person Patryk Kubiak    schedule 11.06.2019
comment
Один из вариантов — управлять представлениями и связывать компоненты пользовательского интерфейса с вашим кодом, чтобы избежать добавления дополнительных кодов, вы можете использовать привязку данных Android, вот ссылка codelabs.developers.google.com/codelabs/android-databinding/#0   -  person Asad Ali Choudhry    schedule 11.06.2019
comment
Спасибо, это отличное решение, но требует использования LiveData. Для MVP это уменьшит только количество вызовов методов интерфейса Presenter в действии.   -  person Patryk Kubiak    schedule 11.06.2019


Ответы (1)


Существует не только способ уменьшить количество методов в вашем Activity/Fragment.

Один называется наследованием, когда вы можете расширить абстрактные методы в свой основной класс Activity/Fragment и оттуда управлять жизненным циклом.

Например, используя BaseActivity или BaseFragment, вы можете иметь более одного метода внутри него и просто расширить его в свой основной Activity или Fragment.

BaseActivity.kt

abstract class BaseActivity : AppCompatActivity() {

override fun onCreate(savedInstanceState: Bundle?) {
    requestWindowFeature(Window.FEATURE_NO_TITLE)
    window.setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN)
    super.onCreate(savedInstanceState)
    setContentView(getLayout())
}

@LayoutRes
abstract fun getLayout(): Int

fun Context.toast(message: String?, toastDuration: Int = Toast.LENGTH_SHORT) {
    Toast.makeText(this, message, toastDuration).show()
}

override fun onDestroy() {
    super.onDestroy()
    //Do here what you want
}

override fun onStop() {
    super.onStop()
    //Do here what you want
}

override fun onStart(){
    super.onStart()
    //Do here what you want

}

override fun onPause() {
    super.onPause()
    //Do here what you want
}

override fun onRestart() {
    super.onRestart()
    //Do here what you want
}

}

Эта BaseActivity расширяет AppCompatActivity(), это означает, что вы можете управлять жизненным циклом вашего Activity в этом классе, а затем просто расширить его в своем основном Activity, когда вы сделаете это, все функции внутри вашего BaseActivity будет применяться к вашему классу MainActivity, если вы хотите что-то изменить или переопределить, просто вызовите методы из этого абстрактного класса.

MainActivity.kt

class MainActivity : BaseActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        //You dont need setContentView since we do all the configuration in the BaseActivity
      toast("This is a message with a toast since we implemented thi into the BaseActivity we do not need to do toasts all over again")
    }

    override fun getLayout(): Int {
        return R.layout.activity_login_view
    }

//For example, if you want to override the functionallity from a method inside your BaseActivity you can implement it like always

 override fun onRestart() {
        super.onRestart()
        //Replace what BaseActivity onRestart() does
    }

При этом вы можете иметь более 1 метода вашего Activity внутри вашего BaseActivity, это уменьшит количество методов внутри вашего класса, наследуемого от BaseActivity, также, если вам это нужно для работы с Fragments просто расширьте Fragment вместо AppCompatActivity и создайте класс с именем BaseFragment

Кроме того, добавление интерфейса для операций просмотра и операций докладчика — отличный способ организовать наши приложения, вы можете взглянуть на пример, который я делаю для входа в систему, на Github

person Gastón Saillén    schedule 11.06.2019