Sobes.tech
Middle

Neden birçok geliştirici MVP mimarisinden vazgeçiyor?

sobes.tech yapay zeka

AI'dan gelen yanıt

  • Boilerplate. View ve Presenter'ı bağlamak için çok kod: View için arayüzler, Presenter uygulaması, yaşam döngüsü yöneticileri.
  • Presenter test zorluğu. Presenter'ı test etmek için genellikle View'un mock edilmesi gerekir, bu da karmaşık ve bağımlılıkları olabilen bir yapı olabilir.
  • Durumun korunmasında sorunlar. Konfigürasyon değişikliklerinde (örneğin ekran döndürmede) Presenter'ın durumunu manuel olarak kaydetmek ve geri yüklemek gerekebilir, bu da zahmetli olabilir.
  • Kötü ölçeklenebilirlik. Ekranın karmaşıklığı arttıkça, Presenter ağırlaşabilir ve bakımı zor hale gelir.
  • View ve veriler arasında doğrudan bağlantı yok. View, verilere doğrudan erişemez, tüm istekler Presenter üzerinden geçer, bu da basit işlemleri zorlaştırabilir.

MVP'de boilerplate gösteren kod örneği:

// View arayüzü
interface MyView {
    fun showData(data: List<String>)
    fun showError(message: String)
}

// Presenter arayüzü
interface MyPresenter {
    fun attachView(view: MyView)
    fun detachView()
    fun loadData()
}

// Presenter uygulaması
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() {
        // Veri yükleme simülasyonu
        val data = model.getData()
        view?.showData(data)
    }
}

// Activity'de kullanım örneği
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>) {
        // UI güncellemesi
    }

    override fun showError(message: String) {
        // Hata gösterimi
    }
}