برنامه نویسی 878 بازدید

اگر تاکنون هر گونه برنامه‌نویسی انجام داده باشید و یا حتی صرفاً زبان‌های مختلف برنامه‌نویسی را بررسی کرده باشید، احتمالاً تاکنون با عبارت «برنامه‌نویسی شی‌ءگرا» مواجه شده‌اید. توضیحات فنی مختلفی در خصوص مفهوم برنامه‌نویسی شی‌ءگرا وجود دارد؛ اما در این نوشته قصد داریم تعریف این مفهوم برنامه‌نویسی را به روشی ساده بیان کنیم.

سرآغاز: زبان‌های رویه‌ای

برای این که بدانیم برنامه‌نویسی شی‌ءگرا چیست، ابتدا باید نقیض آن را بشناسیم. زبان‌های برنامه‌نویسی اولیه به صورت رویه‌ای بودند. دلیل این نامگذاری آن بود که در این زبان‌ها، برنامه‌نویس باید مجموعه خاصی از رویه‌ها را تعریف می‌نمود که رایانه آن‌ها را به ترتیب اجرا می‌کرد.

در زمان‌های نخست برنامه‌نویسی، رویه‌ها بر روی کارت‌های پانچ نوشته می‌شدند. رایانه‌ها بدین ترتیب داده‌ها را گرفته، یک توالی از اقدامات را بر روی داده‌ها انجام داده و سپس داده‌های جدید را در خروجی ارائه می‌کردند.

زبان‌های رویه‌ای تا مدت‌ها به خوبی کار می‌کردند و برخی از آن‌ها نیز همچنان مورد استفاده قرار می‌گیرند. اما زمانی که قرار بود برنامه‌نویس کاری را خارج از ترتیب مقدماتی مراحل انجام دهد، مدیریت زبان‌های برنامه‌نویسی دشوار می‌شد. بدین ترتیب زبان‌های برنامه‌نویسی شی‌ءگرا وارد عرصه شدند.

هدف از برنامه‌نویسی شی‌ءگرا

سؤالی که در این جا مطرح می‌شود، این است که برنامه‌نویسی شی‌ءگرا چیست؟ نخستین زبان برنامه‌نویسی شی‌ءگرا (که عموماً اعتقاد بر این است Simula بوده است) ایده اشیا را معرفی کرد. اشیا مجموعه‌ای از اطلاعات هستند که به عنوان واحدی منفرد با آن‌ها رفتار می‌شود.

این مفهوم را با ارائه مثالی در ادامه بیشتر توضیح می‌دهیم؛ اما نخست در مورد کلاس‌ها صحبت می‌کنیم. کلاس‌ها نوعی از اشیای مقدماتی هستند. آن‌ها فهرستی از خصوصیات دارند که وقتی تعریف می‌شوند، تبدیل به یک شیء می‌گردند.

برای مثال به یک بازی شطرنج اشاره می‌کنیم. در بازی شطرنج می‌توانیم کلاسی به نام «مهره» (Piece) داشته باشیم. درون این کلاس مهره، فهرستی از خصوصیات را به صورت زیر داریم:

  • رنگ
  • ارتفاع
  • شکل
  • حرکت‌های مجاز

هر شیئی صرفاً یک وهله خاص از چیزی که به آن کلاس تعلق دارد را تعریف می‌کند. بنابراین می‌توانیم شیئی به نام وزیر سفید داشته باشیم. این شیء می‌تواند تعاریفی برای هر چهار خصوصیت خود داشته باشد (رنگ: سفید، ارتفاع: بلند، شکل: استوانه‌ای دارای تاج، حرکت: به تعداد نامحدود در هر جهت) این شیء می‌تواند متدها یا تابع‌هایی نیز داشته باشد.

اصول برنامه‌نویسی شیء گرا

سؤالی که در این مرحله ممکن است بپرسید این است که چه چیزی باعث می‌شود برنامه‌نویسی شی‌ءگرا بهتر از برنامه‌نویسی رویه‌ای باشد؟ به طور خلاصه باید گفت که زبان‌های برنامه‌نویسی شی‌ءگرا مانند جاوا امکان سازمان‌دهی داده‌ها و کد را به ترتیبی فراهم می‌سازند که در پروژه‌های بزرگ‌تر سازگاری بیشتری داشته باشند. برای این که این مسئله را بیشتر توضیح دهیم در ادامه چهار اصل برنامه‌نویسی شی‌ءگرا را توضیح خواهیم داد.

مفهوم تجرید در برنامه‌نویسی شی‌ءگرا

