برنامه نویسی شی گرا در جاوا اسکریپت
اگرچه ممکن است در ابتدا بعید به نظر برسد اما، جاوا اسکریپت یک زبان شی گرا بسیار قدرتمند است. با استفاده از اشیاء، می توانیم کد تمیز و قابل استفاده مجدد ایجاد کنیم. در این نوشتار قصد داریم به طور خلاصه، اصول برنامه نویسی شی گرا در جاوا اسکریپت را مرور کنیم. البته فرض این نوشتار این است که خواننده با مفاهیم برنامه نویسی شی گرا، آشنایی اولیه دارد.
ابتدا برخی از تعاریف را مرور میکنیم:
-
شی نمونه ای از یک کلاس است که دارای متدها و خصوصیات (properties) است.
-
کلاس طرحی از یک شی است.
چهار اصل مهم برنامه نویسی شی گرا که در برنامه نویسی شی گرا در جاوا اسکریپت نیز برقرار است، شامل موارد زیر هستند:
-
کپسوله سازی (Encapsulation).
-
انتزاع (Abstraction).
-
وراثت (Inheritance).
-
چندشکلی (Polymorphism).
کپسوله سازی
جالب است که حتی اگر نمیدانیم کپسولهسازی چیست، میتوانیم فقط با این کلمه حدس بزنیم که چیزی را «محصور» یا پنهان میکنیم، دقیقاً درست حدس زده ایم! با کپسوله سازی، روش ها و ویژگی های شی در داخل شی محصور می شوند، بنابراین در معرض دید قرار نمی گیرند. به عنوان مثال، فرض کنید شما یک کلاس دارید. اجرای اصل کپسوله سازی به این معنی است که تمام ویژگی های این کلاس خصوصی هستند و از کلاس های دیگر پنهان هستند.
در این مثال، متغیرها مستقیماً در معرض دید قرار نمیگیرند، بلکه از طریق توابع تنظیم یا «محصور» میشوند. این مفهموم به شما امکان میدهد کنترل بیشتری بر نحوه دسترسی یا اصلاح داده ها و انعطاف پذیری بیشتری برای ایجاد تغییرات داشته باشید.
انتزاع
اگر به ماشین نگاه کنیم، فقط می توانیم آنچه را که بیرون است ببینیم. چرخ ها، درها، پنجره ها و غیره را می بینیم. اما چیزی که ما نمی بینیم موتور پیچیده و تمام آن قطعات داخلی است. انتزاع همین است: پنهان کردن جزئیات پیچیده و نشان دادن موارد ساده. این ویژگی به درک بیشتر کد کمک می کند. ایده پشت این اصل این است که دنیای خارج باید فقط با اطلاعات ضروری در مورد یک شی ارائه شود. یعنی فقط اطلاعات مربوط به استفاده از آن را ارائه شود، نباید اطلاعاتی در مورد جزئیات اجرای این آن ارائه گردد.
در این مثال ما دو تابع در داخل تابع اصلی داریم: findAddress و getAddress. انتزاع با پنهان کردن متغیر «address» و تابع «findAddress» به دست میآید و آنها تنها از تابع getAddress قابل دسترسی هستند.
این نکته نباید فراموش شود که خود زبان جاوااسکریپت، کلیدواژه abstract برای کلاس و متدهای آن را ندارد. اما typescript دارای این ویژگی است و برنامه نویسان می توانند از آن استفاده کنند. بعدا در مقاله ای جداگانه در مورد typescript و ویژگی های آن صحبت خواهیم کرد.
وراثت
وراثت یکی از پرکاربردترین اصول برنامه نویسی شی گرا است. اشیاء در دنیای واقعی اغلب بسیار شبیه به هم هستند. آنها در بسیاری از ویژگی ها و رفتارها مشترک هستند. مثلا سگ و گربه هر دو حیوان هستند. هر دوی آنها چهار پا دارند. هر دوی آنها به نوعی می توانند راه بروند و صحبت کنند.
وراثت به شما این امکان را می دهد که این ویژگی ها و رفتارهای مشترک را در یک کلاس جداگانه استخراج کنید. این مساله به شما کمک میکند تا از نوشتن مکرر کد مشابه جلوگیری کنید. درعوض، میتوانید به کلاسهای دیگر اجازه دهید از این کلاس جداگانه «ارث ببرند». وقتی این اتفاق میافتد، کلاسی که سایر کلاسها از آن به ارث میبرند، «کلاس والد» یا «سوپرکلاس» نامیده میشود.
کلاس هایی که از این کلاس «والد» به ارث میبرند، «کلاسهای فرزند»، «زیر کلاسها» یا «مشتقشده» نامیده میشوند. هنگامی که یک کلاس (کلاس فرزند) از کلاس دیگر (کلاس والد) ارث می برد، تمام ویژگی ها و متدهای والد را به ارث می برد. یک استثنا، ویژگی ها و متدهای خصوصی (private) هستند. استثنای دیگر متد constructor است. constructor یک متد کلاس معمولی نیست و توسط کلاس های فرزند به ارث نمی رسد. وقتی کلاس والد را نمونه سازی می کنید، متد constructor کلاس والد فراخوانی میشود.
وراثت به کلاس والد اجازه می دهد تا عملکرد را دوباره به کلاس فرزند منتقل کند، کد تمیز و قابل استفاده مجدد ایجاد کند و از تکرار جلوگیری کند. اگر کلاس خودرویی داشته باشیم که دارای عملکرد «drive» و کلاس Motocycle با عملکرد مشابه است، میتوانیم آن عملکرد را به Motocycle تعمیم دهیم. در مثال زیر، این مساله نشان داده شده است:
ما از کلمه کلیدی “extends” برای ایجاد یک زیر کلاس از کلاس Car استفاده می کنیم و می توانیم ببینیم که چگونه کلاس Motocycle ساخته می شود و تابع – drive- را در این مورد به ارث می برد.
چندشکلی
ما چندشکلی را به عنوان چیزی با اشکال چندتایی در نظر می گیریم. برای اینکه چندشکلی داشته باشیم، دو مساله باید اتفاق بیفتد. ابتدا یکی از کلاس های فرزند متد خود را ایجاد می کند. دوم، این متد به نحوی متدی با همان نامی که در کلاس والد اعلان شده است را بازنویسی می کند.
در این مثال، پلی مورفیسم به این معنی است که روش یکسانی را می توان بر روی اشیاء مختلف استفاده کرد. به عنوان مثال، اگر یک ماشین و یک موتورسیکلت عملکرد یکسانی داشته باشند – درایو، پلی مورفیسم به ما توانایی فراخوانی یک روش مشابه را بر روی اشیاء مختلف می دهد.
با این مثال ما میتوانیم متوجه شویم که چگونه یک تابع در کلاس های مختلف فراخوانی می شود.
هنگام شرکت در مصاحبه های فنی، آشنایی کامل با اصول OOP بسیار مهم است. امکان دارد در هر زمان، تعاریف، مثالها یا هر دو مطرح شود. خوشبختانه، در حین یادگیری این اصول، مفاهیم بسیار واضح و حتی شهودی می شوند که به فرد امکان میدهد به راحتی درک کند که هر یک از آنها چه کاری انجام می دهند.
منابع:
https://medium.com/@khmel87/javascript-four-principles-of-object-oriented-programming-cd81a04262cb
https://blog.alexdevero.com/principles-of-object-oriented-programming/