برنامه نویسی شی گرا (OOP) چیست؟ — به زبان ساده

اگر تاکنون هر گونه برنامه نویسی انجام داده باشید و یا حتی صرفاً زبانهای مختلف نظیر زبان برنامه نویسی COBOL را بررسی کرده باشید، احتمالاً تاکنون با عبارت «برنامه نویسی شیءگرا» و «مفهوم کلاس در برنامه نویسی» مواجه شدهاید. توضیحات فنی مختلفی در خصوص مفهوم برنامه نویسی شیءگرا وجود دارد؛ اما در این نوشته قصد داریم تعریف این مفهوم برنامه نویسی را به روشی ساده بیان کنیم.
سرآغاز: زبانهای رویهای
برای این که بدانیم برنامه نویسی شیءگرا چیست، ابتدا باید نقیض آن را بشناسیم. زبانهای برنامه نویسی اولیه به صورت رویهای بودند. دلیل این نامگذاری آن بود که در این زبانها، برنامهنویس باید مجموعه خاصی از رویهها را تعریف مینمود که رایانه آنها را به ترتیب اجرا میکرد.
در زمانهای نخست برنامه نویسی، رویهها بر روی کارتهای پانچ نوشته میشدند. رایانهها بدین ترتیب دادهها را گرفته، یک توالی از اقدامات را بر روی دادهها انجام داده و سپس دادههای جدید را در خروجی ارائه میکردند.
زبانهای رویهای تا مدتها به خوبی کار میکردند و برخی از آنها نیز همچنان مورد استفاده قرار میگیرند. اما زمانی که قرار بود برنامهنویس کاری را خارج از ترتیب مقدماتی مراحل انجام دهد، مدیریت زبانهای برنامه نویسی دشوار میشد. بدین ترتیب زبانهای برنامه نویسی شیءگرا وارد عرصه شدند.
هدف از برنامه نویسی شیءگرا
سؤالی که در این جا مطرح میشود، این است که برنامه نویسی شیءگرا چیست؟ نخستین زبان برنامه نویسی شیءگرا (که عموماً اعتقاد بر این است Simula بوده است) ایده اشیا را معرفی کرد. اشیا مجموعهای از اطلاعات هستند که به عنوان واحدی منفرد با آنها رفتار میشود.
این مفهوم را با ارائه مثالی در ادامه بیشتر توضیح میدهیم؛ اما نخست در مورد کلاسها صحبت میکنیم. کلاسها نوعی از اشیای مقدماتی هستند. آنها فهرستی از خصوصیات دارند که وقتی تعریف میشوند، تبدیل به یک شیء میگردند.
برای مثال به یک بازی شطرنج اشاره میکنیم. در بازی شطرنج میتوانیم کلاسی به نام «مهره» (Piece) داشته باشیم. درون این کلاس مهره، فهرستی از خصوصیات را به صورت زیر داریم:
- رنگ
- ارتفاع
- شکل
- حرکتهای مجاز
هر شیئی صرفاً یک وهله خاص از چیزی که به آن کلاس تعلق دارد را تعریف میکند. بنابراین میتوانیم شیئی به نام وزیر سفید داشته باشیم. این شیء میتواند تعاریفی برای هر چهار خصوصیت خود داشته باشد (رنگ: سفید، ارتفاع: بلند، شکل: استوانهای دارای تاج، حرکت: به تعداد نامحدود در هر جهت) این شیء میتواند متدها یا تابعهایی نیز داشته باشد.
اصول برنامه نویسی شیء گرا
سؤالی که در این مرحله ممکن است بپرسید این است که چه چیزی باعث میشود برنامه نویسی شیءگرا بهتر از برنامه نویسی رویهای باشد؟ به طور خلاصه باید گفت که زبانهای برنامه نویسی شیءگرا مانند جاوا امکان سازماندهی دادهها و کد را به ترتیبی فراهم میسازند که در پروژههای بزرگتر سازگاری بیشتری داشته باشند. برای این که این مسئله را بیشتر توضیح دهیم در ادامه چهار اصل برنامه نویسی شیءگرا را توضیح خواهیم داد.
مفهوم تجرید در برنامه نویسی شیءگرا
این که قصد دارید از چیزی استفاده کنید، دلیل نمیشود که طرز کار آن را میدانید. برای مثال یک دستگاه اسپرسو کاملاً پیچیده است، اما شما لازم نیست طرز کار آن را بدانید. شما کافی است بدانید که وقتی دکمه روشن دستگاه را میزنید، اسپرسو دریافت خواهید کرد.
همین مسئله در مورد برنامه نویسی شیءگرا نیز صدق میکند. در مثال بازی شطرنج میتوانیم یک متد ()move داشته باشیم. این متد ممکن است نیازمند مقادیر بالایی از دادهها و متدهای دیگر باشد. همچنین ممکن است نیازمند متغیرهایی به صورت موقعیت اولیه و نهایی مهره باشد. علاوه بر این موارد ممکن است به یک متد دیگر برای زمانی که مهرهای یک مهره دیگر را میزند نیاز داشته باشد.
اما نیاز نیست که اینها را بدانید و همه آنچه که باید بدانید این است که زمانی که از مهرهای میخواهیم حرکت کند، مهره حرکت میکند. این مفهوم تجرید است.
مفهوم کپسولهسازی در برنامه نویسی شیءگرا
کپسولهسازی یکی از روشهایی است که برنامه نویسی شیءگرا برای ساخت تجرید استفاده میکند. هر شیء مجموعهای از دادهها است که با آن به عنوان یک واحد مجزا برخورد میشود. درون این اشیا نیز دادهها به صورت متغیر و متد قرار دارند.
متغیرهای درون شیء به طور کلی مجزا باقی میمانند و این به آن معنی است که اشیا و متدها نمیتوانند به همدیگر دسترسی داشته باشند. اشیا تنها از طریق استفاده از متدهایشان تأثیر میپذیرند.
یک شیء وزیر میتواند شامل چند بخش از اطلاعات باشد. برای نمونه میتواند متغیری به نام «موقعیت» داشته باشد که مکان آن را روی صفحه تعیین میکند. این متغیر برای استفاده از متد ()move لازم است. و همچنین یک متغیر رنگ نیز دارد.
با اعلان خصوصی متغیر موقعیت و اعلان عمومی متد ()move برنامهنویس میتواند از تأثیرپذیری متغیرهای حرکت از اشیای دیگر جلوگیری نماید. رنگ مهره نیز اگر به صورت خصوصی اعلان شود، اشیای دیگر نمیتوانند آن را تغییر دهند؛ مگر این که متدی اجازه این کار را به آنها بدهد. البته در این مورد چنین کاری مجاز نیست چون رنگ مهرههای شطرنج همواره ثابت است.
مفهوم وراثت در برنامه نویسی شیءگرا
زبانهای برنامه نویسی شیءگرا علاوه بر کلاس دارای زیرکلاس نیز هستند. این زیرکلاسها شامل همه خصوصیاتی هستند که کلاسهای والدشان دارند؛ اما میتوانند خصوصیات دیگری را نیز بپذیرند.
در مورد مثال بازی شطرنج، مهرههای پیاده به متدی نیاز دارند که در صورت موفقیت در رسیدن به انتهای صفحه، آنها را به وزیر تبدیل کند. مثلاً این متد را میتوان ()transformPiece نامید.
همه مهرهها به چنین متدی نیاز ندارند. بنابراین لازم نیست که این متد را در کلاس مهرهها قرار دهیم. بلکه میتوانیم یک زیرکلاس از کلاس مهرهها به نام «پیاده» ایجاد کنیم. از آنجا که زیرکلاسها همه خصوصیات کلاس «مهره» را ارث میبرند، این وهله از زیرکلاس «پیاده» نیز شامل رنگ، ارتفاع، شکل و حرکتهای مجاز خواهد بود.
اما علاوه بر خصوصیات فوق یک متد ()transformPiece نیز در آن تعریف میکنیم. در این حالت لازم نیست که نگران استفاده نادرست از این متد بر روی مهره رخ (قلعه) باشیم.
ایجاد زیرکلاسها باعث صرفهجویی زیادی در زمان برنامه نویسی میشود. به جای ایجاد کلاسهای جدید برای هر چیز، میتوان تنها یک کلاس پایه نوشت و سپس آن را هر زمان که نیاز باشد، به زیرکلاسهای جدید گسترش داد. البته تکیه زیاد بر روی وراثت نیز جنبههای منفی خاص خود را دارد که در این نوشته فرصت پرداختن به آنها نیست.
مفهوم چندریختی در برنامه نویسی شیءگرا
چندریختی نتیجه وراثت است. درک کامل چندریختی نیازمند کسب حداقلی از دانش برنامه نویسی است و از این رو در این بخش تنها به صورت مقدماتی آن را معرفی میکنیم. به طور خلاصه چندریختی به برنامهنویس امکان میدهد که متدهایی با نام یکسان را بر روی اشیای مختلف استفاده کند.
برای نمونه فرض کنید در کلاس «مهره»-ها که در بخشهای قبلی تعریف کردیم یک متد move() داشتیم که هر مهره را در همه جهات به اندازه یک واحد حرکت میداد. این متد برای مهره شاه مفید است؛ اما فقط برای این مهره به درد میخورد و در مورد مهرههای دیگر به کار نمیآید. برای حل این مشکل میتوانیم متد ()move جدیدی در زیرکلاس «مهره رخ» تعریف کنیم که به صورت حرکت به تعداد نامحدود در جهتهای جلو، عقب، چپ و راست باشد.
در این حالت زمانی که برنامهنویس متد ()move را فراخوانی میکند، نوع مهره را نیز به عنوان ورودی (آرگومان) متد ارسال میکند تا برنامه بداند که دقیقاً چه مهرهای را باید حرکت دهد. بدین ترتیب مقدار زمان زیادی صرفهجویی میشود. این زمان بدون وجود چندریختی باید صرف این میشد که تشخیص دهید چه نوع حرکتی باید انجام دهید.
برنامه نویسی شیءگرا به صورت خلاصه
اگر پس از مطالعه مفاهیم برنامه نویسی شیءگرا دچار سردرد شدهاید، باید بگوییم که جای نگرانی نیست. در ادامه مواردی که باید به خاطر بسپارید را فهرست کردهایم:
- برنامه نویسی شیءگرا اطلاعاتی را در واحدهای منفرد به نام شیء گردآوری میکند.
- هر شیء وهله منفردی از یک کلاس است
- تجرید، باعث مخفی شدن طرز کار درونی شیء در مواردی که لزومی به افشای آن نیست میشود.
- کپسولهسازی، متغیرها و متدهای درون اشیا را به هم مرتبط میسازد و از آنها حفاظت میکند.
- وراثت، امکان استفاده زیرکلاسها از خصوصیات کلاسهای والد را فراهم میسازد.
- چندریختی به اشیا و متدها امکان مدیریت موقعیتهای مختلف با یک رابط منفرد را میدهد.
اگر موارد فوق را به خاطر بسپارید، درک مناسبی از مفهوم برنامه نویسی شیءگرا خواهید داشت. درک چهار اصل برنامه نویسی شیءگرا همانطور که اشاره کردیم ممکن است کار دشواری باشد؛ اما زمانی که شروع به برنامه نویسی بکنید برایتان واضحتر میشوند.
به خاطر داشته باشید که ما در این نوشته تنها کلیاتی از برنامه نویسی شیءگرا را مطرح کردهایم. زبانهای برنامه نویسی مختلف شیءگرا هر کدام روشها و ترتیبات خاص خود را دارند. زمانی که زبان برنامه نویسی مناسب خود را انتخاب کردید، میتوانید شروع به مطالعه در مورد روش استفاده آن زبان از مفاهیم شیءگرایی بکنید.
اگر این نوشته مورد توجه شما قرار گرفته است، موارد زیر نیز احتمالاً برای شما مفید خواهند بود:
- مجموعه آموزشهای علوم کامپیوتر
- آموزش برنامه نویسی شی گرا در Python (پایتون)
- آموزش شی گرایی در سی شارپ (C#)
- آموزش مبانی برنامه نویسی شیئ گرا در جاوا
- آموزش پیشرفته C++ (شی گرایی در سی پلاس پلاس)
- مجموعه آموزشهای مهندسی نرم افزار
- برنامه نویسی چیست ؟ — از کاربرد تا یادگیری به زبان ساده
- برنامه نویسی شی گرا در C++ — آموزش رایگان، به زبان ساده و جامع
- مفهوم کلاس در برنامه نویسی — همراه با نمونه مثال عملی
- زبان برنامه نویسی Cobol چیست ؟ — راهنمای مقدماتی و به زبان ساده
==
سلام ممنون متنتونُ دوبار خوندم
تا حدودی فهمیدم ، فقط میخواستم بدونم منظورتون از به کاربردن کلمه وهله چیست؟
معمولا میگن، وهله اول یا وهله بعد، منظورشون مرتبه اول و دومه. شما منظورتون از کلمه وهله چیست؟ اصلا معادل انگلیسیش چیه؟ ممنون
سلام، وقت شما بخیر؛
از اینکه با مجله فراردس همراه هستید از شما بسیار سپاسگزاریم، در اینجا کلمه وهله به عنوان معادلی برای عبارت Instance به کار رفته است.
خیلی ممنون
سلام، این فقط یک تست است
مرسی مفید بود
سلام. عالی
لطفا لینک آموزش شی گرایی در پایتون هم قرار دهید.
ممنون
ممنون از اینکه وقت میذارین و با زبان ساده توضیح میدید. خیلی مفید بود برای من:)
عالی بود ممنون از شما??
با سلام
تشکر میکنم بابت این آموزش مفید من رشته خودم طراحی معماری هست علاقه داشتم برنامه نویسی رو هم مسلط شم خیلی جاها با کلمه شی گرا مواجه میشدم ولی مفهومی ازش نداشتم مرسی ممنون
عالی بود. بین متون و مقالات فارسی که اکثرا ترجمه های بی ارزش هستند این متن عالی بود. متشکرم
ممنون از آموزش عالیتون، واقعا به درد بخور بود و تونست یک مفهوم کلی از برنامه نویسی شی گرا رو تو ذهنم ایجاد کنه