این که قصد دارید از چیزی استفاده کنید، دلیل نمی‌شود که طرز کار آن را می‌دانید. برای مثال یک دستگاه اسپرسو کاملاً پیچیده است، اما شما لازم نیست طرز کار آن را بدانید. شما کافی است بدانید که وقتی دکمه روشن دستگاه را می‌زنید، اسپرسو دریافت خواهید کرد.

همین مسئله در مورد برنامه‌نویسی شی‌ءگرا نیز صدق می‌کند. در مثال بازی شطرنج می‌توانیم یک متد ()move داشته باشیم. این متد ممکن است نیازمند مقادیر بالایی از داده‌ها و متدهای دیگر باشد. همچنین ممکن است نیازمند متغیرهایی به صورت موقعیت اولیه و نهایی مهره باشد. علاوه بر این موارد ممکن است به یک متد دیگر برای زمانی که مهره‌ای یک مهره دیگر را می‌زند نیاز داشته باشد.

اما نیاز نیست که این‌ها را بدانید و همه آنچه که باید بدانید این است که زمانی که از مهره‌ای می‌خواهیم حرکت کند، مهره حرکت می‌کند. این مفهوم تجرید است.

مفهوم کپسوله‌سازی در برنامه‌نویسی شی‌ءگرا

کپسوله‌سازی یکی از روش‌هایی است که برنامه‌نویسی شی‌ءگرا برای ساخت تجرید استفاده می‌کند. هر شیء مجموعه‌ای از داده‌ها است که با آن به عنوان یک واحد مجزا برخورد می‌شود. درون این اشیا نیز داده‌ها به صورت متغیر و متد قرار دارند.

متغیرهای درون شیء به طور کلی مجزا باقی می‌مانند و این به آن معنی است که اشیا و متدها نمی‌توانند به همدیگر دسترسی داشته باشند. اشیا تنها از طریق استفاده از متدهایشان تأثیر می‌پذیرند.

یک شیء وزیر می‌تواند شامل چند بخش از اطلاعات باشد. برای نمونه می‌تواند متغیری به نام «موقعیت» داشته باشد که مکان آن را روی صفحه تعیین می‌کند. این متغیر برای استفاده از متد ()move لازم است. و همچنین یک متغیر رنگ نیز دارد.

با اعلان خصوصی متغیر موقعیت و اعلان عمومی متد ()move برنامه‌نویس می‌تواند از تأثیرپذیری متغیرهای حرکت از اشیای دیگر جلوگیری نماید. رنگ مهره نیز اگر به صورت خصوصی اعلان شود، اشیای دیگر نمی‌توانند آن را تغییر دهند؛ مگر این که متدی اجازه این کار را به آن‌ها بدهد. البته در این مورد چنین کاری مجاز نیست چون رنگ مهره‌های شطرنج همواره ثابت است.

مفهوم وراثت در برنامه‌نویسی شی‌ءگرا

زبان‌های برنامه‌نویسی شی‌ءگرا علاوه بر کلاس دارای زیرکلاس نیز هستند. این زیرکلاس‌ها شامل همه خصوصیاتی هستند که کلاس‌های والدشان دارند؛ اما می‌توانند خصوصیات دیگری را نیز بپذیرند.

در مورد مثال بازی شطرنج، مهره‌های پیاده به متدی نیاز دارند که در صورت موفقیت در رسیدن به انتهای صفحه، آن‌ها را به وزیر تبدیل کند. مثلاً این متد را می‌توان ()transformPiece نامید.

همه مهره‌ها به چنین متدی نیاز ندارند. بنابراین لازم نیست که این متد را در کلاس مهره‌ها قرار دهیم. بلکه می‌توانیم یک زیرکلاس از کلاس مهره‌ها به نام «پیاده» ایجاد کنیم. از آنجا که زیرکلاس‌ها همه خصوصیات کلاس «مهره» را ارث می‌برند، این وهله از زیرکلاس «پیاده» نیز شامل رنگ، ارتفاع، شکل و حرکت‌های مجاز خواهد بود.

اما علاوه بر خصوصیات فوق یک متد ()transformPiece نیز در آن تعریف می‌کنیم. در این حالت لازم نیست که نگران استفاده نادرست از این متد بر روی مهره رخ (قلعه) باشیم.

ایجاد زیرکلاس‌ها باعث صرفه‌جویی زیادی در زمان برنامه‌نویسی می‌شود. به جای ایجاد کلاس‌های جدید برای هر چیز، می‌توان تنها یک کلاس پایه نوشت و سپس آن را هر زمان که نیاز باشد، به زیرکلاس‌های جدید گسترش داد. البته تکیه زیاد بر روی وراثت نیز جنبه‌های منفی خاص خود را دارد که در این نوشته فرصت پرداختن به آن‌ها نیست.

