Separation of Concerns mobil inkişafda — bu nədir, prinsiplər və tətbiqi

Müəllif: IT Sectr Dərc olunub: 2026-05-13 Oxuma vaxtı: 8 dəq

Separation of Concerns — hər bir modulun və ya təbəqənin bir məsuliyyət sahəsinə cavab verdiyi prinsipdir. Wikipedia-ya görə, termini Edsger Dijkstra 1974-cü ildə təqdim etmişdir və o vaxtdan bəri proqram təminatı arxitekturasının təməlinə çevrilmişdir. Bölgü məsuliyyəti tərtibatçılara bir kod təbəqəsini dəyişməyə imkan verir, qalanlarına təsir etmədən, bu da uzun dəstək dövrü olan mobil layihələrdə kritik əhəmiyyət daşıyır.

Əsas məqamlar

  • Separation of Concerns — hər bir modulun bir dəqiq müəyyən edilmiş tapşırığa cavab verdiyi prinsip
  • Təbəqəli arxitektura — SoC-in birbaşa nəticəsi: UI, biznes məntiqi və məlumatlar bir-birindən təcrid olunub
  • MVVM və Clean Architecture — mobil inkişafda Separation of Concerns-i həyata keçirən məşhur nümunələr
  • Test edilə bilənlik yüksəlir, çünki hər təbəqə UI ilə inteqrasiya olmadan müstəqil test edilə bilər
  • Həddindən artıq bölgü mürəkkəbliyi artırır — bölgü ilə sadəlik arasında balans vacibdir

Separation of Concerns nədir

Separation of Concerns — proqram sisteminin hər biri bir tapşırığı həll edən müstəqil hissələrə parçalanması prinsipidir. Concern (məsuliyyət sahəsi) termini funksionallığın ayrıla bilən hər hansı hissəsini bildirir: ekranın göstərilməsi, klikin işlənməsi, məlumatların validasiyası və ya şəbəkə əlaqəsi. Prinsip kodu elə qruplaşdırmağı əmr edir ki, bir sahədəki dəyişikliklər digərlərində dəyişiklik tələb etməsin.

Mobil inkişafda SoC bir neçə səviyyədə özünü göstərir: tətbiqin ekranlara bölünməsindən tutmuş bir sinif daxilində kodun təşkilinə qədər. Eyni anda şəbəkədən məlumat yükləyən, JSON parse edən və UI çəkən Activity və ya ViewController Separation of Concerns-i pozur — belə kodu saxlamaq, test etmək və genişləndirmək çətindir. Alternativ — hər bir məsuliyyət növünü ayrıca komponentə çıxarmaqdır.

Prinsip abstraksiya anlayışı ilə sıx bağlıdır: hər təbəqə ciddi müəyyən edilmiş interfeys təqdim edir və tətbiq detallarını gizlədir. Bunun sayəsində tərtibatçı şəbəkə kitabxanasını və ya verilənlər bazasını UI məntiqini yenidən yazmadan dəyişə bilər. Bu, tələblərin və texnologiyaların zamanla dəyişdiyi uzunömürlü layihələrdə xüsusilə dəyərlidir.

Prinsipin tarixi və mənşəyi

Edsger Dijkstra Separation of Concerns ideyasını ilk dəfə 1974-cü ildə “On the Role of Scientific Thought” məqaləsində formalaşdırmışdır. O, proqram sistemlərinin mürəkkəbliyini onları təcrid olunmuş şəkildə təhlil edilən hissələrə bölməklə idarə etmək olar deyə mübahisə etmişdir. Bu yanaşma o dövrün kodun hesablamaları, giriş-çıxışı və istifadəçi interfeysini qarışdırdığı monolit proqramları ilə ziddiyyət təşkil edirdi.

