Sobes.tech
Middle

MVVM (Model-View-ViewModel) desenini anlat.

sobes.tech yapay zeka

AI'dan gelen yanıt

MVC (Model-Görünüm-Denetleyici).

Bileşen Açıklama Sorumluluk
Model Uygulamanın verilerini ve iş mantığını temsil eder. Görünüm veya ViewModel'den bağımsızdır. Verilerin yönetimi, iş kuralları, sunucu/veritabanı ile etkileşim.
View Kullanıcı arayüzü. Verileri gösterir ve kullanıcı eylemlerini ViewModel'e iletir. Veri işleme mantığı içermez. Bilgi gösterimi, kullanıcı olaylarının (dokunuşlar, kaydırmalar vb.) yönetimi.
ViewModel Model ile View arasında aracıdır. Görünüm için uygun biçimde veriler sağlar ve kullanıcı eylemlerini işler, Model ile etkileşime geçer. Görünümün kullanılıp kullanılmadığını bilmez, sadece veri bağlama yoluyla iletişim kurar. Model'den gelen verileri View için dönüştürmek, kullanıcı etkileşimlerini yönetmek, UI ile ilgisi olmayan iş mantığı.

Temel ilkeler:

  • Veri Bağlama: View ve ViewModel arasında veri bağlama. ViewModel'deki veriler değiştiğinde, View otomatik olarak güncellenir ve tersi de geçerlidir.
  • Test Edilebilirlik: ViewModel, UI çerçevesine bağlı olmadığı için kolayca test edilebilir.
  • Sorumlulukların Ayrılması: Bileşenlerin rollerinin net ayrımı.

Avantajlar:

  • Geliştirilmiş test edilebilirlik.
  • Daha temiz sorumluluk ayrımı.
  • Karmaşık UI ile çalışırken kod tabanını basitleştirme.

Dezavantajlar:

  • Basit uygulamalar için fazla olabilir.
  • Üçüncü taraf framework'ler olmadan Veri Bağlama'nın uygulanması (örneğin, RxSwift, Combine) karmaşık olabilir.

Örnek yapı:

// Model
struct User {
    let name: String
    let age: Int
}

// ViewModel
class UserViewModel {
    private let user: User

    init(user: User) {
        self.user = user
    }

    var displayName: String {
        return user.name
    }

    var displayAge: String {
        return "\(user.age) yaşında"
    }

    // Kullanıcı eylemlerini işleme metodu
    func userTapped() {
        print("Kullanıcı \(user.name) tıklandı")
        // Model veya başka bir mantıkla etkileşime geçebilir
    }
}

// Görünüm (UIViewController)
class UserViewController: UIViewController {

    private var viewModel: UserViewModel!

    @IBOutlet weak var nameLabel: UILabel!
    @IBOutlet weak var ageLabel: UILabel!

    func configure(with viewModel: UserViewModel) {
        self.viewModel = viewModel
        updateUI()
    }

    private func updateUI() {
        // Veri Bağlama (örnek manuel bağlama)
        nameLabel.text = viewModel.displayName
        ageLabel.text = viewModel.displayAge
    }

    @IBAction func tapGestureRecognized(_ sender: Any) {
        viewModel.userTapped()
    }
}