โฌ…๏ธ Bosh sahifaga
1 / 14

๐Ÿ“š Python OOP - 10-dars

OOP Best Practices

Professional dasturlash qoidalari

Assalomu alaykum, yosh dasturchilar! ๐Ÿ˜Š
Bugun biz Python OOP'ning oxirgi darsida - OOP Best Practices'ni o'rganamiz

120 daqiqa

๐Ÿ“‹ Dars rejasi

๐Ÿค” OOP Best Practices nima?

OOP Best Practices - bu professional dasturlashda ishlatiladigan eng yaxshi usullar va qoidalar.

๐Ÿ’ก Real hayotdan misol:

Agar sizda uy qurish kerak bo'lsa, siz arxitektor, muhandis, quruvchi kabi mutaxassislar bilan ishlaysiz. Har bir mutaxassis o'z ishini to'g'ri bajarishi kerak. OOP Best Practices - bu dasturlashda ham xuddi shunday. Har bir class, metod, funksiya o'z ishini to'g'ri bajarishi kerak.

# Yomon kod
class Talaba:
    def __init__(self, ism, yosh, kurs, ball, fan, muallif, yil, sahifalar):
        self.ism = ism
        self.yosh = yosh
        self.kurs = kurs
        self.ball = ball
        self.fan = fan
        self.muallif = muallif
        self.yil = yil
        self.sahifalar = sahifalar
    
    def hammasi(self):
        print(f"{self.ism} {self.yosh} yoshda {self.kurs} kursda o'qiyapti")
        print(f"Uning {self.ball} balli bor")
        print(f"U {self.fan} fanini o'qiyapti")
        print(f"Muallif {self.muallif}, yil {self.yil}, {self.sahifalar} sahifa")

โœ… Yaxshi kod

# Yaxshi kod
class Talaba:
    def __init__(self, ism, yosh, kurs):
        self.ism = ism
        self.yosh = yosh
        self.kurs = kurs
        self.ball = 0
        self.fanlar = []
    
    def ball_qo_shish(self, miqdor):
        if 0 <= miqdor <= 100:
            self.ball += miqdor
        else:
            raise ValueError("Ball 0-100 orasida bo'lishi kerak!")
    
    def fan_qo_shish(self, fan):
        if fan not in self.fanlar:
            self.fanlar.append(fan)
    
    def ma_lumot_ko_rsatish(self):
        print(f"=== {self.ism} ma'lumotlari ===")
        print(f"Yosh: {self.yosh}")
        print(f"Kurs: {self.kurs}")
        print(f"Ball: {self.ball}")
        print(f"Fanlar: {', '.join(self.fanlar)}")

class Kitob:
    def __init__(self, nom, muallif, yil, sahifalar):
        self.nom = nom
        self.muallif = muallif
        self.yil = yil
        self.sahifalar = sahifalar
    
    def ma_lumot_ko_rsatish(self):
        print(f"=== {self.nom} ===")
        print(f"Muallif: {self.muallif}")
        print(f"Yil: {self.yil}")
        print(f"Sahifalar: {self.sahifalar}")

๐Ÿ—๏ธ SOLID prinsiplari

SOLID - bu 5 ta prinsip:

S Single Responsibility

Har bir class faqat bitta vazifani bajarishi kerak

O Open/Closed

Kengaytirish uchun ochiq, o'zgartirish uchun yopiq

L Liskov Substitution

Child class parent class'ni almashtirishi mumkin

I Interface Segregation

Client'lar ishlatmaydigan interface'larni majburiy emas

D Dependency Inversion

Yuqori darajadagi modullar past darajadagi modullarga bog'liq emas

๐ŸŽฏ Single Responsibility Principle

# S - Single Responsibility Principle
# Har bir class faqat bitta vazifani bajarishi kerak

class Talaba:
    def __init__(self, ism, yosh, kurs):
        self.ism = ism
        self.yosh = yosh
        self.kurs = kurs
        self.ball = 0
    
    def ball_qo_shish(self, miqdor):
        if 0 <= miqdor <= 100:
            self.ball += miqdor
        else:
            raise ValueError("Ball 0-100 orasida bo'lishi kerak!")
    
    def ma_lumot_ko_rsatish(self):
        print(f"=== {self.ism} ma'lumotlari ===")
        print(f"Yosh: {self.yosh}")
        print(f"Kurs: {self.kurs}")
        print(f"Ball: {self.ball}")

