Prawidłowe zastosowanie MVP

Odpowiedz Nowy wątek
2020-03-03 23:13

Rejestracja: 1 miesiąc temu

Ostatnio: 6 dni temu

0

Witam wszystkich. Piszę w sprawie zostosowania MVP w Androidzie. Czytałem trochę artykułów dot. tego wzorca ale postanowiłem że skonsultuje się z Wami. Poniżej mój kod, czy tak powinno byc?

VIEW

class AboutMeView : Fragment(), AboutMePresenter.View {

    lateinit var aboutMePresenter: AboutMePresenter
    lateinit var fragmentView: View
    lateinit var person: Person

    override fun onCreateView(
        inflater: LayoutInflater,
        container: ViewGroup?,
        savedInstanceState: Bundle?
    ): View? {
        fragmentView = inflater.inflate(R.layout.fragment_aboutme, container, false)
        person = (activity as MainActivity).person
        aboutMePresenter = AboutMePresenter(this)
        return fragmentView
    }

    override fun onResume() {
        aboutMePresenter.updateName(person)
        aboutMePresenter.updateBirthdate(person)
        aboutMePresenter.updateCity(person)
        aboutMePresenter.updateCountry(person)
        aboutMePresenter.updateEmail(person)
        aboutMePresenter.updatePhone(person)
        aboutMePresenter.updateDescription(person)
        super.onResume()
    }

    override fun updateFullNameView(fullName: String) {
        fragmentView.person_name.text = fullName
    }

    override fun updateBirthdateView(birthDate: String) {
        fragmentView.person_birth_date.text = birthDate
    }

    override fun updateCityView(city: String) {
        fragmentView.person_city.text = city
    }

    override fun updateCountryView(country: String) {
        fragmentView.person_country.text = country
    }

    override fun updateEmailView(email: String) {
        fragmentView.person_email.text = email
    }

    override fun updatePhoneView(phone: String) {
        fragmentView.person_phone.text = phone
    }

    override fun updateDescriptionView(desc: String) {
        fragmentView.person_description.text = desc
    }

}

PRESENTER

class AboutMePresenter(val view: View) {

    fun updateName(person: Person){
        view.updateFullNameView(person.name + " " + person.surname)
    }

    fun updateBirthdate(person: Person){
        view.updateBirthdateView(person.yearOfBirth.toString())
    }

    fun updateCity(person: Person){
        view.updateCityView(person.city)
    }

    fun updateCountry(person: Person){
        view.updateCountryView(person.country)
    }

    fun updateEmail(person: Person){
        view.updateEmailView(person.mail)
    }

    fun updatePhone(person: Person){
        view.updatePhoneView(person.phone)
    }

    fun updateDescription(person: Person){
        view.updateDescriptionView(person.ownDescription)
    }

    interface View{
        fun updateFullNameView(fullName: String)
        fun updateBirthdateView(birthDate: String)
        fun updateCityView(city: String)
        fun updateCountryView(country: String)
        fun updateEmailView(email: String)
        fun updatePhoneView(phone:String)
        fun updateDescriptionView(desc:String)
    }
}

MODEL

data class Person(var name: String,
                  var surname: String,
                  var city: String,
                  var country: String,
                  var yearOfBirth: Int,
                  var mail: String,
                  var phone: String,
                  var ownDescription: String)

Pozostało 580 znaków

2020-03-04 08:11

Rejestracja: 3 miesiące temu

Ostatnio: 8 godzin temu

0

Taki prezenter jest bez sensu. Prezenter jest po to żeby logika była w prezenter że a nie w aktywności lub fragmencie. Twój prezenter nie ma żadnej logiki. Bo cała twoja przykladowa apka jej nie ma. Więc sensowność takiego prezentera jest wątpliwa.

Tak na szybko tu masz wyjaśnione o Mvp
https://medium.com/mindorks/i[...]o-mvp-on-android-965bb3f97730


edytowany 1x, ostatnio: Roman Mokrzan, 2020-03-04 08:33

Pozostało 580 znaków

2020-03-04 19:30

Rejestracja: 1 miesiąc temu

Ostatnio: 6 dni temu

0

Dzieki za odpowiedź :) Rozumie, że samo zostosowanie tu prezentera jest bezcelowe ponieważ brakuje np. mechanizmu pobierania danych, który by się w nim znajdował. Zakładając np. że takie pozyskiwanie danych będzie po stronie prezentera (jak np. getQuotes() ze wskazanego artykułu) to czy przedstawiona przeze mnie struktura (zastosowanie interfejsu, komunikacja z widokiem itp.) jest prawidłowa?

Pozostało 580 znaków

2020-03-04 19:53

Rejestracja: 2 lata temu

Ostatnio: 8 godzin temu

0

Jest ok jeśli chodzi o sposób komunikacji, ale lepiej by było, żeby prezenter miał na sobie jedną publiczną metodę updatePerson(person: Person) i w niej wywoływał wszystkie funkcje widoku po kolei.

edytowany 2x, ostatnio: Michał Sikora, 2020-03-04 19:53

Pozostało 580 znaków

2020-03-04 20:01

Rejestracja: 3 miesiące temu

Ostatnio: 8 godzin temu

1
mattiah napisał(a):

Dzieki za odpowiedź :) Rozumie, że samo zostosowanie tu prezentera jest bezcelowe ponieważ brakuje np. mechanizmu pobierania danych, który by się w nim znajdował. Zakładając np. że takie pozyskiwanie danych będzie po stronie prezentera (jak np. getQuotes() ze wskazanego artykułu) to czy przedstawiona przeze mnie struktura (zastosowanie interfejsu, komunikacja z widokiem itp.) jest prawidłowa?

Zastosowanie javowego interfejsu to nie jest nic co jest częścią mvp - równie dobrze mógłbyś zastosować local broadcast receiver albo event bus do komunikacji prezenter widok. W Mvp chodzi o oddzielenie logiki od widoku. O nic więcej.


Pozostało 580 znaków

2020-03-04 20:07

Rejestracja: 1 miesiąc temu

Ostatnio: 6 dni temu

0

OK rozumie :) dziękuję Wam za odpowiedzi.

Pozostało 580 znaków

2020-03-07 21:31

Rejestracja: 7 lat temu

Ostatnio: 3 minuty temu

0

Dodam tylko że MVP jest już mało użyteczny w Androidzie. Poczytaj sobie o MVVM i MVI

Co niby zmniejsza użyteczność Mvp? Jak ktoś używa i potrafi to umotywować to czemu nie? - Roman Mokrzan 2020-03-08 09:41
MVVM po prostu lepiej pracuje z cyklem życia androida niż MVP dlatego raczej mało sie już widuje MVP w aplikacjach z androidem - xxx_xx_x 2020-03-08 10:51

Pozostało 580 znaków

Odpowiedz

1 użytkowników online, w tym zalogowanych: 0, gości: 1, botów: 0