AXV

SOLID: LSP, ISP, DIP va Refaktoring

Moslashuvchan arxitektura, Dependency Injection va kod hidlarini davolash

11-sinfProfessional IT3-hafta · 8-dars

Bugungi dars rejasi

01. L & I: LSP va ISP

Liskov almashinish kafolati va ixcham, maqsadli interfeyslar.

02. D: Dependency Inversion

DIP va Dependency Injection yordamida qatlamlarni mustaqil qilish.

03. Code Smells va Refaktor

Yomon me'moriy belgilarni aniqlash va xavfsiz tozalash.

01

L — Liskov Substitution (LSP)

Voris sinf bazaviy sinf o'rnida muammosiz va kutilmagan xatosiz ishlashi shart

LSP muammosi: To'rtburchak va Kvadrat

class Rectangle Eni: 200, Bo'yi: 90 Eni o'zgarsa, bo'yiga ta'sir qilmaydi class Square(Rectangle) Eni = Bo'yi LSP buzildi: kutilmagan yon ta'sir!

Qush va Pingvin (LSP qoidasi)

Xato: Qush uchadi deb hisoblash

Bird.fly() metodidan Penguin meros olsa, pingvin ucha olmagani sababli dastur xato tashlaydi yoki bo'sh qoladi. Voris bazaviy sinf o'rnini bosa olmaydi.

To'g'ri: Faqat uchar qushlarga metod berish

Bazaviy Bird umumiy bo'ladi, FlyingBird esa alohida kengayadi. Pingvin faqat Birddan meros oladi, fly() esa unga majburlanmaydi.

02

I — Interface Segregation (ISP)

Mijozlar o'zlari ishlatmaydigan metodlarga bog'lanmasligi kerak

ISP: Semiz interfeysdan ixcham qismlarga

YOMON: Semiz interfeys interface PaymentGateway: • pay_card() • pay_cash() • refund() [hamma ham ishlatmaydi] YAXSHI: Kichik interfeyslar (ISP) interface CardPayable: pay_card() interface Refundable: refund()
03

D — Dependency Inversion (DIP)

Yuqori darajadagi mantiq quyi detallarga emas, abstraksiyaga tayanishi shart

DIP: Qatlamlarning abstraksiyaga tayanishi

UserService Yuqori daraja (Biznes) UserRepository (ABC) Umumiy Abstraksiya PostgresUserRepository Quyi daraja (Baza detali)

Dependency Injection (DI) mexanizmi

Tight Coupling (O'zi yaratadi)

class UserService: def __init__(self): self.db = PostgresDB(). Agar Postgres o'chsa, barcha unit-testlar qulaydi.

Loose Coupling (Tashqaridan oladi)

def __init__(self, repo: UserRepository): self.repo = repo. Testda soxta FakeRepo, prodda esa PostgresRepo kiritiladi.

04

Code Smells (Kod hidlari)

Xato emas, lekin loyihaning parokanda bo'lishidan darak beruvchi belgilar

Keng tarqalgan 4 ta kod hidi

Long Method

Funksiya 50+ qatordan iborat.

God Object

Bitta ulkan sinf hamma ishni boshqaradi.

Primitive Obsession

Murakkab obyektsiz hamma narsani satrda saqlash.

Feature Envy

Metod o'z sinfidan ko'ra begona sinfga tayanadi.

Asosiy refaktoring usullari

Extract Method

Katta funksiyadan mantiqiy bo'lakni yangi kichik funksiya qilib ajratish.

Extract Class

Ortiqcha mas'uliyatlarga ega sinfni alohida kichik sinflarga bo'lish.

Testsiz refaktor yo'q

Avval testlar yoziladi, keyin kod tuziladi va testlar yashil ekani tekshiriladi.

Xavfsiz refaktoring qadamlari

1. Testlar

Mavjud kodga unit-testlar yozib oling.

2. Kichik qadam

Bitta metod yoki nomni o'zgartiring.

3. Testni yurgizing

Barcha testlar yana yashil ekaniga ishonch hosil qiling.

4. Commit

Kichik va aniq xabar bilan Git'ga yozing.

Tezkor viktorina

Qaysi tamoyil «Mijoz-sinflar o'zlari ishlatmaydigan metodlarga bog'lanmasligi kerak» deb talab qiladi?

To'g'ri: ISP interfeyslarni kichik va aniq qismlarga ajratishni talab qiladi.

Bugungi amaliy vazifa 25 daqiqa

OsonKatta «PaymentGateway» interfeysini ISP asosida 2 ta kichik interfeysga ajrating.
O'rtaUserService sinfiga UserRepository interfeysi orqali Dependency Injection qo'llang.
QiyinFakeUserRepository yaratib, servisingizni tashqi bazasiz unit-test bilan to'liq tekshiring.

Dars xulosasi

LSP & ISP

Ishonchli polimorfizm va ortiqcha yuklardan xoli ixcham interfeyslar.

DIP & DI

Abstraksiyalarga tayanish va oson testlanadigan elastik arxitektura.

Refaktoring

Code Smells alomatlarini testlar himoyasida bosqichma-bosqich yo'qotish.

Keyingi dars: Loyihalash andozalari (Design Patterns)

Creational patterns: Factory Method va Singleton arxitekturasi

3-hafta · 9-dars