🔶 بخش اول
🔶 مفاهیم شیگرائی
🔻 اصول SOLID
🔻 اصل تک مسئولیتی (SRP)
✖️ مشکل: کلاس زیر هم وظیفه مدیریت کاربر و هم ارسال ایمیل ایمیل را برعهده دارد:
✔️ راهحل: تفکیک وظايف:
🔻 اصل باز/بسته (OCP)
✖️ مشکل: کلاس زیر مسئول چندین نوع پرداخت است:
✔️ راهحل: جداسازی روشهای پرداخت:
🔻 اصل جایگزینی لیسکوف (LSP)
✖️ مشکل: فرض کنید کلاسی به نام Bird داریم که برای پرندهها طراحی شده است و دو زیرکلاس داریم: Sparrow (گنجشک) و Penguin (پنگوئن). در این مثال، متد fly() برای پنگوئن اشتباه است، زیرا پنگوئن نمیتواند پرواز کند.
✔️ راهحل: تفکیک رفتارها
🔻 اصل جداسازی اینترفیس (ISP)
✖️ مشکل: کلاس Printer مجبور است متد scan را پیادهسازی کند، حتی اگر این عملیات مورد نیاز نباشد.
✔️ راهحل: در اینجا رابطها جدا میشوند تا هر کلاس فقط متدهای مورد نیاز خود را پیادهسازی کند:
🔻 اصل وارونگی وابستگی (DIP)
🔖 #Python, #پایتون, #شئگرایی, #OOP, #SOLID
👤 ȺʍìɾⱮօհąʍʍąժ
💎 Channel: @DevelopixPython
🔶 مفاهیم شیگرائی
🔻 اصول SOLID
اصول SOLID پنج قاعده مهم در طراحی و توسعه نرمافزار هستند که به نوشتن کدی تمیز، انعطافپذیر و قابل نگهداری کمک میکنند. این اصول ابتدا توسط Robert C. Martin (عمو باب) مطرح، و برای کاهش وابستگیها و افزایش قابلیت گسترش کد طراحی شدهاند.
🔻 اصل تک مسئولیتی (SRP)
براساس اصل Single Responsibility Principle، هر کلاس باید فقط یک مسئولیت داشته باشد و تنها یک دلیل برای تغییر آن وجود داشته باشد. برای مثال، یک کلاس نباید هم وظیفه مدیریت کاربران و هم ارسال ایمیل را برعهده داشته باشد.
✖️ مشکل: کلاس زیر هم وظیفه مدیریت کاربر و هم ارسال ایمیل ایمیل را برعهده دارد:
class UserManager:
def register_user(self, user_data):
pass
def send_email(self, email):
pass
✔️ راهحل: تفکیک وظايف:
class UserManager:
def register_user(self, user_data):
pass
class EmailService:
def send_email(self, email):
pass
🔻 اصل باز/بسته (OCP)
براساس اصل Open/Closed Principle، کلاسها باید برای گسترش باز و برای تغییر بسته باشند. برای مثال، اگر نیاز به اضافه کردن نوع جدیدی از گزارش دارید، به جای تغییر کلاس اصلی، از وراثت یا پلیمورفیسم استفاده کنید.
✖️ مشکل: کلاس زیر مسئول چندین نوع پرداخت است:
class PaymentProcessor:
def process_payment(self, payment_type):
if payment_type == "CreditCard":
pass
elif payment_type == "PayPal":
pass
✔️ راهحل: جداسازی روشهای پرداخت:
from abc import ABC, abstractmethod
class Payment(ABC):
@abstractmethod
def process(self):
pass
class CreditCardPayment(Payment):
def process(self):
pass
class PayPalPayment(Payment):
def process(self):
pass
🔻 اصل جایگزینی لیسکوف (LSP)
براساس اصل Liskov Substitution Principle، زیرکلاسها باید بتوانند بدون تغییر رفتار برنامه، جایگزین کلاسهای پدر شوند. برای مثال، یک مربع (Square) نباید بهعنوان زیرکلاس یک مستطیل (Rectangle) تعریف شود، اگر رفتارهای مستطیل را نقض کند.
✖️ مشکل: فرض کنید کلاسی به نام Bird داریم که برای پرندهها طراحی شده است و دو زیرکلاس داریم: Sparrow (گنجشک) و Penguin (پنگوئن). در این مثال، متد fly() برای پنگوئن اشتباه است، زیرا پنگوئن نمیتواند پرواز کند.
class Bird:
def fly(self):
pass
class Sparrow(Bird):
def fly(self):
pass
class Penguin(Bird):
def fly(self):
return NotImplemented
sparrow = Sparrow()
sparrow.fly() # Output: is ok
penguin = Penguin()
penguin.fly() # Output: Not Implemented
✔️ راهحل: تفکیک رفتارها
class Bird:
def lay_eggs(self):
pass
class FlyingBird(Bird):
def fly(self):
pass
class Sparrow(FlyingBird):
...
class Penguin(Bird):
def swim(self):
pass
🔻 اصل جداسازی اینترفیس (ISP)
براساس اصل Interface Segregation Principle، کلاسها نباید مجبور شوند متدهایی را پیادهسازی کنند که به آنها نیازی ندارند. برای مثال، اگر یک اینترفیس شامل متدهای کار و غذا خوردن باشد، یک ربات که نمیتواند غذا بخورد، نباید مجبور به پیادهسازی متد غذا خوردن شود.
✖️ مشکل: کلاس Printer مجبور است متد scan را پیادهسازی کند، حتی اگر این عملیات مورد نیاز نباشد.
class Machine:
def print(self):
pass
def scan(self):
pass
class Printer(Machine):
def print(self):
pass
def scan(self):
raise NotImplemented
✔️ راهحل: در اینجا رابطها جدا میشوند تا هر کلاس فقط متدهای مورد نیاز خود را پیادهسازی کند:
class Printer:
def print(self):
pass
class Scanner:
def scan(self):
pass
class PrinterDevice(Printer):
def print(self):
print("Printing...")
class SimpleScanner(Scanner):
def scan(self):
print("Scanning...")
🔻 اصل وارونگی وابستگی (DIP)
براساس اصل Dependency Inversion Principle، ماژولهای سطح بالا نباید به ماژولهای سطح پایین وابسته باشند. هر دو باید به انتزاعات وابسته باشند. برای مثال، یک کلاس نباید مستقیماً به دیتابیس خاصی وابسته باشد. به جای آن باید از اینترفیس یا انتزاعی برای ارتباط استفاده کند.
🔖 #Python, #پایتون, #شئگرایی, #OOP, #SOLID
👤 ȺʍìɾⱮօհąʍʍąժ
💎 Channel: @DevelopixPython
👍15🔥4❤1
| کانال توسعهدهندگان پایتون |
🔹 انواع ارور ها در پایتون 🔸 بخش اول برای رفع و هندل کردن ارور ها ابتدا ما باید آنها رو به خوبی بشناسیم و بدونیم دلایل رخ دادن آنها چیست. — SyntaxError یکی از خطا های رایج در پایتون این ارور هست. هنگامی این ارور اتفاق میافتد که شما نگارش و قانون نوشتاری…
🔹 انواع ارور ها در پایتون
🔸 بخش دوم
برای رفع و هندل کردن ارور ها ابتدا ما باید آنها رو به خوبی بشناسیم و بدونیم دلایل رخ دادن آنها چیست.
— FileNotFoundError
اگر بخواهید عملیاتی روی یک file انجام دهید ممکن است به این ارور برخورد کنید.
این ارور هنگامی رخ میدهد که شما تلاش میکنید روی یک فایل عملیاتی انجام دهید اما به طور مثال فایل موردنظر وجود ندارد و یا آدرس درستی از فایل وارد نکردهاید.
برای رفع این رفع این ارور در وارد کردن نام، پسوند و آدرس فایل دقت کنید و حتما از وجود داشتن فایل مطمئن شوید.
مثال:
— ModuleNotFoundError
هنگامی که پایتون نتواند کتابخانه موردنظر را پیدا کند این خطا را برمیگرداند.
اگر کتابخانه مورد نظر روی سیستم یا محیط مجازی نصب نباشد و یا غلط املایی در نوشتن نام کتابخانه داشته باشید با این ارور مواجه خواهید شد.
مثال:
— IndexError
مطمعناً تابهحال وقتی خواستید به یک عنصر قابل شمارش ها دسترسی پیدا کنید به این ارور برخورد کردهاید.
اما دلیل رخ دادن این ارور چیست؟ زمانی این ارور رخ میدهد که اندیس مورد نظری که شما میخواهید آن را بگیرید در لیست یا رشته وجود نداشته باشد.
مانند زمانی که یک لیست 3 آیتم دارد اما شما در پی آیتم چهارم هستید.
مثال:
— KeyError
خطای key error خطایی رایج هست که احتمالا موقع کار با دیکشنری ها با اون برخورد کردید.
اگر تلاش کنید به یک مقدار توسط کلمه کلیدی آن دسترسی پیدا کنید اما آن کلمهکلیدی وجود نداشته باشد این خطا بروز داده میشود.
مثال:
— AttributeError
اگر تلاش کنید به یک متد یا صفت (attribute) از شئ دسترسی پیدا کنید اما شئ مورد نظر صفتی که میخواهید را نداشته باشد با این خطا مواجه خواهید شد.
مثال:
منبع:
betterstack 〽️
🔖 #Python, #پایتون
👤 Yasin
💎 Channel: @DevelopixPython
🔸 بخش دوم
برای رفع و هندل کردن ارور ها ابتدا ما باید آنها رو به خوبی بشناسیم و بدونیم دلایل رخ دادن آنها چیست.
— FileNotFoundError
اگر بخواهید عملیاتی روی یک file انجام دهید ممکن است به این ارور برخورد کنید.
این ارور هنگامی رخ میدهد که شما تلاش میکنید روی یک فایل عملیاتی انجام دهید اما به طور مثال فایل موردنظر وجود ندارد و یا آدرس درستی از فایل وارد نکردهاید.
برای رفع این رفع این ارور در وارد کردن نام، پسوند و آدرس فایل دقت کنید و حتما از وجود داشتن فایل مطمئن شوید.
مثال:
with open("test.txt", "r") as t:
t.read()
FileNotFoundError: [Errno 2] No such file or directory: 'test.txt'— ModuleNotFoundError
هنگامی که پایتون نتواند کتابخانه موردنظر را پیدا کند این خطا را برمیگرداند.
اگر کتابخانه مورد نظر روی سیستم یا محیط مجازی نصب نباشد و یا غلط املایی در نوشتن نام کتابخانه داشته باشید با این ارور مواجه خواهید شد.
مثال:
import requests
ModuleNotFoundError: No module named 'requests'
— IndexError
مطمعناً تابهحال وقتی خواستید به یک عنصر قابل شمارش ها دسترسی پیدا کنید به این ارور برخورد کردهاید.
اما دلیل رخ دادن این ارور چیست؟ زمانی این ارور رخ میدهد که اندیس مورد نظری که شما میخواهید آن را بگیرید در لیست یا رشته وجود نداشته باشد.
مانند زمانی که یک لیست 3 آیتم دارد اما شما در پی آیتم چهارم هستید.
مثال:
names = ["Yasin", "Reza", "Navid"]
print(names[5])
IndexError: list index out of range
— KeyError
خطای key error خطایی رایج هست که احتمالا موقع کار با دیکشنری ها با اون برخورد کردید.
اگر تلاش کنید به یک مقدار توسط کلمه کلیدی آن دسترسی پیدا کنید اما آن کلمهکلیدی وجود نداشته باشد این خطا بروز داده میشود.
مثال:
names = {'Yasin': '1', 'Reza': '2'}
print(names['3'])
KeyError: '3'— AttributeError
اگر تلاش کنید به یک متد یا صفت (attribute) از شئ دسترسی پیدا کنید اما شئ مورد نظر صفتی که میخواهید را نداشته باشد با این خطا مواجه خواهید شد.
مثال:
numbers = [1, 2, 3]
print(numbers.sum())
AttributeError: 'list' object has no attribute 'sum'
منبع:
betterstack 〽️
🔖 #Python, #پایتون
👤 Yasin
💎 Channel: @DevelopixPython
👍6❤4👎1