فارسی
باز کردن در Telegram

پست الگوی Strategy: خداحافظ if-elif-elseهای غول‌آسا 🧠

19 ژانویه 2026
|
| کانال توسعه‌دهندگان پایتون |
الگوی Strategy: خداحافظ if-elif-elseهای غول‌آسا 🧠 یکی از Code Smellهای رایج در پروژه‌های Python، به‌خصوص در Django / FastAPI، زنجیره‌های بزرگ if / elif برای انتخاب نوع رفتار است. این ساختارها هم سخت تست می‌شوند، هم هر تغییر کوچکی را پرریسک می‌کنند. یک راه‌حل تمیز و شناخته‌شده در Design Patternها برای این مشکل، الگوی Strategy است. این الگو منطق‌های قابل‌جایگزین (قابل تعویض) را در آبجکت‌های جدا نگه می‌دارد و کد را قابل‌گسترش و خواناتر می‌کند. 🙌 مثال ساده: فرض کنید در یک سرویس پرداخت، بسته به نوع روش پرداخت، منطق متفاوتی دارید: class PaymentService: def pay(self, method: str, amount: int) -> None: if method == "card": print("Paying by card", amount) elif method == "paypal": print("Paying by PayPal", amount) elif method == "crypto": print("Paying by crypto", amount) else: raise ValueError("Unsupported method") این کلاس هم تک‌مسئولیتی نیست، هم هر بار روش جدیدی اضافه می‌شود باید کلاس را ادیت کنیم. زیر پا گذاشتن اصل Open/Closed. با Strategy همین منطق را تمیز می‌کنیم: from abc import ABC, abstractmethod class PaymentStrategy(ABC): @abstractmethod def pay(self, amount: int) -> None: ... class CardPayment(PaymentStrategy): def pay(self, amount: int) -> None: print("Paying by card", amount) class PaypalPayment(PaymentStrategy): def pay(self, amount: int) -> None: print("Paying by PayPal", amount) class CryptoPayment(PaymentStrategy): def pay(self, amount: int) -> None: print("Paying by crypto", amount) class PaymentService: def __init__(self, strategy: PaymentStrategy) -> None: self._strategy = strategy def pay(self, amount: int) -> None: self._strategy.pay(amount) حالا انتخاب Strategy می‌تواند در لایه‌ی وب (مثلاً FastAPI endpoint) انجام شود و PaymentService تمیز و قابل‌تست می‌ماند: def get_strategy(method: str) -> PaymentStrategy: mapping = { "card": CardPayment(), "paypal": PaypalPayment(), "crypto": CryptoPayment(), } try: return mapping[method] except KeyError: raise ValueError("Unsupported method") نکته عملی قابل‌استفاده امروز ✅ هرجا یک تابع یا view دارید که براساس یک نوع (type / method / status) با if-elifهای زیاد شاخه‌بندی می‌کند، آن منطق را به کلاس‌های کوچک‌تر Strategy تبدیل کنید و یک mapping تمیز بسازید. این کار هم خوانایی را بالا می‌برد، هم اضافه‌کردن رفتار جدید را بدون دست‌زدن به منطق قدیمی ممکن می‌کند. برای مطالعه‌ی عمیق‌تر درباره Strategy: refactoring.guru/design-patterns/strategy کد تمیز با الگوهای درست، در پروژه‌های واقعی Python تفاوت جدی در سرعت توسعه و لذت کار ایجاد می‌کند. 🚀 امروز یکی از if-elifهای سنگین پروژه‌تان را به یک Strategy تمیز تبدیل کنید و نتیجه را در نگه‌داری و تست‌ها ببینید. 🔖 #Python #پایتون #python #strategy_pattern #clean_code #design_patterns #architecture #refactoring 👤 Developix 💎 Channel: @DevelopixPython
20 · 2.6K ·

در همان حوالی فید

|| کانال توسعه‌دهندگان پایتون |⭕️ ویراک کلود زیرساختی مطمئن برای کسب و کارهای آنلاین 🎁 20% شارژ بیشتر روی اولین واریزی ⚡️با کد معرف: 10% شارژ برای شما و 10% برای دوستتان! 🔘با IPv6 رایگان 🔘با || کانال توسعه‌دهندگان پایتون |📌 باز و بسته کردن فایل با context manager خیلی وقت cها توی کدهای Python دیده می cشه فایل رو با open() باز می cکنیم، ولی فراموش می cکنیم ببندیمش. این کار می cتون
این پیام
|| کانال توسعه‌دهندگان پایتون |در نمونه‌کد بالا تابع load_rows اول همه‌ی داده‌ها را یک‌جا در مموری می‌ریزد و بعد روی آن‌ها loop می‌زند؛ این کار روی فایل‌های بزرگ باعث Memory مصرفی بالا و حتی || کانال توسعه‌دهندگان پایتون |👨‍💻 سوال برای توسعه‌دهندگان Python خروجی اجرای کد زیر در Python چیست؟ به تفاوت بین متغیرهای سازنده (constructor) و متغیرهای کلاس و همین‌طور نحوهٔ ذخیره شدن defa
|| کانال توسعه‌دهندگان پایتون || کانال توسعه‌دهندگان پایتون |@DevelopixPython · کانال · فناوری
7 646مشترک704میانگین دسترسی پست
فید انجمن باز کردن در Telegram

فید عمومی باز از ایندکس جست‌وجو ChatCrawler — «Google برای Telegram عمومی»؛ با خزش انجمن به‌روز می‌شود. زمان‌ها به UTC است.

فقط محتوای عمومی، API رسمی Telegram. دربارهٔ ما · پرسش‌ها · محدودیت‌های ایندکس · حذف یک صفحه · کاتالوگ · جست‌وجو · روش محاسبهٔ ما