Azimjon Abdurasulov

01. Design Patterns vs Architecture: G'isht va Bino

🏛️ iOS Design Patterns — Mukammal Enterprise & Architecture Qo‘llanma

01. Design Patterns Kirish: G'isht vs Bino (Patterns vs Architecture)

"Dasturiy injiniringda eng xavfli dasturchi — bu barcha 23 ta Gang of Four patternlarini yodlab olib, ularning barchasini bitta oddiy 'Salom Dunyo' ilovasiga tiqishga urinayotgan dasturchidir. Senior dasturchi patternni qachon ishlatishni emas, qachon ishlatmaslikni biladi."


1. G'oya: Pattern (Andoza) va Architecture (Arxitektura) Farqi

Ko'pgina junior va middle dasturchilar "Design Pattern" va "Architecture" tushunchalarini chalkashtirib yuborishadi.

Keling, binokorlik metaforasi bilan tushunamiz:

  • Design Pattern (Andoza): Bu alohida bir muammoni hal qiluvchi g'isht, eshik qulfi yoki deraza romi. Masalan, ikkita mos kelmaydigan simni ulash uchun Adapter ishlatasiz, yoki faqat 1 ta kaliti bor eshik uchun Singleton qurasiz.
  • Architecture (Arxitektura): Bu binoning bosh rejasi (chizmasi). Oshxona qayerda, mehmonxona qayerda, elektr tarmog'i qanday o'tgan (MVVM, VIPER, Clean Architecture, The Composable Architecture — TCA).
graph TD
    subgraph Architecture["Arxitektura: Butun Bino Rejasi (MVVM / Clean)"]
        direction TB
        View["Presentation Layer (SwiftUI View)"]
        VM["Business Logic (ViewModel)"]
        Domain["Domain Layer (Use Cases)"]
        Data["Data Layer (Repository)"]

        View --> VM
        VM --> Domain
        Domain --> Data
    end

    subgraph Patterns["Design Patterns: Har Bir Qavatdagi G'ishtlar"]
        direction TB
        P1["Coordinator: Navigatsiyani boshqaradi"]
        P2["Observer: View va VM'ni reaktiv bog'laydi"]
        P3["Strategy: To'lov usullarini almashtiradi"]
        P4["Factory: Murakkab entity'larni yasaydi"]
        P5["Adapter: Eski SDK larni ulaydi"]
    end

    Architecture -.->|"Ichida qo'llaniladi"| Patterns

    style Architecture fill:#131720,stroke:#7da2ce,stroke-width:2px
    style Patterns fill:#131720,stroke:#bef264,stroke-width:2px

Siz bitta MVVM arxitekturasidagi loyihada Coordinator, Factory, Observer, Strategy va Repository patternlarini bir vaqtda ishlatasiz!


2. Gang of Four (GoF) Patternlarining 3 Ta Asosiy Oilasi

1994-yilda 4 nafar olim (Erich Gamma, Richard Helm, Ralph Johnson, John Vlissides) dasturiy ta'minotdagi takrorlanuvchi 23 ta klassik andozani 3 ta toifaga ajratishgan:

mindmap
  root((iOS Design Patterns))
    Creational["1. Creational (Yaratuvchi)\nObyekt yaratishni xavfsiz va moslashuvchan qilish"]
      Singleton["Singleton\n(Yagona nusxa)"]
      FactoryMethod["Factory Method\n(Protokolli yasovchi)"]
      AbstractFactory["Abstract Factory\n(Oilaviy fabrikalar)"]
      Builder["Builder\n(Bosqichma-bosqich)"]
      Prototype["Prototype\n(Klonlash va CoW)"]
    Structural["2. Structural (Tuzilmaviy)\nSinflar va obyektlarni bir-biriga ulash"]
      Adapter["Adapter\n(Interfeys moslashtirish)"]
      Decorator["Decorator\n(Qo'shimcha xatti-harakat)"]
      Facade["Facade\n(Soddalashtirilgan API)"]
      Composite["Composite\n(Daraxtsimon tuzilma)"]
      Proxy["Proxy\n(Kesh va himoya)"]
    Behavioral["3. Behavioral (Xulq-atvor)\nObyektlar o'rtasida ma'lumot va harakat almashish"]
      Observer["Observer\n(Kuzatuvchi / Combine)"]
      Strategy["Strategy\n(Dinamik algoritmlar)"]
      Command["Command\n(Undo / Redo / Navbat)"]
      StatePattern["State\n(Holat mashinasi)"]
      ChainOfResp["Chain of Responsibility\n(Interceptorlar)"]

3. SOLID Tamoyillari Bilan Aloqasi

