IlmHamroh
Python kursi/Arxitektura1/12-dars18 daqiqa
Mundarija (22)

27.1-dars: Toza kod tamoyillari

27-QISM — ARXITEKTURA · 1-dars


1. Kirish va motivatsiya

Kod bir marta yoziladi, lekin ko'p marta o'qiladi: siz olti oydan keyin, hamkasbingiz ertaga, kelajakdagi dasturchi bir yildan so'ng. Ishlaydigan, lekin chalkash kod — vaqt bombasi: har o'zgartirish qiyin, har xato yashiringan, har yangi dasturchi sarosimada. Toza kod — o'qish, tushunish, o'zgartirish oson kod: aniq nomlar, kichik funksiyalar, ravshan tuzilish. Toza kod — dasturchining eng muhim ko'nikmasi: ishlaydigan kod minimum, toza kod — professional.

Toza kod tamoyillari — kodni o'qiladigan qiladigan qoidalar: aniq nomlash (o'zgaruvchi, funksiya nima qilishini aytadi), kichik funksiyalar (bitta ish — bir mas'uliyat), DRY (Don't Repeat Yourself — takrorlamaslik), kommentariy (nima emas, nega), oddiylik (KISS — murakkablashtirmaslik), izchillik (bir uslub). Bu 12-qism (funksiyalar), 16-qism (OOP) da o'rganilgan — bu yerda tamoyil sifatida umumlashtiramiz. Toza kod — texnik ko'nikma emas, balki odat (kundalik intizom).

Real vaziyat. Bir loyihada "ishlaydigan" kod bor edi: 300 qatorli funksiyalar, x, tmp, data2 nomlari, takrorlangan bloklar. Yangi dasturchi bir hafta o'rgandi (nima qiladi?). Xato tuzatish — qo'rqinchli (nima buziladi?). Kod toza yozilganda: 20 qatorli funksiyalar, foydalanuvchi_yoshi nomlari, DRY. Yangi dasturchi bir kunda tushundi, xato ishonch bilan tuzatildi. Toza kod — jamoaning tezligi.

Bu darsda toza kod tamoyillarini o'rganamiz.

Bu darsda:

  • Toza kod nima va nega
  • Aniq nomlash
  • Kichik, bir mas'uliyatli funksiyalar
  • DRY (takrorlamaslik)
  • Kommentariy (nega, nima emas)
  • KISS (oddiylik)
  • Izchillik va formatlash
  • Amaliy: kodni tozalash

ℹ Bu dars arxitektura qismini boshlaydi: kod sifati — katta tizimning poydevori.


2. Nazariya — chuqur tushuntirish

2.1. Toza kod nima va nega

O'qiladigan kod:

Kod: 1 marta yoziladi, 10 marta o'qiladi
Toza: o'qish, tushunish, o'zgartirish oson
Iflos: ishlaydi, lekin chalkash (vaqt bombasi)

Toza kod — o'qish va o'zgartirish oson kod: uni ko'rgan dasturchi (siz kelajakda, hamkasb) tez tushunadi, ishonch bilan o'zgartiradi. Sabab: kod bir marta yoziladi, lekin ko'p marta o'qiladi (tuzatish, kengaytirish, o'rganish) — o'qish vaqti yozish vaqtidan ko'p. "Ishlaydi" — minimum (kompyuter tushunadi); "toza" — professional (odam tushunadi). Iflos kod ishlashi mumkin, lekin har tegish xatarli (chalkash). Toza kod — kelajakka sarmoya (o'zingiz va jamoaga).

2.2. Aniq nomlash

Nom — niyatni aytadi:

python
# yomon:
d = 30                    # d nima?
def calc(x, y): ...       # nima hisoblaydi?

# yaxshi:
kunlar_soni = 30
def hisobla_umumiy_narx(narx, soni): ...