1980-ci illərdə ideyanı struktur proqramlaşdırma tərəfdarları, daha sonra isə obyekt yönümlü yanaşma inkişaf etdirmişdir. Smalltalk və C++ kimi dillər inkapsulyasiya və modulluq mexanizmləri təmin etmiş, bu da SoC-i praktik alətə çevirmişdir. Müasir arxitektura nümunələri — MVC, MVP, MVVM və Clean Architecture — Separation of Concerns prinsipinin birbaşa təcəssümüdür.

Mobil inkişaf dünyasında Apple MVC-ni iOS üçün standart olaraq təbliğ edirdi, burada Model-View-Controller məlumatları, göstərməni və idarəetmə məntiqini ayırır. Google Android üçün ViewModel və Repository-ə əsaslanan arxitektura tövsiyələri təklif etmişdir — hər komponent öz dar tapşırığını həll edir. SoC olmadan mobil tətbiqlər Massive View Controller-a — minlərlə sətirdən ibarət siniflərə çevrilir, burada hər hansı dəyişiklik bütün funksionallığı poza bilər.

Mobil arxitekturada bölgü səviyyələri

Dörd əsas təbəqə Separation of Concerns-i həyata keçirən tipik mobil tətbiq arxitekturasını təşkil edir. Hər təbəqə yalnız öz sahəsinə cavabdehdir və qonşuları ilə interfeyslər vasitəsilə əlaqə qurur.

UI təbəqəsi: View və ViewModel

View yalnız məlumatların göstərilməsi və istifadəçi hadisələrinin işlənməsi üçün cavabdehdir. iOS-da bu UIViewController və UIView, Android-də — Fragment və ya Activity-dir. ViewModel ekranın vəziyyətini və məlumatların göstərilməyə hazır formata çevrilməsi məntiqini ehtiva edir. Bölgü UIKit-in SwiftUI ilə əvəz edilməsinin və ya ekranın Jetpack Compose-a yenidən yazılmasının biznes məntiqinə təsir etməyəcəyinə zəmanət verir.

ViewModel-in test edilməsi emulator və ya simulyatorun işə salınmasını tələb etmir — məlumatların çevrilməsini və istifadəçi hərəkətlərinə reaksiyanı yoxlayan vahid testlər kifayətdir. Bu, Separation of Concerns-in birbaşa nəticəsidir: UI biznes qaydaları ilə qarışmır və hər komponent təcrid olunmuş şəkildə test edilir.

Biznes məntiqi təbəqəsi: Use Cases və Interactors

Use Case (və ya Interactor) tətbiqin biznes qaydalarını — hesablamaları, yoxlamaları, məlumatlara zənglərin orkestrasiyasını ehtiva edir. Bu təbəqə UI və platforma freymvorklarının mövcudluğundan xəbərsizdir. Use Case məlumatları Repository-dən alır, onlara məntiq tətbiq edir və hazır nəticəni ViewModel-ə qaytarır. Bölgü bir Use Case-in müxtəlif ekranlarda təkrar istifadəsinə imkan verir.

Məsələn, LoginUseCase email-in düzgünlüyünü yoxlayır, autentifikasiya üçün AuthRepository-i çağırır və nəticəni qaytarır. O, giriş ekranının necə görünməsindən — SwiftUI, UIKit və ya Compose-dan asılı deyil. Biznes qaydaları dəyişərsə, UI və verilənlər bazasına toxunmadan bir Use Case-i dəyişmək kifayətdir.

Məlumat təbəqəsi: Repository və DataSource

Repository məlumat mənbələrini abstraksiya edir: uzaq API, yerli verilənlər bazası və ya yaddaşda keş. ViewModel və Use Case məlumatların dəqiq haradan gəldiyini bilmir — Repository şəbəkədən və ya keşdən yükləməyə qərar verir. Bu bölgü saxlama tətbiqini biznes məntiqinə və UI-ə təsir etmədən dəyişməyə imkan verir.

