简体中文
Telegram

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

2026年1月19日
|
| کانال توسعه‌دهندگان پایتون |
الگوی 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 ——“公开 Telegram 的 Google”;随着该社群被抓取而更新。 时间为 UTC。

仅限公开内容,使用 Telegram 官方 API。 关于 · 常见问题 · 索引限制 · 移除页面 · 目录 · 搜索 · 计算方法