Aniq nomlash — o'zgaruvchi, funksiya, sinf nomi nima ekanini/qilishini aytadi: d emas kunlar_soni, calc emas hisobla_umumiy_narx, flag emas tolov_tugadi. Yaxshi nom — kommentariyga o'rin qoldirmaydi (o'zi tushuntiradi). Qoidalar: aniq (nima), talaffuz qilinadigan, qidiriladigan (qisqa x emas), maqsadni ko'rsatgan (user_list emas active_users). Nomlash — toza kodning eng kuchli vositasi (har qatorda o'qiladi). Yaxshi nom — yarim hujjat.

2.3. Kichik, bir mas'uliyatli funksiyalar

Bitta ish qilish:

python
# yomon: bir funksiya hammasini qiladi (100 qator)
def process(data):
    # tozalash + tekshirish + hisoblash + saqlash + yuborish

# yaxshi: har biri bitta ish
def tozala(data): ...
def tekshir(data): ...
def hisobla(data): ...

Kichik funksiyalar — har funksiya bitta ish qiladi (bir mas'uliyat — SRP, 27.2 da chuqur): tozalash, hisoblash, saqlash alohida (300 qatorli "hammasini qiluvchi" emas). Sabab: kichik funksiya — o'qish oson (bir g'oya), sinash oson (bir ish), qayta ishlatish oson. Belgi: funksiya nomi "va" bilan (tozala_va_saqla) — ikki ish (bo'lish kerak). Ideal: funksiya ekranga sig'adi (20–30 qator). Kichik funksiyalar — murakkablikni bo'lish. Bir funksiya — bir fikr.

2.4. DRY (takrorlamaslik)

Bir marta yozish:

python
# yomon: takror (3 joyda bir xil hisob)
narx1 = asosiy * 1.12   # QQS
narx2 = boshqa * 1.12
narx3 = uchinchi * 1.12

# yaxshi: bir joyda
def qqs_bilan(narx): return narx * 1.12

DRY (Don't Repeat Yourself — o'zingni takrorlama) — bir mantiq bir joyda bo'lishi kerak: takrorlangan kod (nusxa-joylash) — o'zgartirish kerak bo'lsa, hamma joyni topish (bittasi unutiladi — xato). Yechim: umumiy mantiqni funksiya/sinfga chiqarish (bir marta yoz, ko'p marta chaqir). Ehtiyot: DRY — mantiq takrori uchun (tasodifiy o'xshashlik emas — ba'zan ikki narsa bir xil ko'rinadi lekin turli sabab). Haddan oshirmaslik kerak (erta abstraksiya ham yomon). DRY — bir haqiqat, bir joy.

2.5. Kommentariy (nega, nima emas)

Kod nimani, kommentariy negani:

python
# yomon: kod nimani takrorlaydi
i = i + 1   # i ni bittaga oshir

# yaxshi: nega (kod aytolmaydigan)
# QQS 2026 dan 12% (qonun o'zgardi)
soliq = narx * 0.12

Kommentariy — kod negasini tushuntiradi (nimasini emas — buni kod o'zi aytadi): "nega bu qiymat", "nega bu yondashuv", "nega bu chetlab o'tish". Yomon kommentariy — kodni takrorlaydi (i += 1 # i ni oshir — foydasiz). Yaxshi kommentariy — kod aytolmaydigan kontekst (qaror sababi, tashqi cheklov, ogohlantirish). Eng yaxshi kod — kam kommentariyli (nomlar o'zi tushuntiradi), lekin murakkab nega uchun kommentariy zarur. Kod — nima; kommentariy — nega.

2.6. KISS (oddiylik)

Murakkablashtirmaslik:

python
# yomon: aqlli, lekin chalkash
r = [x for s in m for x in s if x % 2 == 0][::-1][:3]

# yaxshi: oddiy, ravshan
juftlar = [x for satr in m for x in satr if x % 2 == 0]
natija = juftlar[:3]

KISS (Keep It Simple — oddiy tut) — eng oddiy, ravshan yechimni tanlash: "aqlli" bir qatorli kod (chalkash) o'rniga bir necha oddiy qator (ravshan). Sabab: murakkab kod — o'qish qiyin, xato yashirin, o'zgartirish xatarli; oddiy kod — hamma tushunadi. "Aqllilik" — dasturchi mag'rurligi, lekin jamoaga zarar (faqat yozgan tushunadi). Oddiylik — kamtarlik (kelajakdagi o'quvchi uchun). Eng yaxshi kod — "zerikarli" (aniq, oddiy). KISS — aql-idrok oddiylikda.

2.7. Izchillik va formatlash

Bir uslub:

python
# izchil: bir xil uslub (PEP 8)
foydalanuvchi_nomi = "Ali"      # snake_case
class FoydalanuvchiHisobi: ...   # PascalCase
# formatlash: black, ruff (avtomatik)

Izchillik — butun loyihada bir xil uslub: nomlash (snake_case o'zgaruvchi, PascalCase sinf — PEP 8), tuzilish, yondashuv. Sabab: izchil kod — o'qish oson (bir naqsh, kutilgan), turli uslublar — chalkash (har fayl boshqacha). Vositalar: PEP 8 (Python uslub qo'llanmasi), black/ruff (avtomatik formatlash — munozarasiz), linter (xato/uslub tekshirish). Izchillik — jamoa kelishuvi (bir tilda gaplashish). Avtomatik vositalar — izchillikni osonlashtiradi. Bir uslub — bir ovoz.

2.8. Toza kod — arxitektura poydevori

Toza kod — katta arxitekturaning poydevori: yaxshi arxitektura (qatlamlar — 27.6, naqshlar — 27.3) iflos kodda qurilsa — baribir chalkash. Toza kod barcha darajada: o'zgaruvchi (nom), funksiya (kichik, DRY), sinf (SRP — 27.2), modul (izchil). "Avval ishlat, keyin tozala" (refactoring — kodni tashqi xulqni o'zgartirmasdan yaxshilash) — doimiy jarayon. Toza kod texnik qarzni (tez, iflos yechim — keyin to'lanadi) kamaytiradi. Bu SOLID 27.2-bob, naqshlar (27.3–27.5) uchun asos. Toza kod — professional intizom (odat, mag'rurlik emas). Kod sifati — tizim salomatligi.


3. Tez ma'lumotnoma

python
# NOMLASH — niyatni ayt
d = 30                          # ⚠️
kunlar = 30                     # ✅
def calc(x): ...                # ⚠️
def hisobla_soliq(narx): ...    # ✅

# FUNKSIYA — bir ish (SRP)
def process(d): ...             # ⚠️ hammasi
def tozala(d): def hisobla(d):  # ✅ har biri bir ish

# DRY — bir joyda
x*1.12; y*1.12; z*1.12          # ⚠️ takror
def qqs(n): return n*1.12       # ✅

# KOMMENTARIY — nega
i += 1  # i ni oshir            # ⚠️ nima (takror)
# QQS qonun o'zgardi            # ✅ nega

# KISS — oddiy
[x for s in m for x in s][::-1] # ⚠️ chalkash
# oddiy, bir necha qator        # ✅

# IZCHIL — PEP 8, black, ruff
snake_case / PascalCase

Toza kod xulosasi

Nomlash (niyat) · Kichik funksiya (bir ish) · DRY (bir joy)
Kommentariy (nega) · KISS (oddiy) · Izchillik (PEP 8, black)
Kod 1 marta yoziladi, 10 marta o'qiladi — o'quvchi uchun yoz

4. Batafsil misollar

Misol 1 — Nomlash: yomondan yaxshiga

python
"""nomlash: aniq nom kodni o'z-o'zini tushuntiradigan qiladi."""


def yomon_uslub() -> int:
    # d, p, t — nima ekani noaniq
    d = 30
    p = 100
    t = d * p
    return t


def yaxshi_uslub() -> int:
    # nomlar niyatni aytadi
    kunlar_soni = 30
    kunlik_narx = 100
    umumiy_narx = kunlar_soni * kunlik_narx
    return umumiy_narx


def main() -> None:
    print("=== 1. Yomon nomlash natijasi ===")
    print(f"  natija: {yomon_uslub()} (lekin nima?)")

    print("\n=== 2. Yaxshi nomlash natijasi ===")
    print(f"  umumiy narx: {yaxshi_uslub()} (aniq)")

    print("\n=== 3. Nomlash qoidalari ===")
    qoidalar = [
        "aniq (nima ekani)",
        "talaffuz qilinadigan",
        "qidiriladigan (x emas)",
        "maqsadni ko'rsatgan",
    ]
    for i, q in enumerate(qoidalar, 1):
        print(f"  {i}. {q}")

    print("\n=== 4. Ikki uslub bir xil natija ===")
    print(f"  teng: {yomon_uslub() == yaxshi_uslub()}")
    print("  lekin yaxshisi — o'qish oson")
    print("  ⭐ nom — niyatni aytadi (yarim hujjat)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Yomon nomlash natijasi ===
  natija: 3000 (lekin nima?)

=== 2. Yaxshi nomlash natijasi ===
  umumiy narx: 3000 (aniq)

=== 3. Nomlash qoidalari ===
  1. aniq (nima ekani)
  2. talaffuz qilinadigan
  3. qidiriladigan (x emas)
  4. maqsadni ko'rsatgan

=== 4. Ikki uslub bir xil natija ===
  teng: True
  lekin yaxshisi — o'qish oson
  ⭐ nom — niyatni aytadi (yarim hujjat)

Nima ko'rsatdi: 2.2-bo'lim.

Misol 2 — Kichik funksiyalar (bir mas'uliyat)

python
"""SRP: bir funksiya bir ish — o'qish, sinash, qayta ishlatish oson."""


def yomon_hammasi(malumot: list) -> dict:
    """Bir funksiya: tozala + tekshir + hisobla (ko'p ish)."""
    tozalangan = [x for x in malumot if x is not None]
    yaroqli = [x for x in tozalangan if x > 0]
    return {"jami": sum(yaroqli), "soni": len(yaroqli)}


# yaxshi: har biri bir ish
def tozala(malumot: list) -> list:
    return [x for x in malumot if x is not None]


def yaroqlilarni_ol(malumot: list) -> list:
    return [x for x in malumot if x > 0]


def hisobla(malumot: list) -> dict:
    return {"jami": sum(malumot), "soni": len(malumot)}


def main() -> None:
    xom = [10, None, -5, 20, None, 30]

    print("=== 1. Yomon (hammasi bir joyda) ===")
    print(f"  natija: {yomon_hammasi(xom)}")

    print("\n=== 2. Yaxshi (bir-bir qadam) ===")
    tozalangan = tozala(xom)
    print(f"  tozalangan: {tozalangan}")
    yaroqli = yaroqlilarni_ol(tozalangan)
    print(f"  yaroqli: {yaroqli}")
    print(f"  hisob: {hisobla(yaroqli)}")

    print("\n=== 3. Har funksiya alohida sinaladi ===")
    print(f"  tozala([1, None]): {tozala([1, None])}")
    print(f"  yaroqli([-1, 5]): {yaroqlilarni_ol([-1, 5])}")

    print("\n=== 4. Bir xil natija ===")
    print(f"  teng: {yomon_hammasi(xom) == hisobla(yaroqlilarni_ol(tozala(xom)))}")
    print("  ⭐ kichik funksiya — bir ish (o'qish, sinash oson)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Yomon (hammasi bir joyda) ===
  natija: {'jami': 60, 'soni': 3}

=== 2. Yaxshi (bir-bir qadam) ===
  tozalangan: [10, -5, 20, 30]
  yaroqli: [10, 20, 30]
  hisob: {'jami': 60, 'soni': 3}

=== 3. Har funksiya alohida sinaladi ===
  tozala([1, None]): [1]
  yaroqli([-1, 5]): [5]

=== 4. Bir xil natija ===
  teng: True
  ⭐ kichik funksiya — bir ish (o'qish, sinash oson)

Nima ko'rsatdi: 2.3-bo'lim.

Misol 3 — DRY: takrorni yo'qotish

python
"""DRY: takrorlangan mantiqni bir joyga chiqarish (o'zgartirish oson)."""


def takrorli(asosiy: float, xizmat: float, yetkazish: float) -> dict:
    # QQS 12% uch joyda takror — o'zgarsa, uchalasini topish kerak
    asosiy_qqs = asosiy + asosiy * 0.12
    xizmat_qqs = xizmat + xizmat * 0.12
    yetkazish_qqs = yetkazish + yetkazish * 0.12
    return {"asosiy": asosiy_qqs, "xizmat": xizmat_qqs, "yetkazish": yetkazish_qqs}


# DRY: bir joyda
QQS_STAVKASI = 0.12


def qqs_qosh(narx: float) -> float:
    return narx + narx * QQS_STAVKASI


def dry_usul(asosiy: float, xizmat: float, yetkazish: float) -> dict:
    return {
        "asosiy": qqs_qosh(asosiy),
        "xizmat": qqs_qosh(xizmat),
        "yetkazish": qqs_qosh(yetkazish),
    }


def main() -> None:
    print("=== 1. Takrorli usul ===")
    print(f"  {takrorli(100, 50, 30)}")

    print("\n=== 2. DRY usul (bir funksiya) ===")
    print(f"  {dry_usul(100, 50, 30)}")

    print("\n=== 3. O'zgartirish oson (stavka bir joyda) ===")
    print(f"  qqs_qosh(100): {qqs_qosh(100)}")
    print("  stavka o'zgarsa — faqat QQS_STAVKASI (bir joy)")

    print("\n=== 4. Bir xil natija ===")
    print(f"  teng: {takrorli(100, 50, 30) == dry_usul(100, 50, 30)}")
    print("  ⭐ DRY — bir mantiq, bir joy (xato kam)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Takrorli usul ===
  {'asosiy': 112.0, 'xizmat': 56.0, 'yetkazish': 33.6}

=== 2. DRY usul (bir funksiya) ===
  {'asosiy': 112.0, 'xizmat': 56.0, 'yetkazish': 33.6}

=== 3. O'zgartirish oson (stavka bir joyda) ===
  qqs_qosh(100): 112.0
  stavka o'zgarsa — faqat QQS_STAVKASI (bir joy)

=== 4. Bir xil natija ===
  teng: True
  ⭐ DRY — bir mantiq, bir joy (xato kam)

Nima ko'rsatdi: 2.4-bo'lim.

Misol 4 — KISS: chalkashni oddiyga

python
"""KISS: aqlli bir qatorni oddiy, o'qiladigan kodga aylantirish."""


def chalkash(matritsa: list) -> list:
    # bir qator — o'qish qiyin (nima qiladi?)
    return sorted({x for satr in matritsa for x in satr if x > 0})[:3]


def oddiy(matritsa: list) -> list:
    # bir necha qadam — ravshan
    barcha = []
    for satr in matritsa:
        for x in satr:
            if x > 0:
                barcha.append(x)
    noyob = set(barcha)          # takrorni olib tashla
    tartibli = sorted(noyob)     # tartibla
    return tartibli[:3]          # birinchi 3


def main() -> None:
    m = [[3, -1, 5], [5, 2, -4], [8, 3, 1]]

    print("=== 1. Chalkash (bir qator) ===")
    print(f"  natija: {chalkash(m)}")
    print("  o'qish qiyin (bir qatorda 4 amal)")

    print("\n=== 2. Oddiy (bir necha qadam) ===")
    print(f"  natija: {oddiy(m)}")
    print("  har qadam ravshan (nomli)")

    print("\n=== 3. Bir xil natija ===")
    print(f"  teng: {chalkash(m) == oddiy(m)}")

    print("\n=== 4. Qaysi yaxshi ===")
    print("  oddiysi — o'qish, tuzatish, o'zgartirish oson")
    print("  'aqlli' kod — faqat yozgan tushunadi")
    print("  ⭐ KISS — oddiy, ravshan (jamoa uchun)")


if __name__ == "__main__":
    main()

Natijaning muhim qismi:

text
=== 1. Chalkash (bir qator) ===
  natija: [1, 2, 3]
  o'qish qiyin (bir qatorda 4 amal)

=== 2. Oddiy (bir necha qadam) ===
  natija: [1, 2, 3]
  har qadam ravshan (nomli)

=== 3. Bir xil natija ===
  teng: True

=== 4. Qaysi yaxshi ===
  oddiysi — o'qish, tuzatish, o'zgartirish oson
  'aqlli' kod — faqat yozgan tushunadi
  ⭐ KISS — oddiy, ravshan (jamoa uchun)

Nima ko'rsatdi: 2.6-bo'lim.


5. To'g'ri va noto'g'ri tushunishlar

Noto'g'ri fikr To'g'risi
"Ishlaydi — yetarli" O'qiladi ham bo'lishi kerak
"Qisqa nom tez" Aniq nom o'qiladi
"Katta funksiya normal" Kichik (bir ish)
"Takror muammo emas" DRY (o'zgartirish)
"Kommentariy = nima" Kommentariy = nega
"Aqlli kod yaxshi" Oddiy kod yaxshi (KISS)
"Uslub muhim emas" Izchillik (PEP 8)
"Toza kod — vaqt isrofi" Kelajakka sarmoya

6. Keng tarqalgan xatolar va yechimlari

1. Sirli nom

python
d = get()      # d nima?                     # ⚠️
faol_kunlar = get()                          # ✅

2. Ulkan funksiya

python
def process(): ...  # 200 qator               # ⚠️
def a(): def b(): def c()  # bo'lingan        # ✅

3. Takror (nusxa-joylash)

python
x*1.12; y*1.12  # takror                       # ⚠️
def qqs(n): return n*1.12                      # ✅

4. Kod-takror kommentariy

python
x += 1  # x ni oshir                           # ⚠️ foydasiz
# QQS qonun o'zgardi                           # ✅ nega

5. Haddan aqlli

python
r = [f(x) for x in d if g(x)][::-1][:5]        # ⚠️ chalkash
# bir necha oddiy qator                        # ✅

6. Izchilsizlik

python
userName = ...; foydalanuvchi_nomi = ...       # ⚠️ aralash
# bir uslub (snake_case)                        # ✅

7. Erta abstraksiya (DRY haddan)

python
# 2 marta o'xshash → darrov abstraksiya        # ⚠️
# 3+ marta va bir mantiq → chiqar               # ✅

7. Integratsiya — bu bilim qayerda kerak bo'ladi

  • 27.2-dars: SOLID — sinf darajasida tozalik
  • 27.3–27.5-dars: Naqshlar — toza yechimlar
  • 12-qism (o'tilgan): Funksiyalar — kichik, aniq
  • 16-qism (o'tilgan): OOP — SRP
  • 31-qism: Kod review — tozalik madaniyati

8. Eng yaxshi amaliyotlar

  1. Aniq nom (niyatni ayt).

  2. Kichik funksiya (bir ish).

  3. DRY (mantiq bir joyda).

  4. Kommentariy — nega (nima emas).

  5. KISS (oddiy, ravshan).

  6. Izchil uslub (PEP 8, black/ruff).

  7. Refactoring (doimiy tozalash).

  8. O'quvchi uchun yoz (kelajakdagi dasturchi).


9. Amaliy topshiriq

Vazifa 1: Bashorat qiling

python
1.  # toza kod nima?
2.  # nega o'qish muhim?
3.  # aniq nomlash nima?
4.  # 'd' yoki 'kunlar' — qaysi?
5.  # SRP nima?
6.  # katta funksiya nega yomon?
7.  # DRY nima?
8.  # takror nega yomon?
9.  # kommentariy nimani tushuntiradi?
10. # KISS nima?
11. # PEP 8 nima?
12. # black nima?
Javoblar
  1. O'qish, o'zgartirish oson kod
  2. Kod 1 marta yoziladi, ko'p o'qiladi
  3. Nom nima ekanini aytadi
  4. kunlar (aniq)
  5. Bir mas'uliyat (bir ish)
  6. O'qish, sinash qiyin
  7. Don't Repeat Yourself (takrorlama)
  8. O'zgartirish — hamma joyni topish
  9. Negasini (nimasini emas)
  10. Keep It Simple (oddiy)
  11. Python uslub qo'llanmasi
  12. Avtomatik formatlagich

Vazifa 2: Xatolarni tuzating

python
1.  d = get()                    # aniq nom

2.  def process(): # 200 qator   # bo'l

3.  x*1.12; y*1.12               # DRY

4.  x += 1  # x ni oshir         # nega

5.  [f(x) for x in d][::-1][:5]  # KISS
Javoblar
python
1.  faol_kunlar = get()

2.  def tozala(): def hisobla():  # bir ish

3.  def qqs(n): return n * 1.12

4.  # QQS qonun o'zgardi (nega)

5.  # bir necha oddiy qator

Vazifa 3: Nomlash

Yaxshilang:

  1. d
  2. calc
  3. flag
  4. tmp

Vazifa 4: Funksiya

Bo'ling:

  1. Katta funksiya
  2. Bir ish
  3. Nom
  4. Sinash

Vazifa 5: DRY

Toping:

  1. Takror
  2. Funksiya
  3. Bir joy
  4. O'zgartirish

Vazifa 6: KISS

Oddiylashtiring:

  1. Chalkash
  2. Qadamlar
  3. Nomli
  4. Ravshan

Vazifa 7: O'ylash

Toza kod — texnik ko'nikma emas, balki odat (intizom): har qatorda tanlov (aniq nom yoki tez x, kichik funksiya yoki ulkan blok). Nima uchun "ishlaydigan kod" bilan "toza kod" orasidagi farq jamoada (yolg'iz emas) eng ko'rinadi, va nega toza kod — mag'rurlik (aqlli ko'rinish) emas, balki kamtarlik (kelajakdagi o'quvchiga g'amxo'rlik)?

Javob

Qisqa javob: "Ishlaydigan" va "toza" farqi jamoada eng ko'rinadi, chunki: yolg'iz ishlaganda iflos kod ham "yetarli" (o'zingiz yozdingiz, eslaysiz — hozir); lekin jamoada (yoki kelajakdagi o'zingiz) kod boshqalar tomonidan o'qiladi — iflos kod ularni sekinlashtiradi (tushunish vaqti), xatoga olib keladi (noaniqlik), qo'rquv tug'diradi (tegish xatarli). Kod — muloqot vositasi (kompyuter bilan emas, odamlar bilan): toza kod — aniq muloqot, iflos kod — chalkash. Jamoada kodni ko'pchilik o'qiydi (review, tuzatish, kengaytirish) — tozalik ko'payadi. Toza kod kamtarlik, chunki: "aqlli" kod (bir qatorli, murakkab) — dasturchining o'zini ko'rsatishi (men bilaman!), lekin o'quvchiga zarar (faqat yozgan tushunadi); toza kod — o'zini ushlab turish (oddiy yoz, garchi aqlliroq yoza olsam ham), kelajakdagi o'quvchiga g'amxo'rlik (u tez tushunsin). Kamtarlik: "men o'lchov emas — o'quvchi o'lchov" (kod men uchun emas, undan keyin kelgan uchun). Muhandis saboqi: kod yozish — kelajakdagi odam (ehtimol o'zingiz) bilan muloqot; unga g'amxo'rlik qil (aniq, oddiy) — bu professional yetuklik (mag'rurlik emas).

1. Nega jamoada ko'rinadi

Yolg'iz: iflos ham "yetarli" (o'zim eslaymon). Jamoa: boshqalar o'qiydi — iflos sekinlashtiradi, xatoga olib keladi.

2. Kod — muloqot

Kod kompyuter uchun emas (u baytkod tushunadi). Kod odam uchun (o'qiydi, o'zgartiradi). Toza = aniq muloqot.

3. Nega kamtarlik

Yondashuv Kim uchun
"Aqlli" kod O'zini ko'rsatish (men!)
Toza kod O'quvchiga g'amxo'rlik

4. O'zini ushlab turish

Aqlliroq yoza olsam ham — oddiy yozamon (o'quvchi uchun). Bu intizom (mag'rurlik emas).

5. Muhandislik saboqlari

  1. Kod — kelajakdagi odam bilan muloqot
  2. Jamoada tozalik ko'payadi (ko'p o'quvchi)
  3. Toza kod — kamtarlik (o'quvchi o'lchov)
  4. Professional yetuklik: g'amxo'rlik, ko'rsatish emas

6. Xulosa

  1. Farq jamoada ko'rinadi (ko'p o'quvchi)
  2. Kod — odamlar bilan muloqot
  3. Toza — kamtarlik (kelajakdagi o'quvchiga)
  4. Intizom, mag'rurlik emas

Nimani mustahkamlaydi: 2.1, 2.8-bo'limlar.


Xulosa

Bu darsda toza kod tamoyillarini o'rgandik.

Eng muhim uch fikr:

  1. Toza kod va nomlash. Toza kod — o'qish va o'zgartirish oson kod: kod bir marta yoziladi, lekin ko'p marta o'qiladi (tuzatish, kengaytirish) — "ishlaydi" minimum (kompyuter tushunadi), "toza" professional (odam tushunadi). Aniq nomlash — toza kodning eng kuchli vositasi: o'zgaruvchi/funksiya nomi nima ekanini/qilishini aytadi (d emas kunlar_soni, calc emas hisobla_soliq); yaxshi nom — kommentariyga o'rin qoldirmaydi (o'zi tushuntiradi). Nomlash — yarim hujjat.

  2. Kichik funksiyalar, DRY, KISS. Kichik funksiyalar — har biri bitta ish (bir mas'uliyat — SRP): tozalash, hisoblash alohida (300 qatorli "hammasini" emas) — o'qish, sinash, qayta ishlatish oson (nom "va" bilan bo'lsa — ikki ish). DRY (Don't Repeat Yourself) — bir mantiq bir joyda (takror — o'zgarsa hamma joyni topish, bittasi unutiladi); umumiy mantiqni funksiyaga chiqar (haddan oshirma — 3+ marta va bir sabab). KISS (Keep It Simple) — eng oddiy, ravshan yechim ("aqlli" bir qatorli chalkash o'rniga oddiy qadamlar) — oddiy kod hamma tushunadi.

  3. Kommentariy, izchillik, poydevor. Kommentariy — kod negasini tushuntiradi (nimasini emas — kod o'zi aytadi): qaror sababi, tashqi cheklov (yomoni — i += 1 # i ni oshir foydasiz takror). Izchillik — butun loyihada bir uslub (PEP 8 — snake_case/PascalCase, black/ruff avtomatik formatlash, linter). Toza kod — katta arxitektura poydevori (yaxshi arxitektura iflos kodda chalkash), barcha darajada (o'zgaruvchi, funksiya, sinf, modul); refactoring (xulqni o'zgartirmasdan yaxshilash) — doimiy jarayon; texnik qarzni kamaytiradi. Toza kod — texnik ko'nikma emas, odat (intizom): kod — kelajakdagi odam bilan muloqot; tozalik — kamtarlik (o'quvchiga g'amxo'rlik, o'zini ko'rsatish emas). Kod sifati — tizim salomatligi.

Keyingi darsda SOLID tamoyillarini o'rganamiz: obyektga yo'naltirilgan dizaynning besh asosiy qoidasi (SRP, OCP, LSP, ISP, DIP) — moslashuvchan, kengaytiriladigan sinflar qurish.

Ulashish:Telegram'da

Izohlar (0)

Izoh yozish uchun kiring.

  • Hozircha izoh yo'q. Birinchi bo'ling!
27.1-dars: Toza kod tamoyillari — IlmHamroh