MVC: Model-View-Controller nümunəsinin mahiyyəti və onun tətbiqi

Müəllif: IT Sectr Dərc olunub: 2026-02-16 Oxuma vaxtı: 9 dəq

MVC (Model-View-Controller) — proqramı üç komponentə bölən arxitektura nümunəsidir: Model məlumatlara və biznes məntiqinə cavabdehdir, View istifadəçi interfeysinə, Controller girişin işlənməsinə və Model ilə View-in koordinasiyasına cavabdehdir. iOS-da MVC UIViewController vasitəsilə, Android-də isə Activity və Fragment vasitəsilə tətbiq olunur. MVC MVVM, MVP və Clean Architecture-nin qurulduğu əsas nümunə olaraq qalır. Ətraflı — MVC in Cocoa Core səhifəsində.

Əsas məqamlar

  • MVC — üç komponent: Model (məlumatlar), View (interfeys), Controller (məntiq)
  • UIViewController — iOS-da Controller-in tətbiqi, ekranın həyat dövrünə cavabdehdir
  • Activity/Fragment — Android-də Controller-in oxşar funksiyalarla tətbiqi
  • Massive View Controller — MVC-nin əsas problemi: kontroller minlərlə sətirə qədər böyüyür
  • Komponentlərin əlaqəsi — Controller View və Model-i yeniləyir, Model dəyişikliklər barədə Controller-ə məlumat verir

MVC nədir: Model-View-Controller nümunəsinin mahiyyəti

MVC (Model-View-Controller) — 1979-cu ildə Trygve Reenskaug tərəfindən Smalltalk-80 dili üçün təklif edilmiş arxitektura nümunəsidir. Nümunə proqramı üç təbəqəyə bölür: Model məlumatları və biznes məntiqini ehtiva edir, View göstərimə cavabdehdir, Controller istifadəçi girişini emal edir və Model ilə View-i yeniləyir. Məsuliyyətin bölünməsi hər təbəqəni müstəqil dəyişməyə imkan verir — məsələn, UIKit-dən SwiftUI-ə View-i dəyişmək Model-də biznes məntiqini dəyişmədən.

Komponentlərin qarşılıqlı əlaqəsi MVC-də dövrü izləyir: istifadəçi View ilə qarşılıqlı əlaqədə olur → Controller hadisəni alır → Controller Model-i yeniləyir → Model dəyişikliklər barədə Controller-ə məlumat verir → Controller View-i yeniləyir. Klassik tətbiqdə Model Observer nümunəsindən istifadə edir: məlumatlar dəyişdikdə Model bildirişlər göndərir, Controller abunə olur və View-i yeniləyir. Apple tətbiqində Key-Value Observing (KVO) və ya NotificationCenter bu rolu oynayır.

KomponentMəsuliyyətiOS-da nümunəAndroid-də nümunə
ModelMəlumatlar, biznes məntiqi, şəbəkəStruct User, CoreDataData class, Repository
ViewUI-nin göstərilməsiStoryboard, XIB, UIViewXML layout, Jetpack Compose
ControllerGirişin işlənməsi, koordinasiyaUIViewControllerActivity, Fragment

MVC müasir mobil inkişafda 10 il əvvəlkindən daha az istifadə olunur, lakin başa düşülməsi məcburidir. Apple sadə UIKit ekranları üçün MVC tövsiyə edir. Google Android üçün təmiz MVC tövsiyə etmir — rəsmi sənədlər MVVM-i Jetpack ilə təklif edir. Lakin MVC bilikləri legacy layihələrlə işləmək və arxitektura nümunələrinin təkamülünü başa düşmək üçün zəruridir.

iOS-da MVC: UIViewController və storyboard

Apple MVC — UIKit-ə quraşdırılmış nümunənin xüsusi tətbiqidir. UIViewController Controller rolunu oynayır: ekranın həyat dövrünü idarə edir (viewDidLoad, viewWillAppear, viewDidDisappear), toxunuşları və istifadəçi hərəkətlərini emal edir, IBOutlets vasitəsilə View-i yeniləyir. View Interface Builder-də (storyboard və ya XIB) və ya proqramlı şəkildə yaradılır. Model — hər hansı məlumat obyektləridir: şəbəkə servisləri, CoreData yığınları, Swift strukturları.

swift
final class UserViewController: UIViewController {
    // View (storyboard outlet vasitəsilə)
    @IBOutlet private var nameLabel: UILabel!
    @IBOutlet private var emailLabel: UILabel!

    // Model
    private let userService = UserService()

