درود دوستان! می‌خوایم یکی از راحت‌ترین الگوهای طراحی رو بررسی کنیم. توی این قسمت یاد می‌گیریم که:

 

مشکل کجاست؟ 🤔

فرض کنیم یک برنامه مدیریت اعضای یک سازمان داریم که توی اون می‌خوایم مشخصات همه اعضای سازمان رو بدست بیاریم و نمایش بدیم. همونطور که می‌دونیم یک سازمان شامل بخش‌های مختلفی میشه و هر بخش هم می‌تونه زیربخش‌هایی داشته باشه:

|-- Organization
    |-- new Founder("Alex")
    |-- new HR("Morgan")
    |-- Officers
        |-- new CEO("John")
        |-- new CTO("Mario")
    |-- Employees
        |-- IT
            |-- Designers
                |-- new Designer("Sarah")
                |-- new Designer("John")
                |-- new Designer("Emily")
                |-- new Designer("Mario")

با توجه به ساختار بالا، چطوری می‌تونیم مشخصات همه اعضا رو بدست بیاریم؟ شاید چیزی که به ذهنمون میرسه این باشه که یک حلقه یا یک تابع بازگشتی بنویسیم:

organization.forEach(function(organ) {
  const output = [];

  if (organ instanceof Founder) {
>>    output.push(organ.details());
  }

  if (organ instanceof Officers) {
    organ.forEach(function(officer)) {
      if (officer instanceof CEO) {
>>        output.push(officer.information());
      }

      if (officer instanceof CTO) {
>>        output.push(officer.getDetails());
      }
    }

    // rest of the ugly code ...
  }
});

توی این کد:

۱. داریم روی همه اعضا پیمایش می‌کنیم
۲. وقتی به هر قسمت رسیدیم بررسی می‌کنیم که این قسمت از نوع کدوم کلاس هست
۳. با توجه به نوع کلاس بررسی می‌کنیم که آیا این عضو زیربخش‌هایی هم داره یا نه
۴. اگه زیربخشی وجود داشت، دوباره یک حلقه دیگه می‌زنیم
۵. اگه زیربخشی وجود نداشت، متد مربوط به گرفتن مشخصات عضو رو صدا می‌زنیم

این کد عجیب چند نکته داره:

  • ما باید کلاس و نوع همه اعضا رو بدونیم
  • ما باید متد مربوط به گرفتن مشخصات اعضا رو بدونیم (خط‌های ۵ و ۱۱ و ۱۵)
  • مشکل زمانی بیشتر میشه عمق‌های بیشتری به سازمان اضافه کنیم

همین موارد باعث میشه که کیفیت کد ما پایین بیاد و برنامه‌هایی غیرقابل توسعه بنویسیم. اما خب الگوها برای همین چیزها ساخته شدن 🤷‍♂️