یکی از دردسرهای رباتهای جدی تلگرام این است که باید با سیستمهای قدیمی (Legacy) مثل CRM، ERP یا درگاههای قدیمی صحبت کنند. این سیستمها معمولاً API شلخته، نامگذاری بد یا ساختارهای عجیب دارند.
اینجاست که مفهوم واقعی و مهم Anti-Corruption Layer (ACL) از دنیای Domain-Driven Design وارد میشود. ACL یک لایه میانی است که اجازه نمیدهد شلختگی دنیای بیرون وارد مدل تمیز ربات شما شود. 🤝
به جای اینکه همه جای کد ربات پر از type و fieldهای سیستمهای بیرونی شود، فقط یک نقطه با آنها حرف میزند و آن نقطه مسئول تبدیل (Mapping) دادههاست.
ایدهٔ اصلی:
• ربات شما یک Domain Model تمیز دارد (User, Order, Subscription و ...)
• سیستم بیرونی ساختار خودش را دارد
• ACL دادهها را بین این دو دنیا تبدیل و ایزوله میکند
این کار:
• وابستگی به سیستمهای بیرونی را متمرکز میکند
• تغییر API بیرونی را کمهزینهتر میکند
• تستنویسی برای منطق ربات را سادهتر میکند ✅
مثال ساده با Python برای ربات تلگرام:
class DomainUser:
def __init__(self, id, full_name, is_vip):
self.id = id
self.full_name = full_name
self.is_vip = is_vip
# Gateway سیستم قدیمی (مثال REST خام)
class LegacyCrmClient:
def get_user(self, chat_id: int) -> dict:
# در عمل اینجا requests.get و ... دارید
return {
"contact_id": chat_id,
"fname": "Ali",
"lname": "Ahmadi",
"segment": "gold", # یا basic, silver
}
# Anti-Corruption Layer
class CrmAcl:
def __init__(self, client: LegacyCrmClient):
self._client = client
def get_domain_user(self, chat_id: int) -> DomainUser:
raw = self._client.get_user(chat_id)
full_name = f"{raw['fname']} {raw['lname']}"
is_vip = raw["segment"] in ["gold", "platinum"]
return DomainUser(
id=raw["contact_id"],
full_name=full_name,
is_vip=is_vip,
)
# استفاده در Handler ربات
crm_acl = CrmAcl(LegacyCrmClient())
def handle_start(update, context):
user = crm_acl.get_domain_user(update.effective_chat.id)
if user.is_vip:
context.bot.send_message(
chat_id=user.id,
text=f"خوش اومدی {user.full_name} 🌟"
)
else:
context.bot.send_message(
chat_id=user.id,
text=f"سلام {user.full_name}!"
)
چند نکتهٔ عملی در رباتهای تلگرام:
• برای هر سیستم بیرونی (درگاه پرداخت، CRM، سرویس ارسال SMS) یک ACL جدا بسازید، نه اینکه همهچیز در Handlerها قاطی شود.
• mappingها را در یکجا نگه دارید؛ مثلاً تبدیل statusهای پرداخت خارجی به enumهای داخلی.
• هر وقت API بیرونی عوض شد، فقط ACL را دستکاری کنید، نه تمام منطق ربات را.
منبع برای مطالعه بیشتر:
Martin Fowler - Anti-Corruption Layer
این الگو کمک میکند حتی اگر دنیای بیرون نامرتب است، معماری ربات شما تمیز، قابلتست و قابلگسترش بماند. 🌱
🔖 #TelegramBot #ربات #تلگرام #Anti_Corruption_Layer #Architecture #Telegram_Bot #Python #DDD #Clean_Code
👤 Developix
💎 Channel: @DevelopixRobot