شی گرایی قسمت اول (چهار اصل شی گرایی در جاواسکریپت)

توی این سری مجموعه مقالاتی که قراره منتشر بشه، میخواییم کلیک کنیم روی برنامه نویسی شی گرا و زیر و بم شو توی جاواسکریپت بریزیم بیرون، البته این مفاهیمی که توی این مقاله ازشون حرف میزنیم مختص به جاواسکریپت نیست و کلا مربوط به همه زبان هایی میشه که شی گرایی رو پشتیبانی میکنن

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

توی برنامه نویسی چندین نوع الگو یا پارادایم(paradigm) داریم مثل برنامه نویسی تابعی(functional)، برنامه نویسی رویه ای(procedural)، برنامه نویسی شیءگرا(object oriented) و .... که هرکدوم خوبی و بدی هایی دارن اما خبر خوب اینه که جاواسکریپت از اکثرشون پشتیبانی میکنه و انعطاف زیادی داره

در برنامه نویسی شی گرا ما یه مدل داریم که از دنیای واقعی یا غیر واقعی یا هرچی، ازش الگو برداری میکنیم و از این الگو میتونیم هزاران بار استفاده کنیم، در واقع یکی از مزیت های oop اینه که کد های شمارو reusable
یا قابل استفاده مجدد میکنه

حالا توی oop ما با دو مفهوم اصلی به اسم شی(object) و کلاس(class) سر کار داریم، خب اصلا اینا چی هستن ؟ اجازه بدین با یه مثال پیش بریم:

نکته: قبل شروع اینو بگم که جاواسکریپت چیزی به اسم class نداره و اگه میخوایی بگی از ES6 به بعد کلمه کلیدی class اضافه شده باید بگم بهت که اون فقط یه پوسته اس، در پس قضیه، جاواسکریپت بر اساس توابع و پروتوتایپ (prototype) شی گرایی رو هندل میکنه
مقالات آینده کامل توضیحش میدم

خب بریم سر اصل مطلب فرض کنید میخواین یه ماشین بسازین، خب اولین کار اینه که نقشه ماشین رو طراحی کنید که هربار خواستید یه ماشین بسازید از اون نقشه بار ها و بار ها استفاده کنید پس به اون نقشه و الگویی که میکشید میگن class و به اون ماشین یا ماشین هایی که میسازید میگن object، در واقع این کلاس ما یه نوع template هست

حالا هر کلاس ما دوتا جز اصلی داره به اسم رفتار(behaviour) و صفت(attribute)، هر مشخصه از اون ماشین ما میشه یه صفت و هر چیزی که یک فعل(یعنی قابل انجام) باشه رو بهش میگن رفتار، برگردیم به مثالی که زدیم: ماشینی که داشتیم یک سری صفات داره مثل چرخ، مثل شیشه، ... و یک سری رفتار هم داره مثل بوق زدن، حرکت کردن، گاز دادن ....

عکس و کد(کد های زیر شبه کد هستن) زیر گویای حرف هایی هست که تا الان زدیم

class Car {
        wheels
        window
        color

        bogh() {
                 //logic
         }

         gaz() {
                 //logic
         }

}
ممکنه اسامی که بهتون گفتم به شکل های دیگه هم ببینید مثلا به شی یا آبجکت، instance هم میگن
یا مثلا به صفت ممکنه بگن property و یا به رفتار بگن method

حالا چطور از روی کلاسمون شی بسازیم ؟ یا به قول معروف instantiate کنیم؟ کافیه تا با کلمه کلیدی new و بعد اوردن اسم کلاس یه شی جدید ازش بسازید(مقالات بعدی بیشتر وارد کد زدن میشیم فعلا بسنده کنید)

const myCar= new Car();


تا اینجا با شی گرایی و مفاهیم اصلیش آشنا شدین حالا بریم سراغ چهار اصل شی گرایی که جز ستون شی گرایی هستن که اگه بلدشون نباشید اصلا شی گرایی نمیدونید

اصل اول 👈 انتزاع یا Abstraction :

انتزاع به ما میگه که آقا جان اصلا مهم نیست برا من اون method یا رفتارت چطور پیاده سازی میشه بلکه اون کلیت کار مهمه یعنی مثلا تو توی متد بوق زدن موظفی که بوق بزنی حالا مهم نیست چطور میخوایی بوق بزنی در نهایت من ازت یه بوق میخوام و موظفی که متد بوق رو پیاده سازی کنی

از این اصل توی اینترفیس(سرچ کن اگه نمیدونی چیه) نوشتن به کررات استفاده میشه در واقع این اصل کمک میکنه که جزعیات پیاده سازی پنهان بمونه و کد رو تمیز تر و قابل استفاده مجدد تر(همون reusable) بکنه

گوشی موبایلتو در نظر بگیر فقط یه صفحه نمایش میبینی و یه چندتا دکمه ولی در اصل کلی سیم پیچی و منطق پشت تلفنه که تو ازش بی خبری و این یعنی اصل انتزاع

