Sobes.tech
Junior

Ի՞նչ են MV ձևանմուշները։

sobes.tech AI

Պատասխան AI-ից

MV-պատկերներ (Model-View-ViewModel, Model-View-Presenter, Model-View-Controller) — դա ճարտարապետական պատկերներ են, որոնք բաժանում են ներկայացումը (View), բիզնես-լոգիկան (Model) և ներկայացման տրամաբանությունը (ViewModel/Presenter): Մասն նպատակն է բարելավել պահպանումը, թեստավորումը և ընդլայնելիությունը հավելվածի պատասխանատվության բաժանման միջոցով:

MVC (Model-View-Controller)

  • Model: ներկայացնում է տվյալները և բիզնես-լոգիկան:
  • View: ցուցադրում է տվյալները Model-ից:
  • Controller: մշակել է օգտագործողի գործողությունները, թարմացնում է Model-ը և ընտրում View-ը ցուցադրելու համար:

Android-ում View-ը (ակտիվություն/ֆրագմենտ) հաճախ համատեղում է View և Controller գործառույթները, ինչը դժվարացնում է թեստավորումը:

MVP (Model-View-Presenter)

  • Model: ներկայացնում է տվյալները և բիզնես-լոգիկան:
  • View: պասիվ ինտերֆեյս, որը ցուցադրում է Presenter-ով փոխանցված տվյալները և փոխանցում է օգտագործողի գործողությունները:
  • Presenter: պարունակում է ներկայացման տրամաբանությունը, փոխազդում է Model-ի հետ և թարմացնում է View-ը ինտերֆեյսի միջոցով:

Նպաստում է View և տրամաբանության ավելի լավ բաժանմանը, դարձնում է Presenter-ը ավելի թեստավորելի:

// Օրինակ View-ի ինտերֆեյս MVP-ում
interface UserProfileView {
    fun showLoading()
    fun hideLoading()
    fun displayUserInfo(user: User)
    fun showError(message: String)
}

// Օրինակ Presenter
class UserProfilePresenter(private val view: UserProfileView, private val repository: UserRepository) {
    fun loadUserProfile(userId: String) {
        view.showLoading()
        repository.getUser(userId) { user ->
            view.hideLoading()
            if (user != null) {
                view.displayUserInfo(user)
            } else {
                view.showError("Failed to load user")
            }
        }
    }
}

MVVM (Model-View-ViewModel)

  • Model: ներկայացնում է տվյալները և բիզնես-լոգիկան, օգտագործում է Observable՝ փոփոխությունների մասին ծանուցելու համար:
  • View: ցուցադրում է ViewModel-ից տվյալները և փոխանցում է օգտագործողի գործողությունները, օգտագործում է databinding՝ View և ViewModel կապելու համար:
  • ViewModel: տրամադրում է տվյալները View-ին հարմար ձևով, պարունակում է ներկայացման տրամաբանությունը, չունի ուղղակի մուտք View-ին:

Օգտագործում է դիտորդների մեխանիզմներ (LiveData, Flow) և databinding՝ View-ի ավտոմատ թարմացման համար փոփոխությունների դեպքում։ Դարձնում է ViewModel-ը լիովին անկախ Android ֆրեյմվորկից և լավ թեստավորելի:

// ViewModel-ի օրինակ՝ LiveData-ով
class UserProfileViewModel(private val repository: UserRepository) : ViewModel() {
    private val _user = MutableLiveData<User?>()
    val user: LiveData<User?> = _user

    private val _loading = MutableLiveData<Boolean>()
    val loading: LiveData<Boolean> = _loading

    private val _error = MutableLiveData<String?>()
    val error: LiveData<String?> = _error

    fun loadUserProfile(userId: String) {
        _loading.value = true
        repository.getUser(userId) { user ->
            _loading.value = false
            if (user != null) {
                _user.value = user
                _error.value = null
            } else {
                _user.value = null
                _error.value = "Failed to load user"
            }
        }
    }
}

Համեմատություն:

Պատկեր View և տրամաբանության կապ Թեստավորման հեշտություն Տրամաբանության կախվածություն Android-ից
MVC խիտ (Android View հաճախ է հանդիսանում Controller) միջին բարձր
MVP ազատ (ինտերֆեյսի միջոցով View) բարձր ցածր (Presenter-ը կախված չէ Android UI-ից)
MVVM ազատ (հետևելով դիտորդներին և databinding-ին) բարձր բացակայում է (ViewModel-ը կախված չէ Android UI-ից)

Ընտրությունը կախված է նախագծի պահանջներից և թիմի նախընտրություններից։ MVVM-ը, օգտագործելով Android Jetpack կոմպոնենտները (ViewModel, LiveData, Data Binding), համարվում է ժամանակակից Android զարգացման առաջարկվող մոտեցումը։