مفهوم چندریختی در برنامه‌نویسی شی‌ءگرا

چندریختی نتیجه وراثت است. درک کامل چندریختی نیازمند کسب حداقلی از دانش برنامه‌نویسی است و از این‌ رو در این بخش تنها به صورت مقدماتی آن را معرفی می‌کنیم. به طور خلاصه چندریختی به برنامه‌نویس امکان می‌دهد که متدهایی با نام یکسان را بر روی اشیای مختلف استفاده کند.

برای نمونه فرض کنید در کلاس «مهره»-ها که در بخش‌های قبلی تعریف کردیم یک متد move() داشتیم که هر مهره را در همه جهات به اندازه یک واحد حرکت می‌داد. این متد برای مهره شاه مفید است؛ اما فقط برای این مهره به درد می‌خورد و در مورد مهره‌های دیگر به کار نمی‌آید. برای حل این مشکل می‌توانیم متد ()move جدیدی در زیرکلاس «مهره رخ» تعریف کنیم که به صورت حرکت به تعداد نامحدود در جهت‌های جلو، عقب، چپ و راست باشد.

در این حالت زمانی که برنامه‌نویس متد ()move را فراخوانی می‌کند، نوع مهره را نیز به عنوان ورودی (آرگومان) متد ارسال می‌کند تا برنامه بداند که دقیقاً چه مهره‌ای را باید حرکت دهد. بدین ترتیب مقدار زمان زیادی صرفه‌جویی می‌شود. این زمان بدون وجود چندریختی باید صرف این می‌شد که تشخیص دهید چه نوع حرکتی باید انجام دهید.

برنامه‌نویسی شی‌ءگرا به صورت خلاصه

اگر پس از مطالعه مفاهیم برنامه‌نویسی شی‌ءگرا دچار سردرد شده‌اید، باید بگوییم که جای نگرانی نیست. در ادامه مواردی که باید به خاطر بسپارید را فهرست کرده‌ایم:

  • برنامه‌نویسی شی‌ءگرا اطلاعاتی را در واحدهای منفرد به نام شیء گردآوری می‌کند.
  • هر شی‌ء وهله منفردی از یک کلاس است
  • تجرید، باعث مخفی شدن طرز کار درونی شی‌ء در مواردی که لزومی به افشای آن نیست می‌شود.
  • کپسوله‌سازی، متغیرها و متدهای درون اشیا را به هم مرتبط می‌سازد و از آن‌ها حفاظت می‌کند.
  • وراثت، امکان استفاده زیرکلاس‌ها از خصوصیات کلاس‌های والد را فراهم می‌سازد.
  • چندریختی به اشیا و متدها امکان مدیریت موقعیت‌های مختلف با یک رابط منفرد را می‌دهد.

اگر موارد فوق را به خاطر بسپارید، درک مناسبی از مفهوم برنامه‌نویسی شی‌ءگرا خواهید داشت. درک چهار اصل برنامه‌نویسی شی‌ءگرا همان‌طور که اشاره کردیم ممکن است کار دشواری باشد؛ اما زمانی که شروع به برنامه‌نویسی بکنید برایتان واضح‌تر می‌شوند.

به خاطر داشته باشید که ما در این نوشته تنها کلیاتی از برنامه‌نویسی شی‌ءگرا را مطرح کرده‌ایم. زبان‌های برنامه‌نویسی مختلف شیءگرا هر کدام روش‌ها و ترتیبات خاص خود را دارند. زمانی که زبان برنامه‌نویسی مناسب خود را انتخاب کردید، می‌توانید شروع به مطالعه در مورد روش استفاده آن زبان از مفاهیم شیءگرایی بکنید.

اگر این نوشته مورد توجه شما قرار گرفته است، موارد زیر نیز احتمالاً برای شما مفید خواهند بود:

==

بر اساس رای 3 نفر

آیا این مطلب برای شما مفید بود؟

یک نظر ثبت شده در “برنامه‌نویسی شی‌ءگرا چیست؟ — یک توضیح مقدماتی به زبان ساده

  1. ممنون از آموزش عالیتون، واقعا به درد بخور بود و تونست یک مفهوم کلی از برنامه نویسی شی گرا رو تو ذهنم ایجاد کنه

نظر شما چیست؟

نشانی ایمیل شما منتشر نخواهد شد. بخش‌های موردنیاز علامت‌گذاری شده‌اند *