توجه کنید کلاس هایی که ابسترکت هستن رو نمیتونید ازشون شی بسازید بلکه اونا فقط مثل یه نوع قرار(interface) داد میمونن که موظف هستید از اونا پیروی کنید و پیاده سازیشون کنید

نکته: جاواسکریپت به صورت built-in کلمه کلیدی یا چیزی برای پیاده سازی انتزاع نداره و باید از تایپ اسکریپت استفاده کنید.
گرچه trick یا ترفند هایی وجود داره که بشه پیاده سازی کرد ولی به نطرم از تایپ اسکریپت استفاده کنید تمیز تره

اصل دوم 👈 کپوسوله سازی یا Encapsulation:

این اصل با زبون بی زبونی میگه متد ها و پراپرتی ها فقط از توی کلاس قابل دسترسی باشن و کلاس های دیگه نتونن بهش دسترسی داشته باشن مگر اینکه توعه برنامه نویس ذکر کنی چی private باشه و چی public

خب اصلا چرا این اصل هستش به چه درد میخوره؟ باعث میشه که کد های خارجی توی کلاس های دیگه وضعیت و یا صفات داخلی کلاس مون رو نتونن تغییر بدن و باعث ایجاد side effect بشن و علت دیگه اینکه میتونیم خیلی راحت کد های داخل کلاس رو تغییر بدیم بدون اینکه کد های خارج کلاس دست خوش تغییر بشن و باگ تولید کنن

نکته: باز هم جاواسکریپت به صورت built-in اینو ساپورت نمیکنه و باید از روش های قرار دادی مثل گذاشتن _ پشت متد یا پراپرتی اعلام کنیم که این عضو private هستن. البته تو آپدیت های جدید پرایوت با علامت # اضافه شده ولی خب ممکنه مرورگر های قدیمی از حتی جدید ساپورت نکنن ولی باز هم پیشنهاد من استفاده از تایپ اسکریپت هست چون کاملا ساپورت میشه

اصل سوم👈 ارث بری یا Inheritance:

اجازه بدین اینو با یه مثال توضیح بدم تا بهتر جا بیوفته فرض کنید تو سایتتون یه کلاس User دارید و طبق سیاست های سایتتون دو نوع کاربر هم دارید یکی admin و یکی کاربر عادی، خب حالا سوالی که مطرح میشه اینه که آیا باید برای ادمین هم که نوعی User هست کلاسی شبیه User بسازیم؟ به نظرتون اینطوری دوباره کاری نمیشه؟خیلی از ویژگی های ادمین و کاربر عادی مثل هم هستن پس عقلانی نیست دوباره یه کلاس ادمین بسازیم با همون ویژگی های User، پس چکار کنیم؟ کافیه که از ارث بری استفاده کنید

برای اینکار کافیه از کلمه کلیدی extends استفاده کنید و بعد از اون اسم کلاسی رو بیارید که قراره به ارث برده بشه، جاوااسکریپت اینبار دیگه ازش پشتیبانی میکنه😏 به کلاس User میگن کلاس والد و به کلاس Admin میگن کلاس فرزند

کد زیر رو ببین:

کلاس ادمین تمام متد و پراپرتی های کلاس یوزر رو به ارث برده و علاوه بر اون ها(به شرط اینکه overwrite نشده باشن)، متد و پراپرتی های خودشو داره، چون مثلا کاربر عادی نباید بتونه کاربرای دیگه رو حذف کنه درسته؟

class User {
          username
          password
          email

          login(password)   {            //logic         }
         sendMessage(msg)   {            //logic         }
 }

class Admin extends User{ 
          permissions
          deleteUser(userId)   {            //logic         }
}


اصل چهارم👈 چندریختی یا Polymorphism:

این اصل ممکنه یه خرده پیچیده باشه ولی فعلا خیلی ساده بیانش میکنیم و وارد جزعیاتش نمیشیم

این اصل میگه که کلاس های فرزند(مثل همون Admin) میتونن متد های کلاس های والد رو overWrite کنن یعنی تغییرشون بدیم، مثلا فرض کنید متد login توی کلاس User پیاده سازی شده و ما میخواییم توی کلاس Admin لاگین امون یه طور دیگه ای باشه یا اصلا یه چیزی بهش اضافه کنیم

در واقع داریم میگیم یه نوع ریخت دیگه داریم بهش میدیم



این بود از مفاهیم پایه شی گرایی که حتما باید راجع بهش اطلاع داشته باشید و پیش نیازه مقاله بعد هستش

توی مقالات بعد شی گرایی رو اختصاصی توی جاواسکریپت مورد بررسی قرار میدیم

امیدوارم مقاله مورد پسندتون بوده باشه و استفاده کرده باشین.❤️

کانال تلگرامم 👈 LearnByLearn@