Sobes.tech
Middle

Povedzte viac o vzoreci MVP (Model-View-Presenter).

sobes.tech AI

Odpoveď od AI

MVP rozdeľuje aplikáciu na tri vzájomne pôsobiace komponenty:

  • Model: Riadi údaje aplikácie a obchodnú logiku. Nezávisí od používateľského rozhrania.
  • View: Zobrazuje údaje používateľovi a spracováva jeho vstup. Je pasívna a neobsahuje rozhodovaciu logiku.
  • Presenter: Pôsobí ako sprostredkovateľ medzi Modelom a View. Získa údaje od Modelu a ich formátuje pre View. Reaguje na udalosti View a aktualizuje Model. View odkazuje na Presenter a Presenter na View cez rozhranie.

Výhody MVP:

  • Odolnosť voči zmenám UI: Logika je v Presenter, ktorý nie je závislý od konkrétnej implementácie View.
  • Testovateľnosť: Presenter je ľahko testovateľný v izolácii, bez potreby mockovania UI.
  • Rozdelenie zodpovedností: Jasné rozdelenie rolí medzi komponentami zlepšuje udržiavateľnosť kódu.

Príklad:

// Rozhranie View
interface MainView {
    fun showData(data: String)
    fun showError(message: String)
}

// Presenter
class MainPresenter(private val view: MainView, private val model: MainModel) {

    fun loadData() {
        val data = model.getData()
        if (data != null) {
            view.showData(data)
        } else {
            view.showError("Chyba pri načítaní dát")
        }
    }
}

// Model
class MainModel {
    fun getData(): String? {
        // Načítanie dát
        return "Ukážkové dáta"
    }
}

// Aktivita (Implementácia View)
class MainActivity : AppCompatActivity(), MainView {

    private lateinit var presenter: MainPresenter
    private lateinit var textView: TextView

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        textView = findViewById(R.id.textView)

        val model = MainModel()
        presenter = MainPresenter(this, model)
        presenter.loadData()
    }

    override fun showData(data: String) {
        textView.text = data
    }

    override fun showError(message: String) {
        textView.text = message
    }
}