Sobes.tech
Junior

MVVM desenini anlat.

sobes.tech yapay zeka

AI'dan gelen yanıt

Model-Görünüm-Model Görünüm (MVVM), kullanıcı arayüzünü (View) iş mantığından (Model) ayıran mimari bir kalıptır ve araya bir ara katman olarak ViewModel kullanır.

  • Model: Uygulamanın verilerini ve iş mantığını temsil eder. Hiçbir UI-özelliği içermez.
  • View: ViewModel'den gelen verileri gösterir ve kullanıcı eylemlerini (örneğin, düğme tıklamaları) ViewModel'e iletir. İş mantığı içermez, sadece gösterim mantığı vardır.
  • ViewModel: Bağlantı görevi görür. Model'den verileri uygun bir biçimde View'e sağlar ve View'den gelen istekleri işler, Model'i günceller. Gösterim mantığını içerir, ancak doğrudan View ile manipüle etmez. Genellikle LiveData veya StateFlow kullanır.

Avantajlar:

  • Sorumlulukların ayrılması: Kodun okunabilirliğini ve bakımını artırır.
  • Test edilebilirlik: ViewModel, Android API'sine bağlı olmadığı için izole edilerek test edilebilir.
  • Yaşam döngüsü desteği: ViewModel, yapılandırma değişikliklerine (örneğin, ekran döndürme) dayanır ve verilerin yeniden alınmasını önler.
  • Modülerliğin artırılması.

Örnek yapı:

// Model (örnek depo)
class UserRepository {
    fun getUsers(): List<User> {
        // ... kullanıcıları alma mantığı ...
        return listOf(User("Alice"), User("Bob"))
    }
}

// ViewModel
class UserViewModel(private val repository: UserRepository) : ViewModel() {
    private val _users = MutableLiveData<List<User>>()
    val users: LiveData<List<User>> = _users

    init {
        loadUsers()
    }

    private fun loadUsers() {
        _users.value = repository.getUsers()
    }
}

// Görünüm (Fragment/Activity)
class UserFragment : Fragment() {
    private val viewModel: UserViewModel by viewModels() // Android KTX delegasyonu kullanımı

    override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
        super.onViewCreated(view, savedInstanceState)

        viewModel.users.observe(viewLifecycleOwner) { userList ->
            // UI güncellemesi (örneğin, RecyclerView adaptörü)
            updateUI(userList)
        }
    }

    private fun updateUI(userList: List<User>) {
        // TextView, RecyclerView vb. güncelleme mantığı
    }
}