OOP چیست؟ تعریف برنامهنویسی شیءگرا با مثالهای کاربردی
12 آبان 1403
13 دقیقه مطالعه

OOP یا همان برنامهنویسی شیءگرا یکی از قدرتمندترین و پرکاربردترین پارادایمهای برنامهنویسی در دنیای امروز است. این رویکرد نرمافزار را بهصورت مجموعهای از «اشیاء» مدل میکند که هر شیء ترکیبی از دادهها (ویژگیها) و رفتارها (متدها) است که از موجودیتهای دنیای واقعی الهام گرفته شدهاند. اما تاریخچه OOP چیست؟ این پارادایم از دهه ۱۹۶۰ میلادی شکل گرفت و پایه بسیاری از زبانهای محبوب مانند جاوا، پایتون، سیپلاسپلاس و سیشارپ است.
در ادامه این مقاله از مجله سبزلرن قصد داریم شما را با مفهوم OOP و تفاوت آن با سایر رویکردها در برنامهنویسی بیشتر آشنا کنیم، برای آگاهی از این مفاهیم بهعنوان یک برنامهنویس حرفهای با ما همراه شوید.
OOP چیست؟
برنامهنویسی شیءگرا یا OOP روشی در توسعه نرمافزار است که با الهام از دنیای واقعی، مفاهیمی مانند شیء، وراثت، پنهانسازی اطلاعات و چندریختی را وارد کدنویسی میکند؛ در پاسخ به این سوال که OOP چیست، میتوان گفت OOP تلاشی است برای قرار دادن دادهها و رفتارهای مرتبط با آنها در کنار هم، بهگونهای که دسترسی مستقیم به دادهها محدود شود و تعامل فقط از طریق متدهای مشخص انجام گیرد. این رویکرد باعث میشود کدها ساختیافتهتر، امنتر، قابلدرکتر و نگهداری آنها در پروژههای بزرگ سادهتر شود.چرا برنامهنویسی شیءگرا ایجاد شد؟
OOP در دهه ۱۹۶۰ میلادی برای حل مشکلات برنامهنویسی پیچیده ایجاد شد. در آن زمان، برنامههای نرمافزاری بزرگتر میشدند و رویکردهای سنتی مانند برنامهنویسی رویهای، مدیریت دادهها و کد را دشوار میکردند. OOP توسط افرادی مانند آلن کی (Alan Kay) و توسعهدهندگان زبان Simula معرفی شد تا کد را قابل استفاده و نزدیکتر به دنیای واقعی کند. هدف اصلی مدلسازی سیستمها به صورت اشیاء بود که مانند کامپیوترهای کوچک عمل کنند و داده و رفتار را در خود نگه دارند.تفاوت OOP با رویکردهای دیگر مثل رویهای (Procedural)
برنامهنویسی رویهای بیشتر برای پروژههای سادهتر با تمرکز بر توابع و اجرای خطی از بالا به پایین مناسب است، اما با افزایش حجم کد، نگهداری و توسعه آن دشوار میشود. در مقابل، برنامهنویسی شیءگرا با محوریت دادهها، کپسولهسازی، وراثت و چندریختی، ساختاری منظمتر و امنتر ارائه میدهد. به همین دلیل OOP انتخاب رایجتری برای پروژههای بزرگ، مقیاسپذیر و قابل توسعه در دنیای نرمافزار امروزی است.| برنامهنویسی رویهای (Procedural) | برنامهنویسی شیءگرا (OOP) |
| مبتنی بر توابع | مبتنی بر اشیاء |
| بالا به پایین (Top-Down) | پایین به بالا (Bottom-Up) |
| تابع مهمتر از داده | داده مهمتر از تابع |
| بدون پنهانسازی، امنیت کمتر | دارای کپسولهسازی و امنتر |
| افزودن قابلیتها سختتر | توسعه و افزودن سادهتر |
| وجود ندارد | پشتیبانی میشود |
| بدون وراثت و Overloading | دارای وراثت و Overloading |
| پروژههای کوچک تا متوسط | پروژههای بزرگ و پیچیده |
| C، Pascal، FORTRAN | Java، C++، Python، #C |
شی (Object) و کلاس (Class) چیست؟
کلاس در OOP چیست؟ این مفهوم در برنامهنویسی شیءگرا یک قالب یا الگو است که مشخص میکند یک شی چه ویژگیها و رفتارهایی دارد، اما خود شی محسوب نمیشود. کلاس یک نوع داده تعریف شده توسط کاربر است که شامل متغیرها و متدها بوده و پایه اصلی OOP به شمار میرود. با تعریف یک کلاس میتوان هر تعداد شی از روی آن ساخت. در جاوا، کلاس شامل فیلدها، سازندهها و متدهای ست. در مقابل شی (Object) یک نمونه واقعی از کلاس است که هنگام ساخته شدن، حافظه به آن اختصاص داده میشود و از طریق آن میتوان به دادهها و متدهای کلاس دسترسی داشت.چهار ستون اصلی OOP
OOP با تکیه بر چهار اصل کلیدی زیر، امکان نوشتن کدهای مدولار، قابل باز استفاده، امن و قابل نگهداری را فراهم میکند:Encapsulation (کپسولهسازی)
در برنامهنویسی شیءگرا به معنی قرار دادن دادهها و کدهای مرتبط در یک واحد واحد است. مانند یک کپسول دارویی که ترکیبات داخلی آن برای کاربر پنهان است. در جاوا، کپسوله سازی با خصوصیکردن متغیرها و استفاده از getter و setter انجام میشود. این کار باعث کنترل بهتر دادهها، پنهانسازی اطلاعات، افزایش امنیت و سادهتر شدن تست واحد (Unit Testing) میشود و از دسترسی مستقیم بخشهای دیگر برنامه به دادهها جلوگیری میکند.Inheritance (وراثت)
به یاد داشته باشید این مفهوم در جاوا به معنی به ارث بردن ویژگیها و متدها از یک کلاس دیگر است. Inheritance زمانی استفاده میشود که بین اشیاء رابطه «is-a» معنا شده باشد. وراثت با کلمه کلیدی "extends" پیاده سازی میشود و باعث باز استفاده کد و توسعهپذیری میگردد. مثال آن ارث بری سیارات از منظومه شمسی است. جاوا از وراثت تکی، چندسطحی و سلسله مراتبی پشتیبانی میکند و وراثت چندگانه و ترکیبی فقط از طریق Interface قابل پیاده سازی است.Polymorphism (چندریختی)
برای اینکه بدانید چندریختی در OOP چیست توجه داشته باشید که این مفهوم به معنی انجام یک کار به شکلهای مختلف اشاره دارد و از دو کلمه یونانی poly (چند) و morph (شکل) گرفته شده است. در چندریختی، یک متد میتواند بسته به نوع پیاده سازی رفتار متفاوتی داشته باشد (به ویژه در وراثت). فراموش نکنید که چندریختی دو نوع دارد:- ایستا (زمان کامپایل) که با overloading انجام میشود.
- پویا (زمان اجرا) که رفتار متد در اجرا مشخص میگردد.
Abstraction (انتزاع)
این مفهوم در برنامهنویسی شیءگرا به معنی پنهان کردن جزئیات پیادهسازی و نمایش فقط عملکردهای اصلی به کاربر است. در این مفهوم، تمرکز روی «چه کاری انجام میشود» است نه «چگونه انجام میشود». در جاوا، انتزاع از دو روش پیادهسازی میشود:- کلاس انتزاعی (به صورت جزئی یا کامل)
- اینترفیس (کاملا انتزاعی)
مزایای OOP در توسعه نرمافزار
برنامهنویسی شیءگرا مزایای متعددی دارد که باعث افزایش بهرهوری و کیفیت نرمافزار میشود. به این ترتیب که:- استفاده از ماژولهای استاندارد و آماده به جای نوشتن کد از ابتدا (که زمان توسعه را کاهش میدهد)
- تقسیم برنامه به اجزای کوچک و قابل مدیریت (که حل مسائل را سادهتر میکند)
- ارتباط ساده بین اشیاء با ارسال پیام (Message Passing)
- تطبیق بهتر مفاهیم دنیای واقعی با ساختار برنامه
- افزایش بهرهوری برنامهنویس، بهبود کیفیت نرمافزار و کاهش هزینه نگهداری
- امکان ارتقای آسان سیستمها از پروژههای کوچک به پروژههای بزرگ
- قابلیت ایجاد چندین نمونه از اشیاء بدون تداخل با یکدیگر
- سادهتر شدن تقسیم وظایف تیمی بر اساس اشیاء
- افزایش امنیت نرمافزار با پنهانسازی دادهها
- حذف کدهای تکراری و توسعهپذیری با استفاده از وراثت
- تمرکز بر طراحی داده محور برای مدلسازی دقیقتر سیستم
مفاهیم تکمیلی در OOP
برای درک بهتر ساز و کار OOP باید مفاهیم زیر را به دقت بررسی کنید:Constructor
سازنده یک متد ویژه در کلاس یا ساختار در برنامهنویسی شیءگرا است که شیء تازه ایجاد شده از آن نوع را مقداردهی اولیه میکند. هر بار که یک شیء ساخته میشود، سازنده به صورت خودکار فراخوانی میشود.Method و Property
متدها عملکردهایی هستند که یک شیء میتواند انجام دهد و جزئیات داخلی اجرای آنها را پنهان میکنند. آنها رفتار اشیاء را تعریف، دادهها را دستکاری میکنند و ممکن است مقداری برگردانند یا خیر. دسترسی متدها با کلیدواژههایی مثل "Public" و "Private" کنترل میشود تا مشخص شود چه بخشهایی میتوانند آنها را فراخوانی کنند. برای درک Property هم فراموش نکنید که آنها ویژگیهایی از شیء هستند که دادهها را در خود نگه میدارند و دسترسی یا تغییر آنها را کنترل میکنند. با استفاده از "getter" مقدار داده خوانده و با "setter" مقدار آن تغییر میکند. ضمنا اینجا هم دسترسی با کلیدواژههای Public و Private کنترل میشود.Interface
اشیاء از طریق متدها با دنیای خارج تعامل دارند و این متدها رابط (Interface) شیء را تشکیل میدهند. مانند دکمههای تلویزیون که با سیمکشی داخلی ارتباط دارند. رابط معمولا مجموعهای از متدهای مرتبط با بدنه خالی است که رفتار شیء را مشخص میکند.Abstract Class
کلاس انتزاعی (Abstract Class) کلاسی است که نمیتوان مستقیما نمونه سازی کرد. این کلاس میتواند متدهای انتزاعی (بدون پیادهسازی) و متدهای عادی (با پیادهسازی) داشته باشد. کلاسهای فرزند باید متدهای انتزاعی را پیاده سازی کنند و میتوانند متدهای عادی را نیز به ارث ببرند.Overloading و Overriding
Overloading در OOP چیست؟ یک متد یعنی داشتن دو یا چند متد با نام یکسان اما پارامترهای متفاوت در همان کلاس. نوع بازگشتی متد اختیاری است و لازم نیست متفاوت باشد. Overriding یعنی کلاس فرزند متدی که از کلاس والد به ارث برده است را بازتعریف کند تا رفتار آن تغییر یا گسترش یابد. قوانین آن هم عبارتند از:- پارامترها و نوع آنها باید مشابه باشند.
- نمیتوان سطح دسترسی را ضعیفتر کرد.
Composition vs Inheritance
ترکیب یا همان Composition تکنیک طراحی در برنامهنویسی شیءگرا برای پیاده سازی رابطه بین اشیاء است. ترکیب در جاوا با استفاده از متغیرهای نمونه اشیاء دیگر حاصل میشود. به عنوان مثال، شخصی که یک شغل دارد، مانند نمونه زیر در برنامهنویسی شی گرای جاوا پیاده سازی میشود. همانطور که قبلا هم اشاره کردیم، وراثت یک تکنیک طراحی برای پیاده سازی رابطه «یک» بین اشیاء است. وراثت در جاوا با استفاده از کلمه کلیدی extends پیادهسازی میشود. برای مثال رابطه «گربه یک حیوان است»، در برنامه نویسی جاوا به صورت زیر پیادهسازی خواهد شد:- Inheritance به معنای ارثبری سلسلهمراتبی است که یک کلاس فرزند ویژگیها و متدهای کلاس والد را به ارث میبرد.
- Composition یعنی استفاده از اشیاء به عنوان بخشهای یک کلاس دیگر برای ترکیب رفتارها، بدون وابستگی سلسله مراتبی.
OOP در زبانهای مختلف چگونه استفاده میشود؟
زبانهای مختلف برنامهنویسی از OOP به شکلهای متفاوتی استفاده میکنند؛ Java و #C بهصورت ساختیافته و کامل از شیءگرایی برای توسعه پروژههای بزرگ استفاده میکنند، در حالیکه "Python" و "Ruby" با رویکردی سادهتر و منعطفتر، OOP را در کنار سایر پارادایمها بهکار میگیرند. PHP نیز شیءگرایی را برای توسعه وب و سیستمهای داینامیک فراهم کرده و R با پشتیبانی محدود از OOP بیشتر در حوزه تحلیل داده کاربرد دارد.| زبان | نحوه استفاده از OOP | مثالها و کاربردها |
| Java | تماما شیءگرا، کلاسها و اشیاء، وراثت، چند ریختی، کپسولهسازی | توسعه اندروید، سیستمهای سازمانی، برنامههای بزرگ |
| C# | OOP با .NET، کلاسها، اینترفیسها، وراثت، چندریختی | برنامههای دسکتاپ و موبایل، وب ASP.NET |
| Python | چندپارادایمی، پشتیبانی از کلاسها و اشیاء، OOP ساده | اسکریپتها، وب، محاسبات علمی |
| Ruby | نحوه استفاده این زبان از OOP چیست؟ شیءگرا و پویا، کلاسها و ماژولها، کپسولهسازی | توسعه وب، اسکریپت نویسی |
| PHP | OOP با کلاسها، اینترفیسها و وراثت | صفحات وب داینامیک، CMS ها |
| R | پشتیبانی محدود از OOP با S3/S4/RC، کلاسها و متدها | تحلیل داده و گرافیک آماری |
کاربردهای OOP در پروژههای واقعی
به یاد داشته باشید که در پروژههای واقعی هم تکیه بر چهار مفهوم اصلی OOP مهم است. به این ترتیب که با استفاده از Polymorphism میتوان اشیاء را در موقعیتهای مختلف قرار داد و رفتارهای متفاوت آنها را بررسی کرد؛ مانند یک پسر که هم دانشآموز، هم ورزشکار و هم نویسنده است. در بحث Inheritance هم کلاسها میتوانند ویژگیها و رفتارهای مشترک والد را به ارث ببرند؛ مانند خودروها که از کلاس Vehicle ویژگیهایی مانند رنگ و اندازه را میگیرند. همچنین:- کپسولهسازی (Encapsulation): دادهها و رفتارها در یک واحد نگه داشته میشوند، مانند کپسول دارویی یا بخشهای مختلف یک سازمان.
- انتزاع (Abstraction): جزئیات داخلی مخفی و فقط عملکرد اصلی نمایش داده میشود، مانند ATM یا عملکردهای تلفن همراه که فرآیند داخلی نامشخص است.
OOP چه تفاوتی با رویکرد تابعی دارد؟
Functional Programming (FP) روی توابع متمرکز است که هر کدام وظیفه مشخصی انجام میدهند. دادهها تغییرناپذیر هستند و اهمیت بیشتری به توابع داده میشود. در اصل، FP به صورت اعلامی (declarative) و بازگشتی عمل میکند، ترتیب اجرای دستورات مهم نیست و امنیت یا پنهانسازی داده ندارد. در مقابل OOP بر اشیاء و کلاسها مبتنی است و در آن دادهها قابل تغییر هستند و امنیت بالایی دارند. با این وصف تفاوت رویکرد تابعی و OOP چیست؟ در OOP:- اهمیت بیشتری به دادهها داده میشود.
- از حلقهها برای تکرار استفاده میکند.
- ترتیب اجرای دستورات مهم است.
- افزودن داده یا متد جدید آسان است.
- پ نهانسازی داده امکانپذیر است.
رابطه OOP با Design Patterns
Design Pattern راهحلهای آزمایش شده برای مشکلات رایج برنامه نویسی است. اکثر الگوها در محیط OOP استفاده میشوند تا ساختار کد منظم، قابل نگهداری و بازاستفاده باشد. یادگیری Design Patterns به برنامهنویس کمک میکند روشهای بهینه طراحی اشیاء و کلاسها را از تجربه توسعهدهندگان باتجربه بیاموزد، اما تسلط بر آن لزوما به معنای تخصص کامل در OOP نیست.آیا OOP همیشه بهترین انتخاب است؟
به یاد داشته باشید که OOP همیشه بهترین انتخاب نیست؛ این یک روش تفکر و ساختاردهی کد است، نه قانون مطلق. بسته به نیاز پروژه، سایر پارادایمها مانند برنامهنویسی تابعی یا چندپارادایمی میتوانند مناسبتر باشند. استفاده از OOP راحت قلمداد میشود؛ چون تفکر به شکل اشیاء طبیعی است، اما در همه زبانها یا پروژهها کاربرد بهینه ندارد. مثلا در بازی شطرنج، اگر نوع مهره مشخص باشد، استفاده از کلاس عمومی و چندریختی کارآمد نیست. بنابراین انتخاب OOP باید بر اساس رفتار و نیاز واقعی سیستم انجام شود، نه فقط به دلیل محبوبیت یا راحتی آن.مسیر یادگیری OOP برای مبتدیها
مسیر یادگیری OOP برای مبتدیها بهتر است با آشنایی اولیه با یک زبان مناسب مانند Python، Java یا ++C آغاز شود تا درک پیادهسازی مفاهیم سادهتر شود، سپس مفاهیم پایه مانند اینکه OOP چیست، ارتباط آن با دنیای واقعی و تفاوت آن با برنامهنویسی رویهای بهخوبی درک گردد. در ادامه یادگیری کلاس و شیء، نحوه تعریف و استفاده از آنها، کلیدواژههای مهمی مانند static، this، abstract و final و در نهایت ستونهای اصلی OOP شامل وراثت، چند ریختی، کپسولهسازی و انتزاع اهمیت دارد. استفاده از دورههای پروژهمحور سبزلرن میتواند این مسیر را ساختارمندتر کرده و با تمرین عملی، یادگیری شیءگرایی را سریعتر و عمیقتر کند.سوالات متداول
سوالات متداول
OOP دقیقا چیست و چرا مهم است؟
OOP رویکردی در برنامهنویسی است که کد را بر اساس اشیاء و رفتارهایشان سازماندهی میکند و باعث افزایش نظم، امنیت و قابلیت نگهداری پروژهها میشود.
فقط با OOP میتوان برنامهنویسی کرد؟
خیر، پارادایمهای دیگری مانند رویهای و تابعی هم وجود دارند و انتخاب آنها به نوع پروژه و نیاز فنی بستگی دارد.
کلاس و شی در OOP چه فرقی دارند؟
کلاس یک قالب یا نقشه است، اما شی نمونهای واقعی از آن کلاس است که در برنامه استفاده میشود.
آیا یادگیری OOP سخت است؟
در ابتدا ممکن است مفاهیم انتزاعی به نظر برسند، اما با تمرین و مثالهای واقعی، یادگیری آن کاملا قابلدسترس است.
کدام زبان برای یادگیری OOP مناسبتر است؟
پایتون برای مبتدیها سادهتر است، اما جاوا و C++ درک عمیقتری از ساختار OOP ارائه میدهند.
چه زمانی نباید از OOP استفاده کرد؟
در اسکریپتهای بسیار کوچک یا پروژههای ساده که پیچیدگی ندارند، استفاده از OOP میتواند غیرضروری باشد.
بین وراثت و ترکیب کدام بهتر است؟
ترکیب معمولا انعطافپذیرتر و کمریسکتر است، اما وراثت در ساختارهای سلسلهمراتبی کاربرد دارد.
OOP برای بکاند ضروری است؟
بله، در پروژههای بکاند متوسط و بزرگ تقریبا بدون OOP غیرممکن است و استفاده از آن مدیریت کد و توسعه را سادهتر میکند.
چه پروژههایی برای تمرین OOP مناسباند؟
سیستم مدیریت کاربران، فروشگاه آنلاین ساده یا مدیریت کتابخانه برای تمرین OOP بهترین گزینهها محسوب میشوند.
مقالات مرتبط
نظرات
برای ثبت نظر، لطفا وارد حساب کاربری خود شوید.
ورود یا عضویت
هنوز هیچ نظری ثبت نشده!
اولین نفری باش که برای این مقاله نظر میدی.


