برنامه نویسی شیء گرا (OOP) چیست و چرا محبوب است؟
در این مقاله میخوانید
بیشترِ زبانهای برنامهنویسی شباهتهایی باهم دارند؛ اما با وجود تمام این شباهتها، هریک قوانین منحصربهفردی دارند که آنها را از هم متمایز میکند. یکی از مفاهیم بسیار معروف در بین زبانها «شیء گرایی» است. درک کامل این مفهوم ممکن است در ابتدا کمی مشکل باشد؛ اما تسلط بر این مفهوم میتواند راه شما را بهعنوان توسعهدهنده کاملاً هموار کند. همین مسئله باعث شد تا تصمیم بگیریم که این مطلب از بلاگ پارس پک را به مفهوم برنامهنویسی شیء گرا (Object Oriented Programming) اختصاص دهیم. اگر شما هم درباره این مفهوم ابهام دارید یا در ابتدای راه برنامهنویسی هستید، این مطلب مخصوص خودِ شماست؛ پس تا پایان با ما همراه باشید.
مقدماتی درباره برنامهنویسی شیء گرا
این مطلب بدون تمرکز بر زبان برنامهنویسی خاصی نوشته شده است. درواقع، هدف بیان مفهوم برنامهنویسی شیء گراست تا بتوان آن را به هر زبان برنامهنویسی خاصی تعمیم داد. اگر عنوان «برنامه نویسی شیء گرا» را در گوگل جستوجو کنید، احتمالاً به این جمله معروف خواهید رسید: «شیء گرایی در برنامهنویسی را میتوان پارادایم یا الگویی در نظر گرفت که بر مفهوم Class و Object متکی است.» این جمله قطعاً جمله درستی است؛ اما احتمالاً با خواندن آن، ابهام شما قدری بیشتر هم شده است.
شیء گرایی از دو واژه «شیء» و «گرا» تشکیل شده است. احتمالاً نیازی هم نیست که برای درک این دو واژه به فرهنگ لغت مراجعه کنیم؛ چراکه «شیء» یعنی آنچه در دنیای واقعی وجود دارد و «گرایش» هم یعنی علاقهمندی به موضوع یا چیزی که در اینجا منظور ما همان شیء است. باتوجهبه این توضیحات، برنامهنویسی شیء گرا (OOP) را میتوان یکی از مکتبهای برنامهنویسی دانست که اساس آن بر اشیاء یا آبجکتها استوار است؛ بههمیندلیل، به آن شیء گرایی گفته میشود.
برای درک بهتر، از عملکرد چاپگر استفاده میکنیم. شما وقتی میخواهید متنتان را چاپ کنید، باید روی آیکون پرینتر کلیک یا از کلیدهای ترکیبی صفحهکلید استفاده کنید. سپس، باید صبر کنید تا یا کار پرینت انجام یا خطایی نشان داده شود. آنچه در پسِ این عملیات نمیتوانیم ببینیم، این است که چطور دستوری که آن را با کلیک روی آیکون صادر کردید، میتواند با آبجکتی (پرینتر) ارتباط برقرار کند تا کار چاپ فایل انجام شود؟ این سؤال را در ذهن خود پرورش دهید تا درادامه به جوابی برای آن برسیم.
دلیل محبوبیت شیء گرایی در برنامهنویسی
جوانههای شیء گرایی در برنامهنویسی در دهه ۱۹۶۰ و زبان Simula ظهور کرد. اگرچه توسعهدهندگان در آن زمان روی خوشی به OOP نشان ندادند، این روش تا دهه ۱۹۸۰ و به رشته تحریر درآمدن سرمقاله دیوید رابینسون همچنان به تکامل خود ادامه داد. این سرمقاله را میتوان اولین رونمایی رسمی OOP دانست؛ زیرا در آن زمان هنوز بسیاری از توسعهدهندگان از وجود آن اطلاعی نداشتند. در آن زمان، زبانهایی مثل C++ و Eiffel در میان برنامهنویسان رایج بودند. شناخت OOP در دهه ۱۹۹۰ هم ادامه یافت؛ اما با معرفی JAVA بهعنوان زبان برنامهنویسی تازهنفس، شیء گرایی هم طرفداران بسیاری پیدا کرد.
این روند ادامه یافت تا در سال ۲۰۰۲ و همزمان با معرفی .Net Framework، مایکروسافت زبان برنامهنویسی C# را نیز معرفی کرد که شیء گرایی در آن رعایت شده بود. جالب است بدانید افرادی که هنوز وارد دنیای برنامهنویسی نشده بودند، خیلی راحت با مفهوم شیء گرایی کنار میآمدند؛ اما افرادی که سالها بهعنوان توسعهدهنده و بدون درنظرگرفتن OOP کار کرده بودند، با ابهامهای زیادی برای درک این پارادایم مواجه شدند.
برای آشنایی با شش نکته مفید برای استفاده بهتر از پایتون مقاله زیر را بخوانید.
ساختار برنامهنویسی شیء گرا
بیایید ادامه توضیحات را با مثالی واقعی جلو ببریم. فرض کنید در حال راهاندازی فروشگاه حیوانات خانگی با نژادهای مختلف هستید و باید نام، سن، نژاد و اطلاعات دیگر هریک از این حیوانها را در نرمافزار خود وارد کنید. باتوجهبه اینکه نژاد، رنگ، نام و… هر حیوان ممکن است متفاوت باشد، نوشتن کد برای هریک از آنها هم وقتگیر است و هم نرمافزار شما را غیربهینه میکند. بنابراین، باید بهدنبال راهکار مناسبتری برای این موضوع باشیم. راهکار هم این است که اطلاعات مرتبط را بهنوعی باهم گروهبندی کنیم تا بدینترتیب، بتوانیم کدهای کوتاهتر و کاربردیتری داشته باشیم.
در این مرحله، پای مفهوم بلوک سازنده (Building Block) بهمیان میآید تا با استفاده از کلاس و آبجکت و اتریبیوت، کاری کند تا برنامهنویسی برای شما به تجربهای جذاب و شیرین تبدیل شود. بیایید جزئیات این Building Blockها را بیشتر بررسی کنیم.
۱. Classها در برنامهنویسی شیء گرا
در تعریفی ساده، کلاسها یکی از انواع دادههایی هستند که کاربر تعریف میکند و درواقع، بهعنوان طرح اولیه برای Object و Attribute و Method عمل میکنند.
۲. Objectها در برنامهنویسی شیء گرا
آبجکتها نمونههایی از یک کلاس هستند که با دادههای خاصی تعریف شدهاند. هنگامیکه یک کلاس تعریف میشود و هنوز آبجکتی در آن قرار نگرفته است، توضیحات کلاس بهعنوان تنها Object تعریفشده در کلاس تلقی خواهد شد.
۳. Methodها در برنامهنویسی شیء گرا
متدها را میتوان توابعی نامید که در یک کلاس تعریف و رفتار آبجکت براساس آنها تعیین میشود. قابلیت استفاده مجدد و حفظ عملکرد آبجکت، ازجمله مزایایی است که استفاده از متدها برای شما بهعنوان برنامهنویس بههمراه خواهد داشت و بهتر است همینحالا بدانید که استفاده مجدد از کد، قابلیت بسیار مهمی در دیباگکردن سریع و ساده کدها محسوب میشود.
۴. Attributeها در برنامهنویسی شیء گرا
ویژگیها یا Attributeها مواردی هستند که در یک کلاس تعریف میشوند و وضعیت Object را مشخص میکنند. بهعبارتدیگر، Objectها حاوی دادههای ذخیرهشدهای هستند که در فیلد Attribute قرار گرفتهاند.
اصول برنامهنویسی شیء گرا
حالا که با ساختار برنامهنویسی شیء گرا آشنا شدهاید، طبیعی است که هنوزهم این مفهوم برایتان کمی گنگ باشد. تقریباً همه افرادی که درحالحاضر با این پارادایم برنامهنویسی بهخوبی آشنا هستند، همین راهی را رفتهاند که شما در آن قدم گذاشتهاید؛ پس ذهن خود را همچنان متمرکز نگه دارید و درادامه، اصول برنامهنویسی شیء گرا را با دقت بخوانید تا برایتان واضحتر شود.
برای اینکه بدانیم چطور باید کد OOP مناسبی بنویسیم، باید با ارکان مهم آن آشنا شویم:
- کپسولهسازی (Encapsulation)
- انتزاع (Abstraction)
- وراثت (Inheritance)
- چندریختی (Polymorphism)
درادامه، با این چهار رکن کاملاً آشنا خواهید شد.
۱. کپسولهسازی
مفهوم کپسولهسازی در برنامهنویسی شیء گرا را با مثالی عینی توضیح میدهیم. در شرکتها، تمامی اطلاعات مربوط به کارمندان دراختیار تیم منابع انسانی (HR) شرکت است. بهعبارتدیگر، تیم منابع انسانی اطلاعات دیگر کارمندان را بهنوعی کپسوله (پنهان) میکند تا از دسترسی دیگر افراد به آنها جلوگیری کند. هر درخواستی برای دسترسی به این اطلاعات نیز باید ازطریق این تیم انجام شود. در OOP هم تقریباً همین روند طی میشود. کپسولهکردن مفهومی است که دادهها با استفاده از آن گروهبندی میشوند و با مشخصکردن نحوه ارتباط با دادهها، آنها را ایمن میکند.
۲. انتزاع
فرض کنید که خودرویی خودران دارید. برای اینکه با خودرو خود از نقطه A به B بروید، تنها کاری که باید انجام دهید، این است که مختصات نقطه مقصد را به خودرو بدهید و تمام! خودرو شما را به نقطه مدنظرتان خواهد برد. در این مثال، شما نیازی ندارید از الگوریتمهای مسیریابی و… اطلاع داشته باشید.
انتزاع در OOP هم دقیقاً همین کار را انجام میدهد و آن پنهانکردن اطلاعاتی است که کاربر به دانستن آنها نیازی ندارد. بر همین اساس، وظیفه اصلی انتزاع را میتوان مدیریت پیچیدگیها دانست. استفاده از این مفهوم در برنامهنویسی شیء گرا سبب آسانترشدن تسکها میشود و به توسعهدهنده کمک میکند تا پروژههایش را در بخشهای کوچکتر و با قدرت مدیریت بیشتر انجام دهند.
۳. وراثت
وراثت به کلاسها امکان میدهد تا ویژگیهای کلاسهای دیگری را بهارث ببرند. وراثت در OOP برای طبقهبندی آبجکتها در برنامهها براساس ویژگیها و عملکردهای مشترک استفاده میشود. بدینترتیب، شما میتوانید ویژگیهای کلی را در Object والد قرار دهید و آنها را به Objectهای زیرمجموعه موسوم به «فرزند» بهعنوان ارث بدهید.
برای روشنترشدن موضوع، فرض کنید میخواهید برنامهای برای اتوماسیون اداری شرکتتان بنویسید. در این برنامه، میتوانید آبجکتی با نام «کارمند شرکت» تعریف کنید که خصوصیات مشترک تمامی کارمندان شرکت در آن تعریف شده است. حالا میتوانید Object دیگری به نام «مدیر شرکت» هم تعریف کنید که علاوهبر بهارثبردن ویژگیهای آبجکت کارمند، ویژگیهایی دارد که منحصر به خود مدیر است.
۴. چندریختی
چندریختی یا چندفرمی آخرین رکن از ارکان چهارگانه برنامهنویسی شیء گراست. برای درک عمیق این مفهوم، فرض کنید برنامهای که نوشتهاید، شامل تابعی است که قرار است برخی عملیات ریاضی را روی اعدادی انجام دهند که ماهیت آنها عدد صحیح (Integer) است.
تا وقتیکه شما عدد صحیح را بهعنوان ورودی به این برنامه ارائه میکنید، همهچیز درست انجام میشود؛ اما زمانیکه یک عدد اعشاری (Float) در این دسته اعداد وجود داشته باشد، برنامه به مشکل برخورد خواهد کرد.
دقیقاً همینجاست که اصطلاح «چندریختی» مفهوم پیدا میکند. با استفاده از این قابلیت، توسعهدهنده میتواند نسخههای متفاوتی از یک کد را با یک نام یکسان بنویسد و هریک از این نسخهها نیز، ورودیهای مختلفی را میپذیرند. بنابراین، این برنامه میتواند با هر ورودی معقولی کار خود را انجام دهد.
برای آشنایی با کدهای JASON و ساختار آنها مقاله زیر را بخوانید.
نمونههایی از زبانهای برنامهنویسی شیء گرا
اگرچه Simula اولین زبان برنامهنویسی بود که از OOP در ساختار خود استفاده کرد، امروزه بسیاری از زبانهای برنامهنویسی از این مفهوم استفاده میکنند. برخی از این زبانها شیء گرایی را بهصورت خالص (Pure) ایجاد میکنند و همهچیز را بهصورت Object در نظر میگیرند؛ اما عمده آنها با برخی از فرایندهای رویهای طراحی شدهاند.
شماری از زبانهای برنامهنویسی شیء گرا عبارتاند از:
- Scala
- Emerald
- Ruby
- JADE
- Java
- Python
- C++
- JavaScript
- Visual Basic .NET
- PHP
پنج مزیت مهمی که با شیء گرایی بهدست میآورید
در دهههای ۱۹۷۰ و ۱۹۸۰، زبانهای برنامهنویسی رویهگرا مانند Pascal و C بهطورگسترده برای توسعه سیستمهای نرمافزاری کسبوکارها استفاده شدند؛ اما افزایش انتظارات از سیستمهای نرمافزاری سبب شد تا کاستیهای زبانهای برنامهنویسی ساختاری بیشتر عیان شود.
همین دلایل باعث شد تا بسیاری از توسعهدهندگان نرمافزارها برای رفع این نقایص به متدولوژیهای شیء گرایی در زبانهای برنامهنویسی روی آورند. ازجمله مزیتهای مهم OOP میتوان به اینها اشاره کرد:
۱. قابلیت استفاده مجدد از کد
ازطریق ارثبری و وراثت، میتوانید چندین بار از یک کد نوشتهشده استفاده کنید. این بدانمعناست که یک تیم مجبور نیست تا یک کد را چندینبار بنویسد.
۲. قابلیت استفاده در سیستمعاملهای پیشرفته
با OOP، قابلیت استفاده برنامههای نوشتهشده در سیستمعاملهایی پیشرفته با قابلیتهای ویژه امکانپذیر شده است.
۳. صرفهجویی در زمان
توسعهدهندگان حالا دیگر میتوانند بسیاری از برنامههای جدید را بهراحتی و با استفاده از کتابخانههای متعددی انجام دهند که در زبانهای برنامهنویسی مختلف طراحی شدهاند.
۴. ارتقای سادهتر نرمافزارها
بهلطف OOP، حالا دیگر ارتقای نرمافزارها نیز بهسادگی انجام میشود.
۵. ارتقای امنیت نرمافزار
با کمک قابلیت کپسولهکردن، دیتاهای نرمافزاری دردسترس نیستند و بدینترتیب، امنیت اطلاعات با استفاده از OOP کاملتر دردسترس است.
برای آشنایی با نحوه ایجاد اولین برنامه “Hello, World!” در جاوا اسکریپت مقاله زیر را بخوانید.
جمعبندی
درحالحاضر، زبانهای برنامهنویسی سهم بسیار مهمی در امور روزمره ما برعهده دارند و طبیعی است که تکنولوژیها و رویکردهای جدیدی نیز برای آنها طراحی شود. یکی از این پارادایمها، شیء گرایی (OOP) است. اگرچه مفهوم شیء گرایی ممکن است برای افراد تازهکار در دنیای برنامهنویسی قدری عجیبوغریب باشد، در این مطلب از بلاگ پارس پک، این مفهوم را با بیانی به دور از اصطلاحات کاملاً فنی و با ذکر مثالهایی از دنیای واقعی اطراف خود، بهاختصار توضیح دادیم.
سؤالات متداول
۱. OOP مخفف چیست؟
OOP مخفف عبارت Object Oriented Programming و بهمعنای برنامهنویسی شیء گراست.
۲. شیء گرایی یعنی چه؟
در تعریفی ساده، شیء گرایی الگویی در زبانهای برنامهنویسی است که بر ساختار استفاده از کلاس و آبجکتها استوار است.
۳. مزایای اصلی استفاده از شیء گرایی چیست؟
استفاده از OOP در زبانهای برنامهنویسی مزایای زیادی دارد؛ ازجمله قابلیت استفاده مجدد از کد، دیباگکردن سادهتر کدها، توسعه سادهتر در آینده و صرفهجویی در زمان.