    override func viewDidLoad() {
        super.viewDidLoad()
        loadUser()
    }

    private func loadUser() {
        userService.fetchUser { [weak self] user in
            // Controller View-i yeniləyir
            self?.nameLabel.text = user.name
            self?.emailLabel.text = user.email
        }
    }
}

Apple MVC-nin problemi — View və Controller sıx bağlıdır. UIViewController eyni anda həm View-i, həm də məntiqi idarə edir. Storyboard View-i XML-də saxlayır, lakin kontroller IBOutlets vasitəsilə UI elementlərinə birbaşa istinadlara malikdir. Bu, tək məsuliyyət prinsipini pozur: kontroller həyat dövrü, delegatlar, datasource, target-action və animasiyalara cavabdehdir. Nəticədə iOS proqramının standart ekranı kontrollerdə 200–500 sətir ehtiva edir.

ViewController həyat dövrü — Apple 6 həyat dövrü metodu təqdim edir: loadView (View-in əl ilə yaradılması), viewDidLoad (View yaddaşa yükləndikdən sonra), viewWillAppear (ekranda görünməzdən əvvəl), viewDidAppear (animasiyadan sonra), viewWillDisappear (ekrandan çıxmazdan əvvəl), viewDidDisappear (çıxdıqdan sonra). Hər metod MVC-də məntiqin yerləşdirilməsi üçün yerdir. Bu metodlardan biznes məntiqi üçün istifadə kontrollerin böyüməsini sürətləndirir.

Android-də MVC: Activity, Fragment və XML layout

Android MVC — Activity və Fragment Controller rolunu oynayır, XML layout faylları — View, məlumatlarla hər hansı POJO sinfi — Model. Activity ekranın həyat dövrünü idarə edir: onCreate, onStart, onResume, onPause, onStop, onDestroy. Fragment — Activity daxilində öz həyat dövrü olan alt ekrandır. View (XML) Controller-dən ayrılıb və setContentView və ya LayoutInflater vasitəsilə yüklənir. Model — repozitoriyalar, verilənlər bazaları, şəbəkə çağırışları.

kotlin
class UserActivity : AppCompatActivity() {
    // XML layout vasitəsilə View
    private lateinit var binding: ActivityUserBinding

    // Model
    private val userRepository = UserRepository()

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityUserBinding.inflate(layoutInflater)
        setContentView(binding.root)
        loadUser()
    }

    private fun loadUser() {
        userRepository.getUser { user ->
            runOnUiThread {
                binding.nameText.text = user.name
                binding.emailText.text = user.email
            }
        }
    }
}

Android ViewBinding və DataBinding — Controller və View arasında bağlılığı azaldan müasir alətlərdir. ViewBinding XML-dən View-ə birbaşa istinadlarla sinif yaradır, findViewById-i aradan qaldırır. DataBinding məlumatları UI ilə XML işarələməsində @{user.name} vasitəsilə birləşdirmək imkanı əlavə edir. DataBinding — MVVM-ə doğru addımdır, çünki Activity-də kod olmadan Model-dən View-ə məlumat ötürməyə imkan verir. Google bütün yeni layihələr üçün DataBinding tövsiyə edir.

Android həyat dövrü iOS-dan daha mürəkkəbdir: Activity ekranın döndərilməsi, yaddaş çatışmazlığı və ya konfiqurasiya dəyişikliyi zamanı məhv edilə və yenidən yaradıla bilər. Təmiz MVC-də kontroller (Activity) məhv edildikdə itən məntiq ehtiva edir. Bu, onSaveInstanceState və ya Jetpack-dən ViewModel vasitəsilə vəziyyətin qorunmasını tələb edir ki, bu da təmiz MVC-nin çərçivəsindən kənara çıxır və arxitekturanı MVVM-ə yaxınlaşdırır.

Massive View Controller və MVC-nin məhdudiyyətləri

Massive View Controller — mobil inkişafda MVC-nin əsas problemini təsvir edən termindir. iOS və Android-də kontroller çoxlu öhdəliklər götürür: girişin işlənməsi, məlumatların validasiyası, şəbəkə qarşılıqlı əlaqəsi, naviqasiya, keşləmə, animasiyalar, həyat dövrünün idarə edilməsi. Nəticədə kontroller 500–2000 sətirə qədər böyüyür, oxunması, test edilməsi və saxlanması çətinləşir.

