Mundarija (22)
- 1. Kirish va motivatsiya
- 2. Nazariya — chuqur tushuntirish
- 2.1. Clean Architecture nima
- 2.2. Bog'liqlik qoidasi (ichkariga)
- 2.3. Halqalar: entities, use cases, adapters
- 2.4. Domen — texnologiyadan mustaqil
- 2.5. Bog'liqlikni teskari qilish (DIP)
- 2.6. Clean Architecture foydasi va narxi
- 2.7. Clean Architecture va qatlamlar
- 2.8. Clean Architecture — yadroni himoya qilish
- 3. Tez ma'lumotnoma
- 4. Batafsil misollar
- Misol 1 — Domen: texnologiyasiz entity
- Misol 2 — Use case va interfeys (bog'liqlik ichkariga)
- Misol 3 — Texnologiya almashtirish (domen tegilmaydi)
- Misol 4 — To'liq oqim (halqalar birga)
- 5. To'g'ri va noto'g'ri tushunishlar
- 6. Keng tarqalgan xatolar va yechimlari
- 7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 8. Eng yaxshi amaliyotlar
- 9. Amaliy topshiriq
- Xulosa
27.7-dars: Clean Architecture
27-QISM — ARXITEKTURA · 7-dars
1. Kirish va motivatsiya
Qatlamli arxitekturada 27.6-bob bir muammo bor: biznes mantiq odatda ma'lumot qatlamiga (bazaga) bog'liq bo'ladi — baza o'zgarsa, biznes mantiq ham ta'sirlanadi. Lekin biznes qoidalari — tizimning eng qimmatli va barqaror qismi; ular texnik tafsilotlarga (baza, veb-freymvork, tashqi xizmat) bog'liq bo'lmasligi kerak. Clean Architecture — qatlamlarni "ichkariga burab", domenni (biznes mantiq) markazga qo'yadi: bog'liqlik doim ichkariga yo'naladi (tashqi tafsilotlar domenga bog'liq, teskarisi emas). Yadro (biznes qoidalari) hech narsaga bog'liq emas — eng barqaror, mustaqil, sinaladigan.
Clean Architecture (Robert Martin) — bog'liqlikni ichkariga yo'naltiruvchi arxitektura: markazda entities (korxona qoidalari — asosiy modellar), atrofida use cases (ilova qoidalari — amaliyotlar), tashqarida interface adapters (kontrollerlar, taqdimot), eng tashqarida frameworks & drivers (baza, veb, UI). Bog'liqlik qoidasi (Dependency Rule): kod bog'liqligi faqat ichkariga yo'naladi — ichki halqa tashqisini bilmaydi. Domen (yadro) baza, veb, freymvorkni bilmaydi — ular domenni bilishadi (DIP — 27.2). Bu qatlamli arxitekturani 27.6-bob takomillashtiradi: bog'liqlik yo'nalishini domen foydasiga o'zgartiradi. Clean Architecture — domenni markazga qo'yish.
Real vaziyat. Bir loyihada biznes mantiq to'g'ridan-to'g'ri ORM modellariga (baza) bog'liq edi — bazani PostgreSQL dan MongoDB ga o'zgartirish biznes mantiqni ham qayta yozishni talab qildi. Clean Architecture qo'llanildi: domen sof Python obyektlar (bazasiz), repository interfeys domenda, amalga oshirish tashqarida. Baza o'zgarganda — faqat adapter (repository amalga oshirishi). Domen tegilmadi. Biznes mantiq texnologiyadan ozod bo'ldi. Clean Architecture — yadroni himoya qildi.
Bu darsda Clean Architecture ni o'rganamiz.
Bu darsda:
- Clean Architecture nima
- Bog'liqlik qoidasi (ichkariga)
- Halqalar: entities, use cases, adapters
- Domen — texnologiyadan mustaqil
- Bog'liqlikni teskari qilish (DIP)
- Clean Architecture foydasi va narxi
- Clean Architecture va qatlamlar
- Amaliy: domen markazda
ℹ Misollar sof Python bilan — domen bazasiz (deterministik).
2. Nazariya — chuqur tushuntirish
2.1. Clean Architecture nima
Domen markazda, bog'liqlik ichkariga:
┌─────────────────────────────────┐
│ Frameworks (baza, veb, UI) │ ← tashqi
│ ┌───────────────────────────┐ │
│ │ Interface Adapters │ │
│ │ ┌─────────────────────┐ │ │
│ │ │ Use Cases (amallar) │ │ │
│ │ │ ┌───────────────┐ │ │ │
│ │ │ │ Entities │ │ │ │ ← markaz (yadro)
│ │ │ └───────────────┘ │ │ │
│ │ └─────────────────────┘ │ │
│ └───────────────────────────┘ │
└─────────────────────────────────┘
bog'liqlik: doim ichkariga →Clean Architecture — tizimni konsentrik halqalar ga bo'lib, domenni (biznes qoidalari) markazga qo'yadi: markazda entities (asosiy modellar), atrofida use cases (amaliyotlar), tashqarida adapters (kontroller), eng tashqarida frameworks (baza, veb). Asosiy g'oya: bog'liqlik ichkariga — ichki halqa tashqisini bilmaydi (domen bazani bilmaydi). Sabab: biznes qoidalari — eng qimmatli va barqaror; ularni texnik tafsilotlardan (baza, freymvork) ajratish (ular o'zgaradi, qoidalar qoladi). Clean Architecture — yadroni himoya qilish.
2.2. Bog'liqlik qoidasi (ichkariga)
Manba kodi bog'liqligi faqat ichkariga:
Tashqi halqa → ichki halqani biladi (bog'liq)
Ichki halqa → tashqini BILMAYDI
Domen (ichki) baza (tashqi) ni bilmaydi
Baza domenni biladi (unga moslashadi)Bog'liqlik qoidasi (Dependency Rule) — Clean Architecture ning asosiy qonuni: manba kodi bog'liqligi faqat ichkariga yo'naladi (tashqi halqadan ichkiga) — ichki halqa tashqi haqida hech narsa bilmaydi. Domen (markaz) baza, veb, UI nomlarini ham bilmaydi; tashqi qatlamlar domenga moslashadi. Sabab: agar domen bazaga bog'liq bo'lsa — baza o'zgarishi domenni buzadi; teskarisi (baza domenga bog'liq) — baza o'zgaradi, domen barqaror. Bu DIP 27.2-bob ning arxitektura darajasi. Bog'liqlik qoidasi — yadro mustaqilligi.
2.3. Halqalar: entities, use cases, adapters
Ichkaridan tashqariga:
| Halqa | Mas'uliyat |
|---|---|
| Entities | Korxona qoidalari (asosiy model) |
| Use Cases | Ilova qoidalari (amaliyot) |
| Adapters | Kontroller, taqdimot, repository |
| Frameworks | Baza, veb, UI, tashqi |
Halqalar (ichkaridan): Entities (mohiyatlar) — eng asosiy biznes qoidalari va modellar (korxona darajasi — masalan "buyurtma summasi manfiy bo'lmaydi"); Use Cases (foydalanish holatlari) — aniq amaliyotlar (ilova darajasi — "buyurtma yaratish", entities ni orkestrlaydi); Interface Adapters — tashqi va ichki orasidagi tarjimon (kontroller, taqdimot, repository amalga oshirishi); Frameworks & Drivers — texnik tafsilotlar (baza, veb-freymvork, UI). Har halqa ichkarisiga bog'liq (tashqarisiga emas). Halqalar — mavhumlik darajalari (markaz — eng mavhum, tashqi — eng aniq).
2.4. Domen — texnologiyadan mustaqil
# domen: sof Python (baza, veb, freymvork YO'Q)
class Buyurtma:
def __init__(self, summa: float):
if summa < 0:
raise ValueError("summa manfiy bo'lmaydi")
self.summa = summa
def chegirma(self, foiz): return self.summa * (1 - foiz/100)
# import sqlalchemy YO'Q, import fastapi YO'Q Domen mustaqilligi — domen (entities, use cases) sof til (Python) da yoziladi, hech qanday tashqi texnologiyaga import qilmaydi: baza (sqlalchemy), veb (fastapi), tashqi kutubxona yo'q — faqat biznes qoidalari. Sabab: domen texnologiyadan ozod bo'lsa — texnologiya almashsa (PostgreSQL → MongoDB, FastAPI → Flask) domen tegilmaydi; domen mustaqil sinaladi (baza/server kerak emas); domen — eng barqaror. Belgi: domen faylida import faqat standart kutubxona (yoki boshqa domen). Domen mustaqilligi — texnologiyadan ozodlik.
2.5. Bog'liqlikni teskari qilish (DIP)
Interfeys domenda, amalga oshirish tashqarida:
# domen interfeysni belgilaydi (ichkarida)
class BuyurtmaOmbori(Protocol):
def saqla(self, b: Buyurtma) -> None: ...
# tashqi qatlam interfeysni amalga oshiradi
class PostgresOmbori: # framework halqasi
def saqla(self, b): ... # domenga moslashadiBog'liqlikni teskari qilish — domen bazaga bog'lanmasligi uchun: domen interfeys (repository shartnomasi) ni belgilaydi (ichkarida), tashqi qatlam bu interfeysni amalga oshiradi (tashqarida). Natija: bog'liqlik teskari — baza domenga bog'liq (interfeysga moslashadi), domen bazani bilmaydi. Bu DIP 27.2-bob ning yuragi: ikkalasi abstraksiyaga (interfeysga) bog'lanadi, abstraksiya domenga tegishli. Use case interfeysni ishlatadi (aniq bazani emas). Bog'liqlikni teskari qilish — Clean Architecture mexanizmi. Interfeys ichkarida — bog'liqlik ichkariga.
2.6. Clean Architecture foydasi va narxi
Foydalar: texnologiya mustaqilligi (baza/freymvork almashadi, domen qoladi); sinaladiganlik (domen bazasiz/serversiz sinaladi — tez, ishonchli); barqarorlik (yadro o'zgarmaydi — talab o'zgarsa, tashqi qatlam); ravshanlik (biznes qoidalari bir joyda, aniq). Narx: ko'proq kod (interfeys, adapter, DTO — ko'p sinf/fayl); ko'proq mavhumlik (o'rganish qiyinroq); ortiqcha (kichik loyihaga — KISS buzildi). Clean Architecture — katta, uzoq muddatli, murakkab biznes uchun (oddiy CRUD ga ortiqcha). Muvozanat: yadro qimmat bo'lsa qo'llash. Narx: mavhumlik va kod (kichik loyihaga ortiqcha).
2.7. Clean Architecture va qatlamlar
Clean Architecture — qatlamli arxitekturaning (27.6) takomillashtirilgan shakli: qatlamli — bog'liqlik yuqoridan pastga (taqdimot → mantiq → baza, mantiq bazaga bog'liq); Clean — bog'liqlik ichkariga (baza → mantiq, baza domenga bog'liq). Farq: qatlamlida domen (mantiq) pastdagi bazaga bog'liq; Clean da domen markazda, hech narsaga bog'liq emas. Boshqa nomlar: Hexagonal (portlar-adapterlar), Onion (piyoz) — bir g'oya (domen markazda, bog'liqlik ichkariga). Ular DIP 27.2-bob, strukturaviy naqshlar (Adapter — 27.4) ustiga quriladi. Clean Architecture — qatlamli + bog'liqlik teskari (domen foydasiga).
2.8. Clean Architecture — yadroni himoya qilish
Clean Architecture asosiy g'oyasi — eng qimmatlini himoya qilish: biznes qoidalari (domen) tizimning sababi va qiymati; texnologiya (baza, veb, freymvork) — o'zgaruvchi vosita (ular kelib-ketadi, qoidalar qoladi). Yadroni tashqi tafsilotlarga bog'lamaslik uni barqaror va uzoq umrli qiladi. Bu "detallarni kechiktirish" falsafasi: avval biznes qoidalarini yoz (domen), texnologiya qarorini (qaysi baza) keyinga qoldir (adapter almashadi). Bu SOLID (27.2 — DIP), qatlamlar 27.6-bob, DDD (27.8 — domen urg'usi) bilan uyg'un. Katta, uzoq yashaydigan tizim uchun kuchli. Clean Architecture — qiymatni (domen) texnologiyadan ustun qo'yish. Yadro barqaror — tizim uzoq yashaydi.
3. Tez ma'lumotnoma
# HALQALAR (ichkaridan tashqariga):
# 1. Entities — asosiy model + qoida (sof Python)
# 2. Use Cases — amaliyot (entities ni ishlatadi)
# 3. Adapters — kontroller, repository amalga oshirishi
# 4. Frameworks — baza, veb, UI
# DOMEN (ichki) — texnologiyasiz:
class Buyurtma: # entity
def __init__(self, summa):
if summa < 0: raise ValueError()
self.summa = summa
class BuyurtmaOmbori(Protocol): # interfeys (domenda)
def saqla(self, b): ...
class YaratishUseCase: # use case
def __init__(self, ombor: BuyurtmaOmbori):
self.ombor = ombor # interfeysga bog'liq
def bajar(self, summa):
b = Buyurtma(summa)
self.ombor.saqla(b)
return b
# TASHQI (framework) — interfeysni amalga oshiradi:
class PostgresOmbori: # domenga moslashadi
def saqla(self, b): ...
# BOG'LIQLIK QOIDASI: faqat ichkariga (domen tashqini bilmaydi)Clean Architecture xulosasi
Domen markazda (entities + use cases) — sof Python
Bog'liqlik doim ICHKARIGA (domen tashqini bilmaydi)
Interfeys domenda, amalga oshirish tashqarida (DIP)
Foyda: texnologiya mustaqil, sinaladigan, barqaror
Narx: ko'p kod/mavhumlik (katta loyihaga — KISS)4. Batafsil misollar
Misollar sof Python bilan — domen bazasiz (deterministik).
Misol 1 — Domen: texnologiyasiz entity
"""Entity: sof biznes qoidalari (baza, veb import YO'Q)."""
class Buyurtma:
"""Domen entity — faqat biznes qoidalari."""
def __init__(self, mahsulot: str, summa: float) -> None:
# biznes qoidasi: summa manfiy bo'lmaydi
if summa < 0:
raise ValueError("Summa manfiy bo'lmaydi")
self.mahsulot = mahsulot
self.summa = summa
def chegirma_qollab(self, foiz: float) -> float:
# biznes qoidasi: chegirma 0-50%
if not 0 <= foiz <= 50:
raise ValueError("Chegirma 0-50% oralig'ida")
return round(self.summa * (1 - foiz / 100), 2)
def main() -> None:
print("=== 1. Buyurtma yaratish (qoida bilan) ===")
b = Buyurtma("Python kursi", 1000)
print(f" {b.mahsulot}: {b.summa}")
print("\n=== 2. Manfiy summa — qoida ishlaydi ===")
try:
Buyurtma("Xato", -100)
except ValueError as e:
print(f" {e}")
print("\n=== 3. Chegirma (biznes qoidasi) ===")
print(f" 20% chegirma: {b.chegirma_qollab(20)}")
print("\n=== 4. Chegirma cheklovi ===")
try:
b.chegirma_qollab(80)
except ValueError as e:
print(f" {e}")
print(" domen sof Python (baza/veb import yo'q)")
print(" ⭐ Entity — texnologiyasiz biznes qoidalari")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Buyurtma yaratish (qoida bilan) ===
Python kursi: 1000
=== 2. Manfiy summa — qoida ishlaydi ===
Summa manfiy bo'lmaydi
=== 3. Chegirma (biznes qoidasi) ===
20% chegirma: 800.0
=== 4. Chegirma cheklovi ===
Chegirma 0-50% oralig'ida
domen sof Python (baza/veb import yo'q)
⭐ Entity — texnologiyasiz biznes qoidalariNima ko'rsatdi: 2.1, 2.4-bo'limlar.
Misol 2 — Use case va interfeys (bog'liqlik ichkariga)
"""Use case: interfeysga bog'lanadi (aniq bazaga emas) — bog'liqlik ichkariga."""
from abc import ABC, abstractmethod
# --- DOMEN (ichki halqa) ---
class Buyurtma:
def __init__(self, mahsulot: str, summa: float) -> None:
if summa < 0:
raise ValueError("summa manfiy")
self.mahsulot = mahsulot
self.summa = summa
class BuyurtmaOmbori(ABC):
"""Interfeys — DOMENDA belgilanadi (bog'liqlik ichkariga)."""
@abstractmethod
def saqla(self, b: Buyurtma) -> int: ...
class BuyurtmaYaratish:
"""Use case — interfeysga bog'liq (aniq bazaga emas)."""
def __init__(self, ombor: BuyurtmaOmbori) -> None:
self.ombor = ombor
def bajar(self, mahsulot: str, summa: float) -> dict:
buyurtma = Buyurtma(mahsulot, summa) # domen qoidasi
buyurtma_id = self.ombor.saqla(buyurtma)
return {"id": buyurtma_id, "mahsulot": mahsulot}
# --- TASHQI (framework halqasi) ---
class XotiraOmbori(BuyurtmaOmbori):
"""Interfeysni amalga oshiradi (domenga moslashadi)."""
def __init__(self) -> None:
self._saqlangan: list = []
def saqla(self, b: Buyurtma) -> int:
self._saqlangan.append(b)
return len(self._saqlangan)
def main() -> None:
ombor = XotiraOmbori()
use_case = BuyurtmaYaratish(ombor)
print("=== 1. Use case orqali buyurtma ===")
print(f" {use_case.bajar('Python kursi', 1000)}")
print(f" {use_case.bajar('Go kursi', 1200)}")
print("\n=== 2. Saqlangan (ombor) ===")
print(f" jami: {len(ombor._saqlangan)}")
print("\n=== 3. Use case ombor turini bilmaydi ===")
print(" BuyurtmaOmbori interfeysiga bog'liq")
print(" XotiraOmbori — amalga oshirish (tashqi)")
print("\n=== 4. Bog'liqlik yo'nalishi ===")
print(" interfeys domenda, amalga oshirish tashqarida")
print(" baza almashsa — use case tegilmaydi")
print(" ⭐ Bog'liqlik ichkariga (domen mustaqil)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Use case orqali buyurtma ===
{'id': 1, 'mahsulot': 'Python kursi'}
{'id': 2, 'mahsulot': 'Go kursi'}
=== 2. Saqlangan (ombor) ===
jami: 2
=== 3. Use case ombor turini bilmaydi ===
BuyurtmaOmbori interfeysiga bog'liq
XotiraOmbori — amalga oshirish (tashqi)
=== 4. Bog'liqlik yo'nalishi ===
interfeys domenda, amalga oshirish tashqarida
baza almashsa — use case tegilmaydi
⭐ Bog'liqlik ichkariga (domen mustaqil)Nima ko'rsatdi: 2.2, 2.5-bo'limlar.
Misol 3 — Texnologiya almashtirish (domen tegilmaydi)
"""Texnologiya mustaqilligi: baza almashadi, domen/use case tegilmaydi."""
from abc import ABC, abstractmethod
class Mahsulot:
def __init__(self, nom: str, narx: float) -> None:
self.nom = nom
self.narx = narx
class MahsulotOmbori(ABC):
@abstractmethod
def barchasi(self) -> list: ...
class NarxXizmati:
"""Use case — interfeysga bog'liq."""
def __init__(self, ombor: MahsulotOmbori) -> None:
self.ombor = ombor
def ortacha_narx(self) -> float:
mahsulotlar = self.ombor.barchasi()
if not mahsulotlar:
return 0.0
return round(sum(m.narx for m in mahsulotlar) / len(mahsulotlar), 2)
# ikki xil "baza" — bir xil interfeys
class SqlOmbori(MahsulotOmbori):
def barchasi(self) -> list:
return [Mahsulot("A", 100), Mahsulot("B", 200)]
class NosqlOmbori(MahsulotOmbori):
def barchasi(self) -> list:
return [Mahsulot("X", 300), Mahsulot("Y", 500)]
def main() -> None:
print("=== 1. SQL ombor bilan ===")
xizmat_sql = NarxXizmati(SqlOmbori())
print(f" o'rtacha narx: {xizmat_sql.ortacha_narx()}")
print("\n=== 2. NoSQL ombor bilan (almashtirildi) ===")
xizmat_nosql = NarxXizmati(NosqlOmbori())
print(f" o'rtacha narx: {xizmat_nosql.ortacha_narx()}")
print("\n=== 3. Bir xil use case ===")
print(" NarxXizmati kodi o'zgarmadi (ikkalasida)")
print("\n=== 4. Texnologiya mustaqilligi ===")
print(" baza SQL→NoSQL — domen/use case tegilmadi")
print(" faqat ombor amalga oshirishi almashdi")
print(" ⭐ Domen texnologiyadan mustaqil")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. SQL ombor bilan ===
o'rtacha narx: 150.0
=== 2. NoSQL ombor bilan (almashtirildi) ===
o'rtacha narx: 400.0
=== 3. Bir xil use case ===
NarxXizmati kodi o'zgarmadi (ikkalasida)
=== 4. Texnologiya mustaqilligi ===
baza SQL→NoSQL — domen/use case tegilmadi
faqat ombor amalga oshirishi almashdi
⭐ Domen texnologiyadan mustaqilNima ko'rsatdi: 2.4, 2.6-bo'limlar.
Misol 4 — To'liq oqim (halqalar birga)
"""To'liq Clean oqim: framework → adapter → use case → entity (va qaytish)."""
from abc import ABC, abstractmethod
# --- ENTITY (markaz) ---
class Hisob:
def __init__(self, balans: float = 0) -> None:
self.balans = balans
def yechish(self, miqdor: float) -> None:
# biznes qoidasi: balansdan ko'p yechib bo'lmaydi
if miqdor > self.balans:
raise ValueError("Mablag' yetarli emas")
self.balans -= miqdor
# --- USE CASE ---
class HisobOmbori(ABC):
@abstractmethod
def ol(self, hisob_id: int) -> Hisob: ...
@abstractmethod
def saqla(self, hisob_id: int, h: Hisob) -> None: ...
class PulYechish:
def __init__(self, ombor: HisobOmbori) -> None:
self.ombor = ombor
def bajar(self, hisob_id: int, miqdor: float) -> float:
hisob = self.ombor.ol(hisob_id)
hisob.yechish(miqdor) # entity qoidasi
self.ombor.saqla(hisob_id, hisob)
return hisob.balans
# --- ADAPTER (repository) ---
class XotiraHisobOmbori(HisobOmbori):
def __init__(self) -> None:
self._db = {1: Hisob(1000)}
def ol(self, hisob_id: int) -> Hisob:
return self._db[hisob_id]
def saqla(self, hisob_id: int, h: Hisob) -> None:
self._db[hisob_id] = h
# --- FRAMEWORK (taqdimot/kontroller) ---
class HisobKontroller:
def __init__(self, use_case: PulYechish) -> None:
self.use_case = use_case
def yechish(self, hisob_id: int, miqdor: float) -> dict:
try:
balans = self.use_case.bajar(hisob_id, miqdor)
return {"holat": "ok", "balans": balans}
except ValueError as e:
return {"holat": "xato", "sabab": str(e)}
def main() -> None:
# halqalarni ulash (tashqidan ichkariga)
ombor = XotiraHisobOmbori()
use_case = PulYechish(ombor)
kontroller = HisobKontroller(use_case)
print("=== 1. Pul yechish (to'liq oqim) ===")
print(f" 300 yechish: {kontroller.yechish(1, 300)}")
print("\n=== 2. Yana yechish ===")
print(f" 200 yechish: {kontroller.yechish(1, 200)}")
print("\n=== 3. Mablag' yetmasa (entity qoidasi) ===")
print(f" 1000 yechish: {kontroller.yechish(1, 1000)}")
print("\n=== 4. Oqim: kontroller→use case→entity ===")
print(" qoida entityda, orkestr use caseda")
print(" har halqa ichkarisiga bog'liq")
print(" ⭐ Clean — halqalar birga (domen markazda)")
if __name__ == "__main__":
main()Natijaning muhim qismi:
=== 1. Pul yechish (to'liq oqim) ===
300 yechish: {'holat': 'ok', 'balans': 700}
=== 2. Yana yechish ===
200 yechish: {'holat': 'ok', 'balans': 500}
=== 3. Mablag' yetmasa (entity qoidasi) ===
1000 yechish: {'holat': 'xato', 'sabab': "Mablag' yetarli emas"}
=== 4. Oqim: kontroller→use case→entity ===
qoida entityda, orkestr use caseda
har halqa ichkarisiga bog'liq
⭐ Clean — halqalar birga (domen markazda)Nima ko'rsatdi: 2.1–2.5-bo'limlar.
5. To'g'ri va noto'g'ri tushunishlar
| Noto'g'ri fikr | To'g'risi |
|---|---|
| "Domen bazaga bog'liq" | Bog'liqlik ichkariga (teskari) |
| "Interfeys tashqarida" | Interfeys domenda |
| "Domen ORM modeli" | Sof Python (texnologiyasiz) |
| "Clean har loyihaga" | Katta, uzoq muddatli |
| "Bir xil qatlamli" | Bog'liqlik teskari (domen markaz) |
| "Ko'p kod — yomon" | Yadro himoyasi narxi |
| "Freymvork markazda" | Domen markazda |
| "Texnologiya avval" | Detalni kechiktir |
6. Keng tarqalgan xatolar va yechimlari
1. Domen bazaga bog'liq (import)
# domen faylida: import sqlalchemy # ⚠️
# domen sof Python (interfeys orqali) # ✅2. Interfeys tashqi qatlamda
# repository interfeysi baza modulida # ⚠️
# interfeys domenda (bog'liqlik ichkariga) # ✅3. Use case aniq bazaga
def __init__(self): self.db = Postgres() # ⚠️
def __init__(self, repo: Repository) # ✅4. Domen ORM modeli bilan aralash
class Buyurtma(Base): # SQLAlchemy # ⚠️
class Buyurtma: # sof + alohida ORM model # ✅5. Kichik loyihaga Clean (ortiqcha)
# oddiy CRUD ga 4 halqa, ko'p interfeys # ⚠️
# hajmga qarab (oddiy — qatlamli yoki sodda) # ✅6. Biznes qoidasi tashqarida (adapter/kontroller)
# kontrollerda soliq hisobi # ⚠️
# qoida entity/use caseda # ✅7. Halqani sakrash (kontroller→entity to'g'ridan)
# kontroller entityni to'g'ridan yaratadi # ⚠️
# use case orqali (orkestr) # ✅7. Integratsiya — bu bilim qayerda kerak bo'ladi
- 27.6-dars (o'tilgan): Qatlamli — Clean asosi
- 27.8-dars: DDD — domen urg'usi
- 27.2-dars (o'tilgan): SOLID — DIP (yadrosi)
- 23-qism (o'tilgan): ORM — adapter (domendan tashqarida)
- 20-qism (o'tilgan): FastAPI — framework halqasi
8. Eng yaxshi amaliyotlar
Domen sof (texnologiya import yo'q).
Interfeys domenda (bog'liqlik ichkariga).
Use case interfeysga bog'liq (DIP).
Biznes qoidasi entity/use caseda.
Domen va ORM model alohida.
Detalni kechiktir (texnologiya keyin).
Katta/uzoq loyihaga (KISS — kichikka sodda).
Halqa sakramaslik (use case orqali).
9. Amaliy topshiriq
Vazifa 1: Bashorat qiling
1. # Clean Architecture nima?
2. # bog'liqlik qoidasi nima?
3. # bog'liqlik qaysi yo'nalishda?
4. # entities nima?
5. # use cases nima?
6. # adapters nima?
7. # frameworks nima?
8. # domen nimaga bog'liq?
9. # interfeys qayerda?
10. # domen mustaqilligi nima?
11. # Clean vs qatlamli?
12. # narxi?Javoblar
- Domen markazda, bog'liqlik ichkariga
- Bog'liqlik faqat ichkariga
- Ichkariga (tashqi → ichki)
- Asosiy model + korxona qoidasi
- Amaliyotlar (ilova qoidasi)
- Kontroller, repository (tarjimon)
- Baza, veb, UI (tashqi)
- Hech narsaga (mustaqil)
- Domenda (ichkarida)
- Texnologiyasiz (sof Python)
- Clean — bog'liqlik teskari (domen markaz)
- Ko'p kod/mavhumlik
Vazifa 2: Xatolarni tuzating
1. # domen: import sqlalchemy # sof
2. # interfeys baza modulida # domenda
3. self.db = Postgres() # interfeys
4. class Buyurtma(Base) # sof + ORM alohida
5. # kontrollerda soliq hisobi # use caseJavoblar
1. domen sof Python (interfeys orqali)
2. interfeys domenda (bog'liqlik ichkariga)
3. def __init__(self, repo: Repository)
4. class Buyurtma: # sof + alohida ORM
5. qoida entity/use casedaVazifa 3: Entity
Tuzing:
- Model
- Qoida
- Sof Python
- Import yo'q
Vazifa 4: Use case
Tuzing:
- Interfeys
- Bog'lanish
- Entity ishlatish
- Amaliyot
Vazifa 5: Bog'liqlik
Tekshiring:
- Ichkariga
- Domen mustaqil
- Interfeys domenda
- Baza moslashadi
Vazifa 6: Almashtirish
Tuzing:
- Interfeys
- SQL
- NoSQL
- Domen tegilmaydi
Vazifa 7: O'ylash
Clean Architecture ning markaziy g'oyasi — biznes qoidalari (domen) texnologiyadan (baza, freymvork) qimmatliroq va barqarorroq, shuning uchun himoyalanishi kerak. Nima uchun ko'p dasturchi buni teskari his qiladi (texnologiya — asosiy, biznes qoidasi — "shunchaki kod"), va nega "detalni kechiktirish" (texnologiya qarorini keyinga qoldirish) amalda juda qiyin (garchi nazariyada to'g'ri bo'lsa)?
Javob
Qisqa javob: Ko'p dasturchi buni teskari his qiladi, chunki: texnologiya ko'rinadigan va hayajonli (yangi freymvork, baza — o'rganiladi, gaplashiladi, rezyumega yoziladi), biznes qoidalari zerikarli va "aniq" ("shunchaki soliq hisobi" — ahamiyatsiz tuyuladi); dasturchi texnik muammolarni yechishni yoqtiradi (freymvork sozlash, optimizatsiya — qiziqarli), biznes qoidalari esa domen bilimi talab qiladi (soha ekspertlari bilan gaplashish — texnik emas). Lekin bu yanglish: texnologiya almashadi (5 yilda freymvork eskiradi, baza o'zgaradi), biznes qoidalari qoladi (soliq hisobi 20 yil bir xil) — qiymat qoidalarda (tizim nima uchun mavjud), texnologiya faqat vosita (qanday). "Detalni kechiktirish" amalda qiyin, chunki: bosim (loyiha boshida "qaysi baza?" savoli darrov chiqadi — jamoa qaror kutadi), noqulaylik (interfeys yozish — qo'shimcha ish, aniq bazani ishlatish tezroq), ko'rinmas foyda (kechiktirishning foydasi keyin — baza o'zgarganda — ko'rinadi, hozir emas), odat (ko'p dasturchi bazadan boshlaydi — jadval loyihalash, keyin kod). Nazariyada to'g'ri (domen avval), amalda qiyin (bosim, noqulaylik, odat). Yechim: intizom (domenni avval o'ylash — texnologiyasiz), interfeys bilan chegara (baza qarorini adapter ichida ushlash). Muhandislik saboqlari: qiymat — biznes qoidalarda (texnologiya vosita); texnologiya hayajonli, lekin o'tkinchi; domen zerikarli, lekin barqaror; "detalni kechiktirish" — intizom (bosimga qarshi); yaxshi arxitektura — qiymatni (domen) himoya qiladi (texnologiyani ushlaydi).
1. Nega teskari his qilinadi
- Texnologiya ko'rinadigan, hayajonli (yangi, rezyume)
- Biznes qoidasi zerikarli, "aniq" (ahamiyatsiz tuyuladi)
- Dasturchi texnik muammoni yoqtiradi (domen bilimi emas)
2. Nega yanglish
| Narsa | Umri |
|---|---|
| Texnologiya | Almashadi (5 yil) |
| Biznes qoidasi | Qoladi (20 yil) |
Qiymat qoidalarda (nima uchun), texnologiya vosita (qanday).
3. Nega kechiktirish qiyin
- Bosim ("qaysi baza?" darrov)
- Noqulaylik (interfeys — qo'shimcha ish)
- Ko'rinmas foyda (keyin ko'rinadi)
- Odat (bazadan boshlash)
4. Yechim
Intizom (domen avval), interfeys chegara (baza adapterda). Bosimga qarshi.
5. Muhandislik saboqlari
- Qiymat — biznes qoidalarda (texnologiya vosita)
- Texnologiya hayajonli, lekin o'tkinchi
- Domen zerikarli, lekin barqaror
- Detalni kechiktirish — intizom
6. Xulosa
- Texnologiya ko'rinadigan (his teskari)
- Qoidalar barqaror, texnologiya almashadi
- Kechiktirish qiyin (bosim, odat)
- Intizom — qiymatni himoya qil
Nimani mustahkamlaydi: 2.6, 2.8-bo'limlar.
Xulosa
Bu darsda Clean Architecture ni o'rgandik.
Eng muhim uch fikr:
Clean Architecture va bog'liqlik qoidasi. Clean Architecture — tizimni konsentrik halqalar ga bo'lib, domenni (biznes qoidalari) markazga qo'yadi: markazda entities (asosiy model), atrofida use cases (amaliyot), tashqarida adapters (kontroller), eng tashqarida frameworks (baza, veb). Bog'liqlik qoidasi (Dependency Rule) — asosiy qonun: manba kodi bog'liqligi faqat ichkariga (tashqi → ichki), ichki halqa tashqini bilmaydi (domen bazani bilmaydi, baza domenga moslashadi). Sabab: baza domenga bog'liq bo'lsa — baza o'zgaradi, domen barqaror (biznes qoidalari — eng qimmatli, o'zgarmas).
Domen mustaqilligi va bog'liqlikni teskari qilish. Domen mustaqilligi — domen (entities, use cases) sof Python da, tashqi texnologiyaga import yo'q (
sqlalchemy,fastapiyo'q — faqat biznes qoidalari): texnologiya almashsa (PostgreSQL → MongoDB) domen tegilmaydi, mustaqil sinaladi (baza kerak emas). Bog'liqlikni teskari qilish — domen interfeys (repository shartnomasi) ni belgilaydi (ichkarida), tashqi qatlam uni amalga oshiradi (tashqarida): bog'liqlik teskari (baza domenga moslashadi), DIP 27.2-bob ning yuragi. Use case interfeysga bog'liq (aniq bazaga emas).Foyda, narx, yadroni himoya qilish. Foydalar: texnologiya mustaqilligi (baza/freymvork almashadi, domen qoladi), sinaladiganlik (bazasiz — tez), barqarorlik (yadro o'zgarmaydi), ravshanlik. Narx: ko'proq kod (interfeys, adapter — ko'p sinf), ko'proq mavhumlik, ortiqcha (kichik loyihaga — KISS); Clean katta, uzoq muddatli, murakkab biznes uchun. Clean Architecture — qatlamli arxitekturaning 27.6-bob takomili (bog'liqlik ichkariga, domen markazda; Onion, Hexagonal — bir g'oya). Asosiy g'oya — eng qimmatlini himoya qilish: biznes qoidalari (domen, barqaror) texnologiyadan (o'zgaruvchi vosita) ustun; "detalni kechiktirish" (texnologiya qarorini keyinga) — nazariyada to'g'ri, amalda qiyin (bosim, odat — intizom talab qiladi). Yadro barqaror — tizim uzoq yashaydi. DDD 27.8-bob uchun asos.
Keyingi darsda Domain-Driven Design (DDD) kirishini o'rganamiz: murakkab biznes domenini kod bilan modellashtirimsh — umumiy til (ubiquitous language), chegaralangan kontekst (bounded context), entity, value object va aggregate tushunchalari bilan.
Izohlar (0)
Izoh yozish uchun kiring.
- Hozircha izoh yo'q. Birinchi bo'ling!