DataSource daha da aşağı səviyyəli bölgüdür: NetworkDataSource yalnız HTTP sorğularına, LocalDataSource isə Room və ya CoreData ilə işə cavabdehdir. Repository müxtəlif DataSource-lərə zəngləri vahid ardıcıl interfeysdə birləşdirir. Hər DataSource mock və ya saxta serverlər vasitəsilə müstəqil test edilir.

DataSource təbəqəsinin düzgün tətbiqi verilənlər bazası sxeminin dəyişdirilməsinin və ya REST API-nin GraphQL ilə əvəz edilməsinin yalnız bir DataSource-ə təsir edəcəyinə, lakin Repository və ya onun istehlakçılarına təsir etməyəcəyinə zəmanət verir. Bu, infrastruktur səviyyəsində Separation of Concerns-in birbaşa nəticəsidir: hər bir technical concern təcrid olunub və kaskad dəyişikliklər olmadan əvəz edilə bilər.

Dizayn nümunələrində SoC

MVVM (Model-View-ViewModel) — mobil inkişaf üçün ən məşhur nümunə, birbaşa Separation of Concerns-i həyata keçirir. Model məlumatları və biznes məntiqini ehtiva edir, View göstərməyə cavabdehdir, ViewModel isə onları reaktiv mexanizmlər vasitəsilə birləşdirir. Flutter-da analoji rolu hadisələrə, vəziyyətlərə və biznes məntiqinə bölünmə ilə BLoC oynayır.

Clean Architecture Robert Martin (Uncle Bob) SoC-i maksimuma çatdırır: sistem müstəqil halqalara bölünür — varlıqlar, use cases, adapterlər və freymvorklar. Daxili halqalar (varlıqlar) xarici halqalardan (freymvorklardan) asılı deyil. Bu, verilənlər bazasını, UI freymvorkunu və hətta platformanı tətbiqin core məntiqini yenidən yazmadan dəyişməyə imkan verir.

Praktikada mobil layihələr nadir hallarda tam Clean Architecture-i həyata keçirir — əksər tətbiqlər üçün üçtəbəqəli arxitektura kifayətdir: UI, Domain və Data. Domain təbəqəsi Use Cases və biznes modellərini ehtiva edir və Android SDK və ya iOS SDK-dan tamamilə təcrid olunub. Belə bölgü 20% səylə 80% fayda verir.

kotlin
// Data layer — yalnız məlumatların alınmasına cavabdehdir
class UserRepository(private val api: UserApi) {
    suspend fun getUser(id: String): User = api.fetchUser(id)
}

// Domain layer — biznes məntiqi, API və ya bazanı bilmir
class GetUserNameUseCase(
    private val repo: UserRepository
) {
    suspend fun invoke(id: String): String {
        val user = repo.getUser(id)
        return "${user.firstName} ${user.lastName}"
    }
}

// UI layer — yalnız göstərmə
class UserViewModel(
    private val getUserName: GetUserNameUseCase
) {
    fun onUserLoaded(id: String) {
        viewModelScope.launch {
            _name.value = getUserName.invoke(id)
        }
    }
}

Yuxarıdakı kod təmiz bölgünü nümayiş etdirir: UserRepository yalnız API ilə işləyir, GetUserNameUseCase adın formatlanması biznes məntiqini ehtiva edir, UserViewModel isə UI vəziyyətini idarə edir. Hər sinfin dəyişmək üçün bir səbəbi var, bu da Separation of Concerns-in mahiyyətidir.

Separation of Concerns-in üstünlükləri və məhdudiyyətləri

SoC-in əsas üstünlüyü — saxlanıla bilənlikdir. Müstəqil təbəqələrə bölünmüş kodu təhlil etmək asandır: tərtibatçı yalnız xətanın baş verdiyi təbəqəyə baxır və qalanlarına fikrini yayındırmır. Uzunmüddətli layihələrdə bu, monolit kodla müqayisədə xətaların axtarışı və düzəldilməsi vaxtını 30–50% azaldır.

