
اگر جاوااسکریپت رو تازه شروع کرده باشین و یا ابتدای راه باشین ممکنه توی ادامه کار و یا مصاحبههای کاری که میرین به مفهومی به اسم OOP یا شی گرایی بربخورین که ازتون بخواین اگر اطلاعاتی راجع بهش دارین، توضیح بدین و چون ابتدای کار هستین و یا پروژه هایی که کار کردین ممکنه از OOP استفاده نکرده باشین و صرفا خوندنش نمیتونه درک درستی بهتون بده که اصلا مفهوم OOP یا همون شی گرایی چیه؟!
از اونجایی که همون ابتدای کار، درکش برا منم خیلی سخت بود، حالا ترجیح دادم بیام اون رو به زبان ساده و خیلی کوتاه توضیح بدم تا شاید بتونین اگر کسی ازتون راجع به شی گرایی پرسید بهش توضیح بدین.
تعریف OOP یا شی گرایی
OOP مخفف Object-Oriented Programming هست که یک الگوی برنامه نویسیه (شما حتما مجبور به استفاده ازش تو هر برنامه ای نیستین) که بر اساس مفهوم Object (شی) ساخته شده. و وقتی ما نیاز باشه کدی بنویسیم که ماژولار باشه، قابلیت نگهداری و توسعه پذیری داشته باشه میتونه این الگو به کمکمون بیاد.
مفاهیم شی گرایی
قبل از اینکه مستقیم بریم و کد بنویسیم، برای آشنایی با این اصل باید چند اصلاح رو بدونیم و بعد ادامه بدیم
مفاهیمی که توی شی گرایی برامون مهم هستن شامل :
- شی یا Object
- کلاس یا Class
- ارث بری یا Inheritance
- کپسوله سازی یا Encapsulation
- چند شکلی یا Polymorphism
- انتزاع یا Abstraction
و در انتها چیزی که ازتون میخوام اینه که این مفاهیم رو لطفا به همون زبان انگلیسی خودشون به یاد داشته باشین و اصلا سعی نکنین خودتون رو به فارسی اون عادت بدین یا استفاده کنین.
۱- Object (شی)
از اونجایی که قطعا آشنایی با جاوااسکریپت رو دارین با آبجکت ها هم آشنا هستین، آبجکت یک موجودیته که شامل Properties و Methods میشه که میتونن توی یک آبجکت هر کدوم به تنهایی باشه یا باهم باشن.
خب فرق property و method چیه؟
const car = {
// Property
name: "Samand",
// Property
color: "white",
// Method
sayProud: function () {
console.log(`This is the national car ${this.name}`);
},
};
car.color; // white
car.sayProud(); // This is the national car Samand
۲- Class (کلاس)
اشتباه من توی مصاحبه ها رو نکنید 😂 وقتی ازم میپرسیدن شی گرایی توی جاوا اسکریپت چطوره؟ میگفتم اصلا وجود نداشته و بعد از ES6 بوجود اومده. چون فکر میکردم هر جا class دیدم پس شی گراییه!
ما از قبل هم توی جاوا اسکریپت شی گرایی رو داشتیم اما به شکل دیگه ای نوشته میشد و پیاده سازی اون متفاوت بود ولی از نسخه ES6 به بعد کلمه کلیدی class به جاوااسکریپت اضافه شد تا بتونیم شی گرایی رو خیلی بهتر پیاده سازی کنیم. (اگر میخواین تو ورژن های قبلی جاوا اسکریپت بدون class، چطور شی گرایی رو پیاده میکنه اینجا کلیک کنین)
اما خود کلاس چیه؟ کلاس یک الگو یا پترنی هست که قراره آبجکت ما از روی این الگو ساخته بشه.
اما چطوری از یک کلاس بتونیم یک آبجکت بسازیم؟ گذاشتن کلمه new قبل از اسم کلاس (به اصلاح بهش میگن instance که بازم از اینجا میتونین بخونین)
خب بریم توی کد که ما میخوایم یه کلاس به اسم Vehicles بسازیم.

۳- Inheritance (ارث بری)
مفهوم وراثت یا ارث بری به این صورته که شما یک کلاس به اسم Vehicles رو ساختی که شامل color و name بود.
و حالا قصد دارین کلاس برای Car بسازین که میتونه از Vehicles ویژگی color و name رو داشته باشه و به ارث ببره. این ارث بری با کلمه کلیدی extends
انجام میشه

نکاتی که داره رو مرور کنیم:
- کلمه کلیدی
extends
برای این اومده که تمام ویژگی های کلاس Vehicles رو بیاریم توی Car داشته باشیم. - کلمه کلیدی
super
رو اوردیم تا سازنده های از کلاس والد یا همون Vehicles رو که نیاز داریم بیاریم توی Car قرار بدیم و داشته باشیم. - توی خط آخر کد ما
greeting()
رو هم تونستیم توی Car استفاده کنیم با اینکه توی Vehicles تعریف شده بود.
۴- Encapsulation (کپسوله سازی)
اگر بخوایم توی Class که نوشتیم یک سری ویژگی و رفتارهایی که رو تعریف کردیم، مخفی کنیم بهش میگیم Encapsulation. توی این اصل ما کلی اطلاعات توی Class نوشتیم اما فقط میخوایم اون چیزایی که ما تعیین میکنیم رو کاربر بتونه بهشون دسترسی داشته باشه و نه همه چیز! یک جوری برای امنیت اطلاعات استفاده میشه, برای اینکه یک ویژگی رو Encapsulation کنیم باید قبل از اون از علامت “<strong>#</strong>
” استفاده کنیم

۵- Polymorphism (چندشکلی)
فرض کنین ما یه کلاس والد داریم به اسم Animal که خب طبیعتا هر Animal صدای خاص خودش رو داره. (بجز ماهی، من صداشو بلد نیستم)
حالا ما میخوایم دو کلاس دیگه به اسم Dog و Cat هم بسازیم که قطعا صداشونو میدونیم.
ما میتونیم یک متد sound توی Animal تعریف کنیم که این متد توی هر کلاس مختلف صدای مختلفی داشته باشه. به این مفهوم میگن polymorphism یعنی یک متد، بتونه توی کلاس های مختلف، رفتارهای مختلفی داشته باشه.

اینجا <strong>sound</strong>
یک متد توی والد بود که با توجه به اینکه تو کلاس Dog یا Cat باشه رفتار متفاوتی از خودش نشون داد که به این کار میگیم polymorphism.
۶- Abstraction (انتزاع)
شما یک ضبط صوت رو در نظر بگیر، نوار کاست رو توش میذاری، دکمه پلی رو میزنی و شروع به خوندن میکنه! تو درگیر اینکه من چطور دکمه رو به چرخ دنده وصل کنم، چطور بتونم نوار رو توش بچرخونم، اصلا چطور صداشو درارم نمیکنی! تو فقط دکمه پلی رو میزنی و خودش تمام این هماهنگی هارو انجام میده.
پس سازنده ضبط صوت یک سری پیچیدگی ها رو که نیازی نیست شما بدونی ازت مخفی کرده و فقط یک دکمه پلی جلوت گذاشته که تو با زدن اون کاری که میخوای انجام میشه. این مفهوم رو بهش میگن Abstraction.
تعریف کوتاه تر: ساده سازی و کاهش پیچیدگی یک کلاس برای کاربران.

دیدگاهتان را بنویسید