Massive View Controller-ın səbəbləri — UIKit və Android Framework arxitekturası məntiqin kontrollerdə yerləşdirilməsini təşviq edir. Şəbəkə çağırışları, JSON-un işlənməsi, naviqasiya — bütün bunlar təbii olaraq Activity və ya UIViewController-də yazılır, çünki onlar həyat dövrünə və UI-ə çıxışa malikdirlər. Tərtibatçı şüurlu şəkildə məntiqi ayrı siniflərə (Service, Manager, Interactor) çıxarmalıdır ki, bu da intizam və arxitektura prinsiplərini başa düşməyi tələb edir.

MVC problemiTəsvirHəll
Güclü bağlılıqController View və Model-i bilirMVVM — ViewModel View-i bilmir
Testin çətinliyiController UIKit/Android-dən asılıdırMəntiqin servislərə çıxarılması
Həyat dövrüVəziyyət döndərmədə itirJetpack/SwiftUI-dən ViewModel
Naviqasiyanın olmamasıController keçidləri idarə edirCoordinator nümunəsi, Router

MVC-nin test edilməsi — Model unit testlərlə təcrid olunmuş şəkildə test edilir. Controller-i UIKit/UIFoundation-dan asılılığa görə test etmək çətindir. XCTest pəncərəsi olmayan UIViewController yaratmağa imkan vermir. Android üçün ActivityTestRule və Robolectric qismən problemi həll edir, lakin testlər yavaşdır. View adətən unit testlərlə test edilmir — UI üçün ekran görüntüsü və UI testləri (XCUITest, Espresso) tətbiq olunur.

MVC nə vaxt əsaslandırılır — bir-iki elementdən ibarət sadə ekranlar (giriş ekranı, profil, parametrlər). Fərziyyələrin yoxlanılması üçün prototiplər və MVP — MVC əlavə təbəqələr olmadan daha sürətli yazılır. 10–15 ekrana qədər kiçik kod bazası olan layihələr. Mürəkkəb layihələrdə MVC texniki borcun yığılmasına gətirib çıxarır və hər 6–12 aydan bir refaktorinq tələb edir.

MVC-nin MVVM, MVP və Clean Architecture ilə müqayisəsi

MVC vs MVVM — əsas fərq: MVVM-də kontroller View-ə istinadı olmayan ViewModel ilə əvəz olunur. Məlumatlar Observable (SwiftUI), LiveData/StateFlow (Android) və ya Combine/RxSwift vasitəsilə ötürülür. ViewModel UI asılılıqları olmadan unit testlərlə test edilir. Apple 2019-cu ildən MVVM-i SwiftUI ilə tövsiyə edir, Google — MVVM-i LiveData/Flow ilə Android-in rəsmi arxitekturası kimi. MVVM bağlama üçün daha çox kod tələb edir, lakin test olunma qabiliyyətini əhəmiyyətli dərəcədə yaxşılaşdırır.

MVC vs MVP — MVP-də (Model-View-Presenter) Presenter interfeys vasitəsilə View-i alan test olunan təbəqədir. MVC-dən fərqli olaraq, Controller UIKit vasitəsilə birbaşa View-i idarə edir, Presenter freymvorkdan asılı deyil — ViewInterface abstraksiyası vasitəsilə işləyir. MVP Jetpack-in meydana çıxmasına qədər Android inkişafında populyar idi və köhnə layihələrdə istifadə olunur. Presenter Activity-dən daha uzun yaşayır və ekran döndərildikdə vəziyyəti qoruyur.

MVC vs Clean Architecture — Clean Architecture Use Cases (Interactors), Entities, Gateways və Repository təbəqələrini əlavə edir. MVC Presentation təbəqəsində qalır, lakin biznes məntiqi Use Cases ilə Domain təbəqəsinə çıxarılır. Clean Architecture Massive View Controller problemini köklü şəkildə həll edir — Controller yalnız Use Cases çağırışlarını və View-in yenilənməsini ehtiva edir. Çatışmazlıq — siniflərin və faylların sayının əhəmiyyətli dərəcədə artması, bu da 50+ ekranlı layihələr üçün əsaslandırılır.

swift
// iOS-da MVC: Controller hər şeyi ehtiva edir
class OrderViewController: UIViewController {
    func placeOrder() {
        // Validasiya + şəbəkə + UI yeniləmə
        guard Validation.isValid(total) else { return }
        NetworkService.shared.submit(order) { [weak self] result in
            self?.handleResult(result)
        }
    }
}

// MVVM: məntiq ViewModel-də
class OrderViewModel: ObservableObject {
    @Published var state: OrderState = .idle
    func placeOrder() { /* biznes məntiqi */ }
}

