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
}
}