Har bir to'g'ri qo'llanilgan design pattern ortida Robert C. Martin'ning SOLID tamoyillari yotadi:

SOLID TamoyiliQaysi Patternlar Bilan Bog'liq?Muammo va Yechim
S (Single Responsibility)Facade, CoordinatorUIViewController ham UI chizib, ham navigatsiya qilib, ham tarmoq so'rovini yubormasligi kerak
O (Open / Closed)Strategy, Decorator, FactoryYangi to'lov usuli (masalan Apple Pay) qo'shilganda eski switch-case kodiga tegmasdan yangi sinf yozish
L (Liskov Substitution)Factory Method, AdapterOta sinf o'rniga bolasi qo'yilganda dastur qulamasligi
I (Interface Segregation)Delegation, Protocol Composition50 ta metodi bor gigant protokollar o'rniga kichik, maxsus protokollar
D (Dependency Inversion)Dependency Injection, RepositoryYuqori qatlam (ViewModel) quyi qatlam (URLSession) ga to'g'ridan-to'g'ri bog'lanmasligi, protokol orqali ishlashi

4. "Patternitis" Qopqoni: Overengineering Nega Xavfli?

Dasturchilar hayotida 3 ta bosqichni bosib o'tishadi:

[Dasturchining Fikrlash Evolyutsiyasi]
Junior:  "Pattern nima ekanini bilmayman, hamma kodni ViewController ichiga tiqaman (MVC)."
Middle:  "Men barcha patternlarni o'rgandim! Endi har bir Label yaratish uchun ham AbstractFactory,
          har bir tugma uchun Command, har bir raqam uchun Strategy quraman!" (OVERENGINEERING!)
Senior:  "Eng oddiy va tushunarli yechim — eng yaxshi yechimdir. Muammo paydo bo'lmaguncha
          arxitekturani keraksiz murakkablashtirmayman (KISS & YAGNI)."

Haqiqiy Holat (Case Study):

Bir startapda dasturchi oddiy 2 ta ekrandan iborat ToDo ro'yxat ilovasi uchun AbstractFactory, Proxy, Command va Builder patternlarini qo'llab, 40 ta ortiqcha fayl yaratgan. Yangi stajyor kelganda 1 ta oddiy checkbox o'zgarishini qilish uchun 6 ta turli faylni o'zgartirishiga to'g'ri kelgan. Bu sof Anti-Pattern vaqt o'g'irlashidir!


5. Interaktiv Savol-Javob (Self-Check Quiz)

<details> <summary><b>1-Savol: Nega Swift struct'lari bilan ishlaganda ko'plab an'anaviy GoF patternlari (masalan Prototype yoki Decorator) o'z dolzarbligini qisman yo'qotadi?</b> (Yechimni ko'rish uchun bosing)</summary>

Tahlil va Yechim: GoF kitobi 1994-yilda C++ va Smalltalk (Reference Type / Class asosidagi tillar) uchun yozilgan. Swift'da esa structlar Value Type hisoblanadi.

  1. Prototype patternida obyektni nusxalash (clone) talab qilinar edi — Swift structlarida bu tilning o'zida let newObj = oldObj orqali tekinga va xotiradan yengil (Copy-on-Write) amalga oshadi.
  2. Decorator patterni o'rniga Swift'da extensionlar yoki SwiftUI'ning ViewModifierlari ishlatiladi.

</details>

<details> <summary><b>2-Savol: Loyihangizda arxitekturani qachon Refactoring qilib patternga o'tkazish kerak?</b> (Yechimni ko'rish uchun bosing)</summary>

Tahlil va Yechim: "Uchtalik Qoidasi" (Rule of Three): Kodda bir xil mantiqiy takrorlanish yoki moslashuvchanlik ehtiyoji kamida 3 marta takrorlanganda pattern qo'llaniladi. Bir martalik oddiy kodga oldindan murakkab pattern qurish — bu kelajakdagi xatolar uchun zamin yaratishdir (Premature Optimization). </details>


6. Amaliy Topshiriq

O'z joriy loyihangizdagi eng katta ViewController yoki View faylini oching:

  1. Undagi mas'uliyatlarni sanab chiqing (UI chizish, tarmoq chaqiruvi, navigatsiya, xatoliklarni alertda ko'rsatish).
  2. Qaysi mas'uliyatni qaysi pattern yordamida (Coordinator, Repository, Service) alohida qatlamga chiqarish mumkinligini qog'ozga chizib oling!

(Keyingi darslarda biz har bir patternni noldan, to'liq kodlari va xotira tahlili bilan amalda ko'ramiz!)

Markdown manba

iOS Lessons