Sobes.tech
Middle

Por que muitos desenvolvedores rejeitam a arquitetura MVP?

sobes.tech IA

Resposta da IA

  • Boilerplate. Muito código para ligar a View e o Presenter: interfaces para a View, implementação do Presenter, manipuladores do ciclo de vida.
  • Dificuldade em testar o Presenter. Para testar o Presenter, muitas vezes é necessário fazer mock da View, que pode ser complexa e ter dependências.
  • Problemas na preservação do estado. Ao alterar a configuração (por exemplo, ao rotacionar a tela), é necessário guardar e restaurar manualmente o estado do Presenter, o que pode ser trabalhoso.
  • Má escalabilidade. À medida que a complexidade da tela aumenta, o Presenter pode tornar-se pesado e difícil de manter.
  • Falta de ligação direta entre a View e os dados. A View não tem acesso direto aos dados, todas as requisições passam pelo Presenter, o que pode complicar operações simples.

Exemplo de código que demonstra um boilerplate em MVP:

// Interface da View
interface MyView {
    fun showData(data: List<String>)
    fun showError(message: String)
}

// Interface do Presenter
interface MyPresenter {
    fun attachView(view: MyView)
    fun detachView()
    fun loadData()
}

// Implementação do Presenter
class MyPresenterImpl(private val model: MyModel) : MyPresenter {

    private var view: MyView? = null

    override fun attachView(view: MyView) {
        this.view = view
    }

    override fun detachView() {
        view = null
    }

    override fun loadData() {
        // Simulação de carregamento de dados
        val data = model.getData()
        view?.showData(data)
    }
}

// Exemplo de uso na Activity
class MyActivity : AppCompatActivity(), MyView {

    private lateinit var presenter: MyPresenter

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

        presenter = MyPresenterImpl(MyModel())
        presenter.attachView(this)
        presenter.loadData()
    }

    override fun onDestroy() {
        super.onDestroy()
        presenter.detachView()
    }

    override fun showData(data: List<String>) {
        // Atualizar UI
    }

    override fun showError(message: String) {
        // Mostrar erro
    }
}