class Ball_hisoblagich:
    def __init__(self):
        self.hisoblar = []
    
    def hisob_qo_shish(self, talaba, miqdor):
        self.hisoblar.append(f"{talaba.ism}: {miqdor} ball")
    
    def hisoblarni_ko_rsatish(self):
        print("=== Ball hisoblari ===")
        for hisob in self.hisoblar:
            print(hisob)

๐Ÿ”“ Open/Closed Principle

# O - Open/Closed Principle
# Class'lar kengaytirish uchun ochiq, o'zgartirish uchun yopiq bo'lishi kerak

class Transport:
    def __init__(self, nom):
        self.nom = nom
    
    def harakatlanish(self):
        print(f"{self.nom} harakatlanmoqda...")

class Mashina(Transport):
    def harakatlanish(self):
        print(f"{self.nom} yo'lda harakatlanmoqda!")

class Samolyot(Transport):
    def harakatlanish(self):
        print(f"{self.nom} osmonda uchmoqda!")

# Test qilish
transportlar = [
    Mashina("Toyota"),
    Samolyot("Boeing")
]
for transport in transportlar:
    transport.harakatlanish()

๐Ÿ“ Kod yozish qoidalari

1๏ธโƒฃ Nom berish qoidalari

  • Class nomi katta harf bilan boshlanadi
  • Variable nomi kichik harf bilan boshlanadi
  • Protected variable _ bilan boshlanadi
  • Private variable __ bilan boshlanadi

2๏ธโƒฃ Docstring qoidalari

  • Har bir class va method uchun docstring yozish
  • Parametrlar va qaytariladigan qiymatlar haqida ma'lumot
  • Xatolar haqida ma'lumot

3๏ธโƒฃ Error handling qoidalari

  • Try-except bloklarini ishlatish
  • Ma'noli xato xabarlari yozish
  • Validation qo'shish

๐Ÿ“– Docstring misoli

class Kitob:
    """
    Kitob class'i.
    
    Bu class kitob haqida ma'lumotlarni saqlaydi va boshqaradi.
    
    Attributes:
        nom (str): Kitob nomi
        muallif (str): Kitob muallifi
        yil (int): Kitob nashr yili
        sahifalar (int): Kitob sahifalar soni
    
    Methods:
        ma_lumot_ko_rsatish(): Kitob ma'lumotlarini ekranga chiqaradi
        o_qish(): Kitobni o'qish jarayonini boshqaradi
    """
    
    def __init__(self, nom, muallif, yil, sahifalar):
        """
        Kitob object'ini yaratadi.
        
        Args:
            nom (str): Kitob nomi
            muallif (str): Kitob muallifi
            yil (int): Kitob nashr yili
            sahifalar (int): Kitob sahifalar soni
        
        Raises:
            ValueError: Agar yil manfiy yoki sahifalar 0 dan kichik bo'lsa
        """
        if yil < 0:
            raise ValueError("Yil manfiy bo'lishi mumkin emas!")
        if sahifalar <= 0:
            raise ValueError("Sahifalar 0 dan katta bo'lishi kerak!")
        
        self.nom = nom
        self.muallif = muallif
        self.yil = yil
        self.sahifalar = sahifalar
        self.o_qilgan = False

โš ๏ธ Error handling

class BankHisob:
    def __init__(self, ism, dastlabki_summa=0):
        self.ism = ism
        self._balans = dastlabki_summa
        self._parol = "1234"
    
    def pul_qo_shish(self, miqdor, parol):
        """
        Hisobga pul qo'shadi.
        
        Args:
            miqdor (float): Qo'shiladigan pul miqdori
            parol (str): Hisob paroli
        
        Raises:
            ValueError: Agar miqdor manfiy yoki parol noto'g'ri bo'lsa
        """
        if not self._parol_tekshirish(parol):
            raise ValueError("Noto'g'ri parol!")
        
        if miqdor <= 0:
            raise ValueError("Miqdor musbat bo'lishi kerak!")
        
        self._balans += miqdor
        print(f"{miqdor} so'm qo'shildi. Yangi balans: {self._balans}")
    
    def _parol_tekshirish(self, parol):
        """Parolni tekshiradi."""
        return parol == self._parol

๐Ÿงช Testing va Debugging

import unittest

class Kalkulyator:
    def __init__(self):
        self.natija = 0
    
    def qo_shish(self, a, b):
        return a + b
    
    def ayirish(self, a, b):
        return a - b
    
    def ko_paytirish(self, a, b):
        return a * b
    
    def bo_lish(self, a, b):
        if b == 0:
            raise ValueError("Nolga bo'lish mumkin emas!")
        return a / b