Arxitektura seçimi komandanın ölçüsündən, layihədən və tələb olunan test olunma qabiliyyətindən asılıdır. 1–2 tərtibatçıdan ibarət komanda və 20 ekrana qədər layihə üçün MVVM uyğundur. 5 tərtibatçıdan ibarət böyük komanda və 50 ekrandan layihə üçün — modul strukturu ilə Clean Architecture. MVC aktual qalır arxitekturaların təkamülünü başa düşmək, legacy layihələri dəstəkləmək və mürəkkəb biznes məntiqi olmayan UIKit-də sadə ekranlar üçün.

Tez-tez verilən suallar

Mobil inkişafda MVC-nin əsas problemi nədir?

Əsas problem — Massive View Controller-dir. iOS-da UIViewController kontrolleri hər şeyə cavabdehdir: girişin işlənməsi, View-in yenilənməsi, şəbəkə ilə iş, naviqasiya və həyat dövrü. Android-də Activity/Fragment oxşar funksiyaları yerinə yetirir. Nəticədə kontroller minlərlə sətir koduna qədər böyüyür, test və dəstək üçün çətinləşir, tək məsuliyyət prinsipini pozur.

MVC MVVM-dən nə ilə fərqlənir?

MVC-də kontroller birbaşa View-i yeniləyir və istifadəçi girişini emal edir. MVVM-də kontroller rolunu View-ə istinadı olmayan ViewModel oynayır — məlumatlar bağlama mexanizmləri vasitəsilə ötürülür. MVVM daha yaxşı test olunur, çünki ViewModel UIKit və ya Android Framework-dən asılı deyil. Apple MVVM-i SwiftUI ilə, Google isə MVVM-i Jetpack Compose ilə tövsiyə edir.

MVC müasir layihələrdə istifadə edilə bilərmi?

Bəli, MVC sadə ekranlar və prototiplər üçün işlək nümunə olaraq qalır. Apple sadə ekranları olan UIKit proqramları üçün MVC tövsiyə edir. Çoxlu ekranları, şəbəkə sorğuları və keşləməsi olan mürəkkəb layihələr üçün MVVM, VIPER və ya Clean Architecture seçmək daha yaxşıdır. Başlanğıc tərtibatçılara daha mürəkkəb nümunələri öyrənməzdən əvvəl MVC-ni mənimsəmək tövsiyə olunur.

MVC proqramını necə test etməli?

Model təcrid olunmuş şəkildə test edilir — bunlar adi məlumat obyektləri və biznes məntiqidir. Controller-i UIKit və ya Android Framework-dən asılılığa görə test etmək çətindir. Biznes məntiqini kontrollerdən unit testlərlə test edilən ayrı servislərə və ya interaktorlara çıxarmaq tövsiyə olunur. View adətən unit testlərlə test edilmir — bunun üçün UI testləri və ekran görüntüsü testlərindən istifadə olunur.

MVC-dən sonra hansı nümunəni seçməli?

iOS-da — SwiftUI və Combine ilə MVVM, 2019-cu ildən Apple standartı. Android-də — LiveData və ya StateFlow ilə MVVM, Google tərəfindən rəsmi olaraq tövsiyə olunur. 5 tərtibatçıdan ibarət komandaları olan böyük layihələr üçün — iOS-da VIPER ilə Clean Architecture və ya Android-də funksiyalara görə modullara bölünmə ilə Clean Architecture. MVC ilə legacy layihələr üçün — məntiqin ayrı servislərə çıxarılması ilə tədricən refaktorinq.

Nəticə

  • MVC — Model, View və Controller-ə bölünmə ilə arxitektura nümunəsi
  • iOS MVC — UIViewController + storyboard + məlumat servisləri
  • Android MVC — Activity/Fragment + XML layout + repozitoriyalar
  • Massive View Controller — məsuliyyətin qarışması səbəbindən əsas problem
  • Test etmə — Model asanlıqla test edilir, Controller məntiqin çıxarılmasını tələb edir
  • Təkamül — MVC → MVVM → Clean Architecture böyüyən layihələr üçün
  • Uyğunluq — nümunələr bir layihədə birləşdirilə bilər

Açar təslim mobil tətbiq hazırlayacağıq

IT Sectr 2017-ci ildən startaplar və bizneslər üçün iOS və Android tətbiqləri yaradır. Sizə məsləhət verəcəyik və ən yaxşı həlli təklif edəcəyik.

Layihəni müzakirə et

Həm də oxuyun