İkinci mühüm üstünlük — test edilə bilənlikdir. Biznes məntiqi UI və freymvorklardan təcrid olunduqda, emulatoru işə salmadan vahid testlərlə əhatə olunur. Yüksək vahid test əhatəsi olan Android və iOS layihələri yeni funksiyalar əlavə edərkən əhəmiyyətli dərəcədə daha az reqressiyaya malikdir.

Əsas məhdudiyyət — mürəkkəbliyin artması. Mikrotəbəqələrə və abstraksiyalara həddindən artıq bölgü sadə düymə əlavə etmək üçün tərtibatçının beş faylı düzəltməsinə gətirib çıxarır. Separation of Concerns prinsipi ağıllı balans tələb edir: yalnız həqiqətən müstəqil dəyişən sahələri bölmək. Kiçik layihələr üçün əlavə abstraksiyalar olmadan əsas UI, məntiq və məlumat bölgüsü kifayətdir.

Tez-tez verilən suallar

Separation of Concerns modulluqdan nə ilə fərqlənir?

SoC — məsuliyyət sahələrinə görə bölgü prinsipi, modulluq isə kodun fiziki modullarda təşkili üsuludur. SoC bir modul daxilində təbəqələr və ya siniflər vasitəsilə həyata keçirilə bilər, modulluq isə müstəqil yığmalara bölünmə tələb edir.

Separation of Concerns SOLID ilə necə əlaqəlidir?

SoC SOLID prinsipləri üzərində üstqurumdur. Single Responsibility Principle (S) — bir sinif səviyyəsində SoC-dir. Dependency Inversion Principle (D) interfeyslər və asılılıqların enjeksiyonu vasitəsilə təbəqələr arasında SoC-i həyata keçirməyə kömək edir.

Separation of Concerns kiçik tətbiqlərdə lazımdırmı?

Bəli, amma mülayim dərəcədə. Sadə tətbiq üçün UI və biznes məntiqini ayırmaq kifayətdir. Həddindən artıq sayda təbəqə kodu praktik fayda olmadan çətinləşdirəcək. Layihə böyüdükcə təbəqələrin sayı tədricən artırılır.

Separation of Concerns performansa necə təsir edir?

Performansa birbaşa təsiri yoxdur — SoC kodun arxitekturasına aiddir, icraya deyil. Lakin təbəqələrə bölgü təbəqələr arasında əlavə çağırışlar səbəbindən dolayı yük əlavə edə bilər. Praktikada bu təsir saxlanıla bilənlik faydaları ilə müqayisədə cüzi dərəcədə azdır.

Hansı alətlər SoC-ə riayət etməyə kömək edir?

Dependency injection (Hilt, Koin, Swinject) təbəqələr arasında sərhədləri açıq şəkildə idarə edir. Detekt (Android) və SwiftLint (iOS) daxilində arxitektura linter qaydaları icazə verilməyən təbəqələrdən importları qadağan edir. Git hooks biznes təbəqəsinin UI kitabxanalarını import etmədiyini yoxlaya bilər.

Xülasə

  • Separation of Concerns — hər modulun bir məsuliyyət sahəsinə cavab verdiyi fundamental arxitektura prinsipi
  • Prinsip Dijkstra tərəfindən 1974-cü ildə formalaşdırılmış və MVC, MVVM və Clean Architecture-də tətbiq edilmişdir
  • Standart üçtəbəqəli arxitektura UI, biznes məntiqini (Use Cases) və məlumat təbəqəsini (Repository) əhatə edir
  • SoC test edilə bilənliyi artırır: hər təbəqə emulatoru işə salmadan vahid testlərlə əhatə olunur
  • Həddindən artıq bölgü layihəni çətinləşdirir — bölgü ilə sadəlik arasında balans lazımdır
  • MVVM və Clean Architecture — mobil inkişafda SoC-i həyata keçirən ən geniş yayılmış nümunələr
  • Balanslaşdırın bölgü dərinliyini layihənin ölçüsünə görə: kiçik tətbiqlər üçün iki təbəqə kifayətdir

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