# 02. Ochiq Manbali SPM Kutubxonalari vs O'z Dvigatelingni Yozish

> "Tayyor framework sizga 1-kunda tezlik beradi, ammo 1-yildan keyin uning cheklovlari asiriga aylantiradi. In-house dvigatel esa boshida puxta arxitektura talab qiladi, ammo kompaniyangizga to'liq mustaqillik, minimal hajm va cheksiz moslashuvchanlik taqdim etadi."

---

## 1. Dunyodagi Yetakchi Ochiq Manbali SDUI Kutubxonalari Tahlili

Bugungi kunda iOS ekotizimida SDUI joriy qilish uchun bir nechta yirik ochiq manbali va tijoriy yechimlar mavjud:

```mermaid
flowchart TD
    subgraph Solutions["SDUI Yechimlari Ekotizimi"]
        direction TB
        DivKit["Yandex DivKit\n(Eng yetuk Open-Source)"]
        Judo["Judo.app\n(Vizual No-Code + SDK)"]
        Hyperview["Hyperview\n(XML-based Hypermedia)"]
        Epoxy["Airbnb Epoxy\n(Komponentlar bazasi)"]
        Custom["In-House Custom SPM\n(Sof Native Swift 6)"]
    end

    style DivKit fill:#181d26,stroke:#60a5fa,stroke-width:1px
    style Custom fill:#181d26,stroke:#bef264,stroke-width:2px
```

### 1. Yandex DivKit (`github.com/divkit/divkit`)
DivKit — bu Yandex tomonidan ochiq manbali (Apache 2.0) qilingan, dunyodagi eng ilg'or multiplatform (iOS, Android, Web) SDUI tizimidir.
* **Arxitekturasi:** Server JSON formatida `div-container`, `div-text`, `div-image`, `div-gallery`, `div-state` kabi ibtidoiy (primitive) bloklarni yuboradi.
* **Kuchli Tomonlari:**
  1. *Expressions Engine:* Serverdan yuborilgan dinamik hisob-kitoblarni klientda bajaradi:
     `"color": "@{user.balance > 0 ? '#4ade80' : '#f87171'}"`
  2. *Reaktiv O'zgaruvchilar (Variables):* Klientda lokal o'zgaruvchilarni saqlash va ularga qarab layoutni avtomatik qayta chizish imkoniyati.
  3. *Tayyor Layout Motori:* Matn o'lchamini hisoblash, Flexbox uslubidagi joylashtirish va kesh tizimi allaqachon mukammal ishlangan.
* **Jiddiy Kamchiliklari:**
  1. **Binary Size Shishishi:** DivKit iOS ilova hajmiga to'g'ridan-to'g'ri **+6.5 MB dan +8.2 MB gacha** qo'shimcha hajm qo'shadi!
  2. **UIKit Qoldiqlari:** Framework'ning asosiy qismi Objective-C/UIKit davrida boshlangan, zamonaviy SwiftUI va Swift 6 Strict Concurrency bilan ishlashda ko'plab `UIViewRepresentable` qobiqlari orqali xotira xarajatlari ortadi.

### 2. Hyperview (`hyperview.org`)
* JSON o'rniga **XML** formatini ishlatadi (Veb HTML uslubida mobil ilovalar uchun gipermedia).
* Har bir ekran alohida XML hujjati bo'lib, navigatsiya `href="/screen2.xml"` shaklida ishlaydi.
* **Kamchiligi:** Mobil protsessorlarda XML parslash JSON va Protobuf'ga nisbatan 3-4x ko'proq CPU va batareya sarflaydi.

---

## 2. Katta Tanlov: Tayyor Framework vs In-House Custom Engine?

Staff Mobile Architect darajasidagi qiyosiy tahlil matritsasi:

| Mezon | Yandex DivKit | O'zingning Custom SDUI Dvigateling |
| :--- | :--- | :--- |
| **Boshlash Tezligi** | 2-3 kunda integratsiya qilinadi | 2-3 hafta (arxitektura + prototip) |
| **Ilova Hajmiga Ta'siri (Binary Size)** | **+7.5 MB** (Katta qo'shimcha yuk) | **< 280 KB** (Sof Native Swift) |
| **Dizayn-Tizimga Moslashuvchanlik** | DivKit ibtidoiylariga bo'ysunasiz | Kompaniyangizning har qanday SwiftUI komponentini ulay olasiz |
| **Swift 6 & SwiftUI Mosligi** | Qisman (Asosi UIKit bazasida) | **100% Sof SwiftUI + Strict Concurrency** |
| **Uchinchi Tomon Bog'liqligi (Supply Chain Risk)** | Yuqori (Tashqi repozitoriyga bog'liqsiz) | Nol (To'liq sizning jamoangiz nazoratida) |
| **Xotira va 120 FPS Unumdorlik** | Yaxshi (ammo C++/ObjC ko'priklari bor) | **Maksimal Native (Zero Bridging Overhead)** |

```mermaid
flowchart TD
    Start["Qaysi yo'lni tanlash kerak?"] --> CheckPlatforms{"Barcha platformalarda (Android, iOS, Web)\n1 ta backend jamoasi 100% bir xil\nUI boshqarishi shartmi?"}
    
    CheckPlatforms -->|"Ha, resurs kam"| DivKitPath["✅ Yandex DivKit yoki Judo tanlang\n(Tez, ammo ilova og'irlashadi)"]
    CheckPlatforms -->|"Yo'q, Apple tajribasi 1-o'rinda"| CheckQuality{"FinTech, E-Commerce, 120 FPS silliqlik,\nminimal hajm va qat'iy xavfsizlik kerakmi?"}
    
    CheckQuality -->|"Ha (Yuqori daraja)"| CustomPath["✅ O'z Custom SPM Frameworkingizni quring!\n(Tavsiya etiladigan yo'l)"]
    CheckQuality -->|"Yo'q"| DivKitPath

    style CustomPath fill:#0d1f14,stroke:#4ade80,stroke-width:2px
    style DivKitPath fill:#181d26,stroke:#60a5fa,stroke-width:1px
```

---

## 3. Enterprise In-House SDUI SPM Arxitekturasi

Agar siz kompaniyangizda professional darajadagi SDUI tizimini qursangiz, uni hech qachon asosiy loyiha kodi ichiga aralashtirib yozmasligingiz kerak. Uni toza, mustaqil va alohida test qilinadigan **Swift Package (SPM)** sifatida loyihalash shart.

Quyidagi diagrammada enterprise-darajadagi modulli ajratish ko'rsatilgan:

```mermaid
graph TD
    subgraph HostApp["Mobil Ilova (FinTech / Storefront)"]
        AppFeature["Features (Home, Orders, Profile)"]
    end

    subgraph SDUIPackage["EnterpriseSDUI (Swift Package)"]
        direction TB
        SDUINavigation["SDUINavigation\n(Router, Coordinators, Deeplink Resolver)"]
        SDUIRenderer["SDUIRenderer\n(View Builders, Registry, Modifiers)"]
        SDUIAnalytics["SDUIAnalytics\n(Impression & Click Tracker)"]
        SDUICore["SDUICore\n(Pure Models, JSON Schema, Safe Decoding, Protocols)"]

        SDUINavigation --> SDUICore
        SDUIRenderer --> SDUICore
        SDUIAnalytics --> SDUICore
    end

    AppFeature --> SDUINavigation
    AppFeature --> SDUIRenderer
    AppFeature --> SDUIAnalytics

    style SDUICore fill:#131720,stroke:#bef264,stroke-width:2px
    style SDUIRenderer fill:#131720,stroke:#7da2ce,stroke-width:1px
    style SDUINavigation fill:#131720,stroke:#7da2ce,stroke-width:1px
```

### Modullarning Qat'iy Vazifalari:
1. **`SDUICore` (Zero UI Dependency):**
   * Bu modulga `import SwiftUI` yoki `import UIKit` yozish **qat'iyan taqiqlanadi**.
   * Faqat sof Swift: `Decodable` modellar, Schema validatori, Action protokollari va xatolar iyerarxiyasi (`SDUIError`).
   * *Nega muhim?* Ushbu modulni hatto server tomonida (Swift Server / Vapor) ham qayta ishlatish mumkin!
2. **`SDUIRenderer` (Presentation Layer):**
   * `SDUICore` modellarini qabul qilib, ularni haqiqiy SwiftUI `View`lariga aylantiruvchi `ComponentRegistry` va Layout konteynerlari.
3. **`SDUINavigation` (Routing Layer):**
   * Serverdan kelgan dynamic navigatsiya komandalarini (`push`, `sheet`, `fullScreenCover`, `deeplink`) ilovaning navigatsiya stekiga xavfsiz ulovchi universal Router.
4. **`SDUIAnalytics` (Event Bus):**
   * Komponentlar ekranga chiqqanda (Impression) va bosilganda (Click) server belgilagan parametrlarni avtomatik ravishda tahlil tizimiga (Firebase/Amplitude) uzatuvchi qatlam.

---

## 4. Aniq Kod: Enterprise `Package.swift` Konfiguratsiyasi

Quyida Swift 6 Strict Concurrency standartiga moslashtirilgan mukammal `Package.swift` fayli:

```swift
// swift-tools-version: 6.0
import PackageDescription

let package = Package(
    name: "EnterpriseSDUI",
    platforms: [
        .iOS(.v17),
        .macOS(.v14)
    ],
    products: [
        .library(name: "SDUICore", targets: ["SDUICore"]),
        .library(name: "SDUIRenderer", targets: ["SDUIRenderer"]),
        .library(name: "SDUINavigation", targets: ["SDUINavigation"]),
        .library(name: "SDUIAnalytics", targets: ["SDUIAnalytics"])
    ],
    targets: [
        // 1. Asosiy Kontrakt va Modellar (Sof Swift, UI kutubxonalarisiz)
        .target(
            name: "SDUICore",
            dependencies: [],
            swiftSettings: [
                .enableUpcomingFeature("StrictConcurrency"),
                .enableUpcomingFeature("ExistentialAny")
            ]
        ),
        
        // 2. Chizuvchi Dvigatel (SwiftUI & UIKit)
        .target(
            name: "SDUIRenderer",
            dependencies: ["SDUICore"]
        ),
        
        // 3. Dinamik Navigatsiya va Routing
        .target(
            name: "SDUINavigation",
            dependencies: ["SDUICore"]
        ),
        
        // 4. Analitika va Event Bus
        .target(
            name: "SDUIAnalytics",
            dependencies: ["SDUICore"]
        ),
        
        // 5. Unit & Snapshot Testlar
        .testTarget(
            name: "EnterpriseSDUITests",
            dependencies: [
                "SDUICore",
                "SDUIRenderer",
                "SDUINavigation",
                "SDUIAnalytics"
            ]
        )
    ]
)
```

---

## 5. Loyiha Papkalar Strukturasi (Directory Blueprint)

Enterprise SPM paketi quyidagi fayl strukturasiga ega bo'lishi kerak:

```
EnterpriseSDUI/
├── Package.swift
├── Sources/
│   ├── SDUICore/
│   │   ├── Models/
│   │   │   ├── ComponentNode.swift
│   │   │   ├── ActionNode.swift
│   │   │   └── LayoutNode.swift
│   │   ├── Decoding/
│   │   │   ├── SafeDecodableArray.swift
│   │   │   └── AnyCodable.swift
│   │   └── Protocols/
│   │       └── SDUIActionHandling.swift
│   ├── SDUIRenderer/
│   │   ├── Registry/
│   │   │   ├── ComponentRegistry.swift
│   │   │   └── FallbackViews.swift
│   │   └── Containers/
│   │       ├── SDUIScreenView.swift
│   │       └── SDUIDynamicGrid.swift
│   ├── SDUINavigation/
│   │   ├── Router/
│   │   │   ├── SDUIRouter.swift
│   │   │   └── PresentationStyle.swift
│   │   └── Resolvers/
│   │       └── DeeplinkResolver.swift
│   └── SDUIAnalytics/
│       └── Tracker/
│           └── SDUIEventDispatcher.swift
└── Tests/
    └── EnterpriseSDUITests/
        ├── DecodingTests.swift
        └── RouterTests.swift
```

---

## 6. Interaktiv Savol-Javob (Self-Check Quiz)

<details>
<summary><b>1-Savol: Nega SDUICore moduliga 'import SwiftUI' qilish Clean Architecture tamoyillarini buzadi?</b> (Yechimni ko'rish uchun bosing)</summary>

**Tahlil va Yechim:**
Domen va Kontrakt qatlami (Domain/Contract Layer) taqdimot qatlamidan (Presentation Layer) butunlay mustaqil bo'lishi shart. Agar `SDUICore` SwiftUI'ga bog'lansa:
1. Uni UIKit loyihalarida yoki server tomonida (Swift Server / Vapor) qayta ishlatib bo'lmaydi.
2. `SDUICore` Unit testlari UI oynasi yaratilmasdan, sof CPU registrlarida 10x tezroq bajariladi.
3. SwiftUI versiya o'zgarishlari (masalan iOS 17 -> iOS 18) Core modellarga hech qanday ta'sir ko'rsatmaydi.
</details>

<details>
<summary><b>2-Savol: Qaysi holatda DivKit'ni tanlash o'z dvigatelingizni yozishdan afzalroq bo'ladi?</b> (Yechimni ko'rish uchun bosing)</summary>

**Tahlil va Yechim:**
Agar kompaniyada alohida iOS, Android va Web mobil jamoalari bo'lmasa yoki dasturchilar soni cheklangan bo'lsa, va 1 ta yagona backend jamoasi barcha 3 ta platforma uchun 1 kunda bir xil layout ishlab chiqarishi shart bo'lsa. DivKit har uchala platforma uchun tayyor chizish dvigateliga ega bo'lgani sababli bir necha oylik ishlab chiqish vaqtini tejab beradi.
</details>

---

## 7. Amaliy Topshiriq (Senior Challenge)

Terminalingizda alohida `EnterpriseSDUI` nomli SPM paketi yarating va yuqoridagi `Package.swift` konfiguratsiyasini kiriting. `swift build` buyrug'i orqali barcha 4 ta modul muammosiz kompilyatsiya bo'lishini va modullar o'rtasida circular dependency (aylanma bog'liqlik) yo'qligini tekshiring!
