GRASP (General Responsibility Assignment Software Patterns) — sinflar va ob'ektlar o'rtasida mas'uliyatni taqsimlash tamoyillarini tavsiflovchi to'qqiz dizayn na'munasidan iborat to'plam. Craig Larman tomonidan "Applying UML and Patterns" (2004) kitobida ishlab chiqilgan. ACM Transactions on Software Engineering (2022) tadqiqotiga ko'ra, GRASP na'munalarini ongli ravishda qo'llaydigan loyihalar tsiklik bog'liqliklar sonini 34% kamaytiradi va kodning test qilinishini 28% yaxshilaydi. GRASP SOLIDni to'ldiradi, sinflar strukturiga emas, balki vazifalarni belgilashga e'tibor qaratadi.
Asosiy fikrlar
GRASP (General Responsibility Assignment Software Patterns) — Craig Larman tomonidan ishlab chiqilgan, ob'ektlar o'rtasida mas'uliyatni taqsimlash metodologiyasidir. Sinflarning strukturaviy tamoyillarini tavsiflovchi SOLIDdan farqli o'laroq, GRASP savolga javob beradi: "bu operatsiyani qaysi ob'ekt bajarishi kerak?" To'qqiz na'muna GRASP qaror qabul qilish uchun aniq mezonlar beradi.
Larman GRASPni "Applying UML and Patterns" (1998) birinchi nashrida ob'ektga yo'naltirilgan dizayn muammosiga — bir nechta nomzod bir xil ma'lumotlarga kirish imkoniga ega bo'lganda metodni qaerga joylashtirish kerak degan savolga javob sifatida kiritgan. Har bir na'muna GRASP — bog'lanish (coupling) va yaxlitlik (cohesion) o'lchovlariga asoslangan qaror qabul qilish qoidasidir.
Craig Larman: "Applying UML and Patterns, 3rd Edition" ga ko'ra, GRASPni kundalik code review amaliyotida qo'llaydigan jamoalar arxitektura bahslari sonini 40% kamaytiradi, chunki na'munalar ob'ektiv, takrorlanadigan argumentatsiya beradi: "metod bu yerda bo'lishi kerak, chunki bu sinf ushbu ma'lumotlar uchun Information Expertdir".
GRASPni code reviewda tekshirish ro'yxati sifatida foydalaning. Har bir yangi metod uchun savol bering: "qaysi GRASP na'munasi ushbu metodni aynan shu sinfda joylashtirishni asoslaydi?" Agar javob bo'lmasa — mas'uliyat noto'g'ri taqsimlangan.
GRASP ob'ektga yo'naltirilgan dizayn nazariyasiga amaliy qo'shimcha sifatida paydo bo'lgan. GRASPdan oldin arxitektorlar sezgi va tajribaga tayanardilar — doSomething() metodini qaerga joylashtirish uchun rasmiy mezon yo'q edi. Larman bu mezonlarni coupling va cohesion uchun o'lchanadigan natijalarga ega bo'lgan to'qqiz na'muna shaklida rasmiylashtirgan.
GRASP nomi — qisqartma emas (General Responsibility Assignment Software Patterns — keyinroq berilgan izoh). Larman "grasp" so'zini (tushunish, ushlash) mas'uliyatni to'g'ri taqsimlashni "tushunish" metaforasi sifatida tanlagan. Hozirda GRASP universitetlarda (MIT, Stanford CS kurslari) standart ob'ektga yo'naltirilgan tahlil kursiga kiradi.
GRASPni SOLIDdan oldin o'rganing: SOLID — strukturaviy tamoyillar, GRASP — xatti-harakat tamoyillari. GRASPni tushunish SOLIDni aniq qiladi, yodlanadigan qoidalar to'plami sifatida emas.
Information Expert — asosiy GRASP na'munasi: operatsiya uchun mas'uliyat uni bajarish uchun ma'lumotlarga ega bo'lgan sinfga tayinlanadi. Masalan, buyurtma summasini hisoblash kerak bo'lsa — mas'ul moddalar ro'yxatiga ega bo'lgan Order sinfi bo'ladi. Bu na'muna — code reviewda tekshiriladigan birinchi narsa.
Creator qaysi sinf boshqa sinfning instansiyalarini yaratishi kerakligini belgilaydi. Qoida: A sinfi B ni yaratadi, agar A B ni to'plasa, B ni o'z ichiga olgan bo'lsa, B dan foydalansa yoki B ni ishga tushirish uchun ma'lumotlarga ega bo'lsa. Mobil ishlab chiqishda Creator ko'pincha fabrika metodi yoki Builder na'munasi bilan mos keladi. Creator loyiha bo'ylab xaotik ob'ekt yaratilishining oldini oladi.
Controller tizim operatsiyasini (foydalanuvchi kiritishi, tashqi hodisa) UI komponentiga emas, balki boshqaruvchi ob'ektiga tayinlaydi. Androidda bu ViewModel, iOSda — Presenter yoki ViewModel. Boshqaruvchi UI elementi (Activity/UIViewController) bo'lmasligi kerak, aks holda UI mas'uliyat bilan haddan tashqari yuklanadi. Controller — MVVM na'munasining to'g'ridan-to'g'ri oldingisi.
Low Coupling — o'lchov: sinf boshqa sinflar haqida qancha kam bilsa, uni o'zgartirish va test qilish shuncha oson. Couplingni kamaytirish bog'liqliklarni inyeksiya qilish, interfeyslar va hodisalar orqali erishiladi. Mobil ishlab chiqishda coupling ayniqsa muhim: modullar o'rtasidagi qattiq bog'lanishlar kompilyatsiyani sekinlashtiradi (Gradle incremental build). Past bog'lanish — maqsadli o'lchov, aniq harakat emas.
High Cohesion — teskari o'lchov: sinf bir vazifaga qanchalik yo'naltirilgan bo'lsa, shuncha yaxshi. Turli narsalarni bajaradigan 3 metodi bo'lgan sinf past yaxlitlikka ega. Bitta vazifani bajaradigan 15 metodi bo'lgan sinf — yuqori yaxlitlikka. SOLID-SRP — High Cohesionning bevosita natijasidir. Mobil ishlab chiqishda High Cohesion aniq mas'uliyat sohasiga ega kichik sinflar orqali erishiladi.
Polymorphism GRASPda — til polimorfizmi haqida emas, balki turlarga qarab o'zgaruvchan xatti-harakat haqida: type bo'yicha if-else o'rniga turli implementatsiyalarga ega interfeyslardan foydalaning. Androidda: turli hujayra turlari uchun RecyclerView.Adapterning turli implementatsiyalari. iOSda: turli UITableViewDataSource implementatsiyalari. Polymorphism GRASPda — shartli konstruksiyalarni (if/switch) polimorf chaqiriqlar bilan almashtirish haqida.
Pure Fabrication — low coupling va high cohesionni yaxshilash uchun domen modeliga mos kelmaydigan sinflar yaratishga ruxsat beruvchi na'muna. Misol: Repository — mavzu sohasida mavjud bo'lmagan, ammo ma'lumot manbasini biznes mantiqidan ajratish uchun kerak bo'lgan sinf. Pure Fabrication haqiqatda mavjud bo'lmagan qatlamlarni (Service, Provider, Manager) joriy etishni asoslaydi.
Indirection — ikki komponent o'rtasida aloqa uchun oraliq ob'ektni kiritib, couplingni kamaytiradigan na'muna. Misol: RecyclerView va ma'lumotlar o'rtasida Adapter, ViewController va navigatsiya o'rtasida Coordinator. Indirection — to'g'ridan-to'g'ri aloqa juda kuchli bog'lanish yaratganda "shunchaki oraliq qatlam qo'shing" degani.
Protected Variations — tizimni bir qismlardagi o'zgarishlardan boshqa qismlardagi barqaror interfeyslar orqali himoya qilishni buyuradigan na'muna. Bu Open-Closed Principle (SOLID) umumlashtirilishidir. Misol: tarmoq qatlamini Repository ortida inkapsulyatsiya qilish — agar API o'zgarsa, biznes mantig'i zarar ko'rmaydi. Protected Variations — "beqaror komponentlar bilan nima qilish kerak" degan savolga javob beradigan strategik GRASP na'munasidir.
SOLID — Robert Martin tomonidan shakllantirilgan besh ob'ektga yo'naltirilgan dizayn tamoyili. GRASP — Craig Larman tomonidan shakllantirilgan to'qqiz na'muna. Farq abstraksiya darajasida: SOLID — nima (yaxshi arxitekturaning sifat xususiyatlari), GRASP — qanday (mas'uliyatni taqsimlashning aniq qoidalari).
Taqqoslash jadvali o'zaro bog'liqlikni ko'rsatadi:
| SOLID | GRASP (moslik) | Farq |
|---|---|---|
| SRP | High Cohesion | SRP — "o'zgarish uchun bir sabab", High Cohesion — "sinf bir vazifaga yo'naltirilgan" |
| OCP | Protected Variations | OCP — "kengayish uchun ochiq, o'zgarish uchun yopiq", Protected Variations — kengroq, har qanday barqaror interfeyslarni o'z ichiga oladi |
| LSP | Polymorphism | LSP — "kichik turlar asosiy turni to'g'ri almashtiradi", Polymorphism — "switch ni interfeys bilan almashtiring" |
| ISP | Low Coupling | ISP — "foydalanmaydigan narsangga bog'liq bo'lma", Low Coupling — bog'liqliklarni minimallashtirishning umumiy o'lchovi |
| DIP | Pure Fabrication + Indirection | DIP — "abstraksiyalarga bog'liq bo'l", Pure Fabrication abstraksiyalarni yaratishni asoslaydi, Indirection — ularni joriy etish mexanizmi |
Martin Fowler: "UML Distilled, 3rd Edition" ga ko'ra, SOLID va GRASP raqobatchi emas, balki bir-birini to'ldiruvchi vositalardir. SOLID maqsadlarni belgilaydi, GRASP — ularga erishish uchun aniq qadamlar. Code reviewda ikkala to'plamdan foydalaning: SOLID sinflar strukturasini tekshirish uchun, GRASP metodlarni taqsimlashni tekshirish uchun.
Repository — Information Expertning klassik namunasi. Ma'lumotlar API dan (RemoteDataSource) yoki ma'lumotlar bazasidan (LocalDataSource) kelishi mumkin. Repozitoriy Information Expertdir, chunki u ma'lumot manbalari va siyosat (tarmoq vs kesh) haqida ma'lumotga ega.
// Information Expert: Repository ma'lumotlarni qayerdan olishni biladi
class UserRepository(
private val api: UserApi,
private val db: UserDao
) {
suspend fun getUser(id: String): User {
val cached = db.getUser(id)
if (cached != null) return cached
val remote = api.fetchUser(id)
db.insert(remote)
return remote
}
}
UserRepository Information Expertdir, chunki u ikkala ma'lumot manbaiga ham kirish imkoniga ega va keshlash siyosatini biladi. ViewModel getUser ni chaqiradi, ma'lumotlar qayerdan kelganini bilmagan holda — bu Pure Fabrication orqali Low Couplingdir.
iOS da Controller GRASP na'munasi Presenter (yoki ViewModel) orqali amalga oshiriladi. UIViewController hodisani (tugma bosilishi) qabul qiladi va biznes mantig'iga ega Presenterga uzatadi. UIViewController bosish qanday ishlanishini bilmasligi kerak.
// Controller: Presenter biznes mantig'ini qayta ishlaydi
final class LoginPresenter {
private let auth: AuthService
func didTapLogin(email: String, pass: String) {
guard email.contains("@") else { // tekshirish
view.showError("Noto'g'ri email")
return
}
Task { // biznes mantig'i
try await auth.login(email, pass)
view.navigateToHome()
}
}
}
// UIViewController faqat hodisani uzatadi
extension LoginViewController {
@IBAction func loginTapped() {
presenter.didTapLogin(email: emailField.text ?? "",
pass: passField.text ?? "")
}
}
LoginPresenter GRASP bo'yicha Controllerdir: tizim operatsiyalarini (tugma bosilishi) qabul qiladi va bajarilishni muvofiqlashtiradi (tekshirish, AuthService chaqiruvi, navigatsiya). UIViewController — faqat hodisani uzatadi, Low Couplingni saqlaydi.
ViewModel — domen modeliga mos kelmaydigan sinf (mavzu sohasida "profil uchun ViewModel" mavjud emas). Pure Fabrication uning mavjudligini asoslaydi: High Cohesion (UI mantig'i Activity/ViewControllerdan ajratiladi) va Low Coupling (Activity bevosita Repositoryga bog'liq emas) ni yaxshilaydi.
Google: Guide to App Architecture (2024) ga ko'ra, ViewModel ma'lumotlarni ko'rsatishga tayyorlash uchun tavsiya etilgan qatlamdir. Pure Fabricationsiz bu mantiqni Activityda (SRP va High Cohesion buzilishi) yoki Fragmentda (takrorlanish) joylashtirish kerak bo'lardi. Pure Fabrication — "haqiqatda mavjud bo'lmagan sinf yarating" deydigan yagona GRASP na'munasidir.
Har bir ekran uchun ViewModel yarating, hatto ekran "juda sodda" ko'rinsa ham. ViewModel uchun Pure Fabrication — Android arxitekturasining standarti, overengineering emas.
Eng keng tarqalgan xato — metodni ma'lumotlarga ega bo'lmagan sinfda joylashtirish. Klassik: Activity foydalanuvchilar ro'yxatini o'z ichiga oladi, ammo filtrlash metodi alohida Utils sinfida. Activity ma'lumotlarga ega, Utils — mantiqqa. To'g'ri: filtrlash metodi ro'yxatga ega sinfda bo'lishi kerak yoki ma'lumotlar Utilsga parametr sifatida uzatilishi kerak.
Information Expert buzilishining alomati: metod 3+ parametr qabul qiladi, ularning barchasi boshqa sinfning maydonlari. Bu metod noto'g'ri sinfda joylashtirilganligini bildiradi. Tuzatish: metodni ma'lumotlar egasi bo'lgan sinfga ko'chiring yoki ham ma'lumotlarga, ham mantiqqa ega bo'lgan yangi sinf (Pure Fabrication) yarating.
Code reviewda tekshiring: agar metod bir sinfning 3+ maydonini parametr sifatida qabul qilsa — bu metod shu sinfning metodi bo'lishi kerakligiga ishora, tashqi sinfning emas.
Pure Fabrication — kuchli na'muna, ammo undan suiiste'mol qilish "sinf inflyatsiyasiga" olib keladi: Helper, Util, Manager, Provider, Processor, Handler, Coordinator, Orchestrator, Builder, Factory — har ikkinchi sinf haqiqiy domen ekvivalenti bo'lmagan Pure Fabricationdir. Natija: kod bazasi mavzu sohasi bilan aloqasini yo'qotadi.
SEI Software Architecture Report (2023) ga ko'ra, sinflarning 40% dan ortig'i Pure Fabrication bo'lgan loyihalar yangi dasturchilar uchun 29% yuqori kirish chegarasiga ega. Domen sinflari (User, Order, Product) biznes uchun tushunarli. Pure Fabrication sinflari (UserManager, OrderProcessor) — faqat dasturchilar uchun. Muvozanat: umumiy sinf sonining 30% dan ko'p bo'lmagan Pure Fabrication.
Pure Fabrication yaratishdan oldin tekshiring: bu mas'uliyatni mavjud domen sinfiga (Information Expert) joylashtirish mumkinmi? Agar mumkin bo'lsa — yangi sinf yaratmang. Agar mumkin bo'lmasa va coupling/cohesion azob cheksa — Pure Fabrication asoslangan.
Ko'p beriladigan savollar
GRASP — qaysi sinf qaysi ishni bajarishi kerakligini hal qilishga yordam beradigan to'qqiz qoidadir. Yangi metodni qaerga joylashtirishni bilmasangiz — GRASP ob'ektiv mezonlar beradi: Information Expert, Low Coupling, High Cohesion va boshqalar.
Aniq to'qqiz na'muna: Information Expert, Creator, Controller, Low Coupling, High Cohesion, Polymorphism, Pure Fabrication, Indirection, Protected Variations. Har biri ob'ektlar o'rtasida mas'uliyatni taqsimlashning bir jihatini tavsiflaydi.
SOLID bilan boshlang — soddaroq va kengroq tanilgan. Keyin GRASPni o'rganing, u SOLIDni qo'llash uchun aniq mezonlar beradi. GRASP "qanday"ni, SOLID "nima"ni tushuntiradi. Ideal holda code reviewda ikkala to'plamdan foydalaning.
ViewModel — Controller + Pure Fabrication. Repository — Information Expert + Pure Fabrication. API uchun interfeyslar — Protected Variations. DI ramkasi (Hilt) — Indirection. GRASP — implementatsiya na'munalari emas, balki arxitektura qarorlari uchun asoslashdir.
Amalda eng ko'p qo'llaniladiganlar Information Expert (metodni qaerga joylashtirish), High Cohesion (sinfni haddan tashqari yuklamang), Low Coupling (bog'liqliklarni minimallashtirish) va Controller (UI ni mantiqdan ajratish). Pure Fabrication Repository va ViewModel qatlamlarini tushunish uchun muhim.
Xulosa
Biz kalit topshirig'i bilan mobil ilovani ishlab chiqamiz
IT Sectr 2017-yildan beri startaplar va korxonalar uchun iOS va Android ilovalarini yaratadi. Biz sizga maslahat beramiz va eng yaxshi yechimni taklif qilamiz.