Assalomu alaykum, yosh dasturchilar! ๐
Bugun biz Python OOP'ning oxirgi darsida - OOP Best Practices'ni o'rganamiz
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
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 - bu 5 ta prinsip:
Har bir class faqat bitta vazifani bajarishi kerak
Kengaytirish uchun ochiq, o'zgartirish uchun yopiq
Child class parent class'ni almashtirishi mumkin
Client'lar ishlatmaydigan interface'larni majburiy emas
Yuqori darajadagi modullar past darajadagi modullarga bog'liq emas
# 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)
# 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()
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
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
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)
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!")
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
Professional dasturlash qoidalari
5 ta muhim prinsip
Nom berish, docstring, error handling
Kodni tekshirish va xatolarni topish
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! ๐