class TestKalkulyator(unittest.TestCase):
    def setUp(self):
        """Har bir test oldidan ishlaydi."""
        self.kalkulyator = Kalkulyator()
    
    def test_qo_shish(self):
        """Qo'shish funksiyasini test qiladi."""
        self.assertEqual(self.kalkulyator.qo_shish(2, 3), 5)
        self.assertEqual(self.kalkulyator.qo_shish(-1, 1), 0)
        self.assertEqual(self.kalkulyator.qo_shish(0, 0), 0)
    
    def test_nolga_bo_lish(self):
        """Nolga bo'lish xatosini test qiladi."""
        with self.assertRaises(ValueError):
            self.kalkulyator.bo_lish(5, 0)

๐Ÿ“š Amaliy loyiha: Kutubxona tizimi

from abc import ABC, abstractmethod

# Abstract class
class Kitob(ABC):
    def __init__(self, nom, muallif, yil, sahifalar):
        if yil < 0:
            raise ValueError("Yil manfiy bo'lishi mumkin emas!")
        if sahifalar <= 0:
            raise ValueError("Sahifalar 0 dan katta bo'lishi kerak!")
        
        self.nom = nom
        self.muallif = muallif
        self.yil = yil
        self.sahifalar = sahifalar
        self.o_qilgan = False
    
    @abstractmethod
    def o_qish(self):
        """Kitobni o'qish jarayonini boshqaradi."""
        pass
    
    def ma_lumot_ko_rsatish(self):
        """Kitob ma'lumotlarini ekranga chiqaradi."""
        print(f"=== {self.nom} ===")
        print(f"Muallif: {self.muallif}")
        print(f"Yil: {self.yil}")
        print(f"Sahifalar: {self.sahifalar}")
        print(f"O'qilgan: {'Ha' if self.o_qilgan else 'Yo'q'}")

# Concrete classes
class Darslik(Kitob):
    def __init__(self, nom, muallif, yil, sahifalar, fan):
        super().__init__(nom, muallif, yil, sahifalar)
        self.fan = fan
        self.darslar = []
    
    def o_qish(self):
        """Darslikni o'qish jarayonini boshqaradi."""
        if not self.o_qilgan:
            self.o_qilgan = True
            print(f"'{self.nom}' darsligi o'qildi!")
            print(f"Fan: {self.fan}")
        else:
            print(f"'{self.nom}' darsligi allaqachon o'qilgan!")

๐Ÿ›๏ธ Kutubxona tizimi davomi

class Roman(Kitob):
    def __init__(self, nom, muallif, yil, sahifalar, janr):
        super().__init__(nom, muallif, yil, sahifalar)
        self.janr = janr
        self.boblar = []
    
    def o_qish(self):
        """Romanni o'qish jarayonini boshqaradi."""
        if not self.o_qilgan:
            self.o_qilgan = True
            print(f"'{self.nom}' romani o'qildi!")
            print(f"Janr: {self.janr}")
        else:
            print(f"'{self.nom}' romani allaqachon o'qilgan!")

# Service class
class Kutubxona:
    def __init__(self, nom):
        self.nom = nom
        self.kitoblar = []
        self.o_quvchilar = []
    
    def kitob_qo_shish(self, kitob):
        """Kutubxonaga kitob qo'shadi."""
        if kitob not in self.kitoblar:
            self.kitoblar.append(kitob)
            print(f"Kitob qo'shildi: {kitob.nom}")
        else:
            print(f"Kitob allaqachon mavjud: {kitob.nom}")
    
    def kitob_olish(self, kitob_nomi):
        """Kutubxonadan kitob oladi."""
        for kitob in self.kitoblar:
            if kitob.nom == kitob_nomi:
                self.kitoblar.remove(kitob)
                print(f"Kitob olindi: {kitob.nom}")
                return kitob
        print(f"Kitob topilmadi: {kitob_nomi}")
        return None

๐ŸŽ‰ Xulosa

Python OOP kursimiz tugadi!

๐Ÿ—๏ธ OOP Best Practices

Professional dasturlash qoidalari

๐Ÿ›๏ธ SOLID prinsiplari

5 ta muhim prinsip

๐Ÿ“ Kod yozish qoidalari

Nom berish, docstring, error handling

๐Ÿงช Testing va Debugging

Kodni tekshirish va xatolarni topish

๐Ÿ“š Kutubxona tizimi

To'liq amaliy loyiha

Siz endi professional darajada Python OOP'ni bilasiz! ๐Ÿš€

Bu bilimlar sizga dasturlashda katta yordam beradi. OOP'ni yaxshi o'rganing va professional dasturchi bo'ling! ๐Ÿ˜Š