درود دوستان! می‌خوایم با الگوی Facade (فِساد) آشنا بشیم که بهمون کمک می‌کنه خیلی راحت‌تر و ساده‌تر با کدهای پیچیده کار کنیم. اگه یک برنامه (کلاس، کتابخونه، ابزار) پیاده‌سازی سخت و پیچیده‌ای داره، این الگو به کارمون میاد 👋

 

توی این قسمت یاد می‌گیریم که:

 

مشکل کجاست؟ 🤔

می‌دونیم که برای درست کردن یک غذای خوب و لذیذ، با رعایت جزییات فراوان باید چندین دستورالعمل رو اجرا کنیم. گاهی اوقات ما یک غذای لذیذ می‌خوایم ولی فرصت و شرایطش رو نداریم. به رستوران می‌ریم. یک پیشخدمت آراسته به سمت ما میاد. با یک سفارش ساده، بعد از چند دقیقه غذای مورد علاقه‌مون روی میز ما قرار می‌گیره.
همونطور که می‌بینیم تنها کاری که باید انجام بدیم سفارش دادن غذا به پیشخدمت هست تا همه پیچیدگی‌های آماده‌سازی غذا محو بشه 🍕🤤

توی این داستان، پیشخدمت نقش الگوی Facade رو بازی می‌کنه و همهٔ پیچیدگی‌های درست‌کردن غذا همون جزییاتی هستن که از دید ما (کاربر) حذف میشن. پیشخدمت رابطی هست بین ما و اون پیچیدگی‌ها. ما فقط با پیشخدمت سر و کار داریم و رعایت دستورالعمل‌های آماده‌سازی غذا به عهدهٔ ما نیست. پیشخدمت (Facade) خودش می‌دونه باید چکار کنه.

یک مثال دیگه می‌تونه روشن کردن اتومبیل باشه. کافیه ما سوئیچ رو بچرخونیم تا ماشین برامون روشن بشه. ما نمی‌دونیم پشت پرده چه اتفاقاتی میوفته. سوئیچ یک رابط (Facade) هست.

 

مثال دنیای برنامه‌نویسی

تا به حال با کتابخونه یا ابزاری کار کردین که قبل استفاده از اون باید کلی مراحل پیاده‌سازی رو انجام بدین؟ فرض کنیم می‌خوایم به کاربرها SMS بدیم و برای این کار کتابخونه‌ای داریم که بهمون اجازه میده از سرویس‌دهنده‌های مختلفی استفاده کنیم. کدهایی که این کتابخونه برای ارسال پیام بهمون ارائه میدن به این صورت هست:

class SmsLibrary {
  constructor(client_id, client_secret, driver) {
    // ...
  }

  public recipient(phone_number) {
    // ...
  }

  public send(text) {
    // send
  }
}

که برای استفاده از اون باید چنین کدی بنویسیم:

const client_id     = config('sms.client_id');
const client_secret = config('sms.client_secret');
const sms_driver    = config('sms.driver');

const sms = new SmsLibrary(client_id, client_secret, sms_driver);

sms.recipient('+989...');
sms.send('Welcome. Our app is great!');