Sobes.tech
Middle

Parla più dettagliatamente del pattern MVP (Model-View-Presenter).

sobes.tech AI

Risposta dell'AI

L'MVP divide l'applicazione in tre componenti interattive:

  • Model: Gestisce i dati dell'applicazione e la logica di business. Non dipende dall'interfaccia utente.
  • View: Mostra i dati all'utente e gestisce il suo input. È passiva e non contiene logica decisionale.
  • Presenter: Funziona da intermediario tra Model e View. Riceve dati dal Model e li formatta per la View. Risponde agli eventi della View e aggiorna il Model. La View si riferisce al Presenter, e il Presenter alla View tramite un'interfaccia.

Vantaggi di MVP:

  • Resistenza alle modifiche dell'UI: La logica si trova nel Presenter, che non dipende da un'implementazione specifica della View.
  • Testabilità: Il Presenter è facile da testare in isolamento, senza dover simulare l'UI.
  • Separazione delle responsabilità: La chiara divisione dei ruoli tra i componenti migliora la manutenibilità del codice.

Esempio:

// Interfaccia 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("Errore nel caricamento dei dati")
        }
    }
}

// Model
class MainModel {
    fun getData(): String? {
        // Caricamento dati
        return "Dati di esempio"
    }
}

// Attività (Implementazione della 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
    }
}