یکی از الگوهای خیلی کاربردی برای تمیز نگه داشتن کد ربات، مخصوصاً وقتی تعداد دستورات زیاد میشود، Command Pattern است.
بهجای اینکه داخل یک فایل بزرگ با کلی
if/elif همهٔ دستورها را هندل کنیم، هر دستور را بهصورت یک «Command» جداگانه پیادهسازی میکنیم. این کار:✅ کد را خواناتر و قابل نگهداریتر میکند
✅ اضافه کردن دستور جدید را ساده و بدون دستکاری منطق قبلی میکند
✅ تستنویسی برای هر دستور را راحتتر میکند
ایدهٔ اصلی Command Pattern 🧠
هر دستور (مثلاً
/start، /help، /stats) تبدیل میشود به یک کلاس با یک متد ثابت، مثلاً execute().یک «Command Bus» یا «Dispatcher» فقط تشخیص میدهد کاربر چه دستوری داده و Command مناسب را صدا میزند؛ خودش منطق دستور را بلد نیست.
نمونهٔ ساده در ربات تلگرام (python-telegram-bot) 🐍
from telegram import Update
from telegram.ext import ApplicationBuilder, CommandHandler, ContextTypes
class BaseCommand:
async def execute(self, update: Update, context: ContextTypes.DEFAULT_TYPE):
raise NotImplementedError
class StartCommand(BaseCommand):
async def execute(self, update, context):
await update.message.reply_text("سلام 👋 خوش اومدی!")
class HelpCommand(BaseCommand):
async def execute(self, update, context):
await update.message.reply_text("لیست دستورات: /start, /help")
class CommandDispatcher:
def __init__(self):
self._commands = {
"start": StartCommand(),
"help": HelpCommand(),
}
async def handle(self, update, context):
name = update.message.text.lstrip("/").split()[0]
cmd = self._commands.get(name)
if cmd:
await cmd.execute(update, context)
dispatcher = CommandDispatcher()
async def entrypoint(update: Update, context: ContextTypes.DEFAULT_TYPE):
await dispatcher.handle(update, context)
app = ApplicationBuilder().token("TOKEN").build()
app.add_handler(CommandHandler(["start", "help"], entrypoint))
app.run_polling()
چند نکتهٔ عملی برای رباتهای واقعی 🛠
• برای هر Command میتوان وابستگیها را تزریق کرد (Repository، Service، Logger) تا کلاسها تمیز و تستپذیر بمانند.
• وقتی تعداد Command ها زیاد شد، میتوان ثبت آنها را بهصورت داینامیک (مثلاً با اسکن ماژولها) انجام داد تا دیگر یک دیکشنری بزرگ دستی نگه نداریم.
• در کنار Command Pattern، استفاده از Single Responsibility Principle کمک میکند منطق ربات از منطق زیرساخت (HTTP, DB, Cache) جدا بماند.
برای مطالعهٔ بیشتر دربارهٔ این الگو:
refactoring.guru/design-patterns/command
قدمبهقدم که رباتتان بزرگتر میشود، استفاده از Command Pattern کمک میکند معماری کد تمیز بماند و با خیال راحت فیچرهای جدید اضافه کنید ✨
🔖 #TelegramBot #ربات #تلگرام #Command_Pattern #Telegram_Bot #Clean_Code #Python #Design_Patterns #Software_Architecture
👤 Developix
💎 Channel: @DevelopixRobot