برنامه نویسی شی گرا چیست؟ همراه با کد آموزشی

چکیده مقاله:
برنامه نویسی شی گرا (Object-Oriented Programming) یکی از محبوب ترین و موثرترین روش های طراحی و توسعه نرم افزار می باشد. این پارادایم بر اساس مفاهیمی مانند اشیا (Objects)، کلاس ها (Classes)، وراثت (Inheritance) و چندریختی (Polymorphism) شکل گرفته است. در این رویکرد، برنامه ها به مجموعه ای از اشیا تقسیم می شوند که هر کدام ویژگی ها و رفتارهای مختص به خود را دارند. این روش به توسعه دهندگان امکان می دهد تا برنامه هایی مقیاس پذیر، قابل نگهداری و با ساختاری منظم تر ایجاد کنند. استفاده از اصول برنامه نویسی شی گرا باعث می شود کدها خواناتر شده و قابلیت استفاده مجدد (Reuse) آن ها افزایش یابد.
یکی از ویژگی های برجسته برنامه نویسی شی گرا، تطبیق پذیری آن با پروژه های بزرگ و پیچیده می باشد. این روش امکان مدل سازی سیستم های واقعی را فراهم کرده و به توسعه دهندگان کمک می کند تا مشکلات دنیای واقعی را به صورت قابل فهم و ساختارمند حل کنند. درک درست مفاهیمی مانند کپسوله سازی (Encapsulation) و انتزاع (Abstraction) به برنامه نویسان کمک می کند تا پیچیدگی پروژه را کاهش داده و تمرکز خود را بر جزئیات مهم معطوف کنند. از طرف دیگر، استفاده از الگوهای طراحی (Design Patterns) در این روش، منجر به تولید کدهایی استاندارد و بهینه می شود که تیم های توسعه می توانند به سادگی آن ها را مدیریت کنند.
مقدمه ای بر برنامه نویسی شی گرا
برنامه نویسی شی گرا (Object-oriented programming یا به اختصار OOP) یک الگوی برنامه نویسی بنیادی برای بسیاری از زبان های برنامه نویسی از جمله جاوا و C++ می باشد. در این مقاله، مفاهیم پایه ای برنامه نویسی شی گرا را بررسی می کنیم. سه مفهوم اصلی را شرح خواهیم داد: کلاس ها و نمونه ها، وراثت، و کپسوله سازی. در حال حاضر این مفاهیم را بدون اشاره خاص به جاوااسکریپت توضیح می دهیم، بنابراین تمامی مثال ها به صورت کد شبه ارائه می شوند.
نکته: به طور دقیق، ویژگی هایی که در اینجا توضیح داده می شوند، مربوط به یک سبک خاص از OOP به نام برنامه نویسی شی گرا مبتنی بر کلاس یا “کلاسیک” هستند. وقتی افراد از OOP صحبت می کنند، معمولاً به این نوع اشاره دارند.
پس از این، در جاوااسکریپت بررسی خواهیم کرد که چگونه سازنده ها (constructors) و زنجیره نمونه اولیه (prototype chain) به این مفاهیم OOP مربوط می شوند و چه تفاوت هایی دارند. در مقاله بعدی، برخی ویژگی های اضافی جاوااسکریپت که پیاده سازی برنامه های شی گرا را آسان تر می کنند، بررسی خواهیم کرد.
پیش نیازها:
درک توابع در جاوااسکریپت، آشنایی با مبانی جاوااسکریپت (نگاه کنید به اولین گام ها و بلوک های ساختاری)، و اصول برنامه نویسی شی گرا در جاوااسکریپت (نگاه کنید به معرفی اشیا و نمونه های اولیه اشیا).
هدف:
درک مفاهیم پایه ای برنامه نویسی شی گرا مبتنی بر کلاس.
برنامه نویسی شی گرا چیست؟
برنامه نویسی شی گرا مربوط به مدل سازی یک سیستم به عنوان مجموعه ای از اشیا می باشد که هر شی نمایانگر یک جنبه خاص از سیستم است. اشیا شامل توابع (یا متدها) و داده ها می باشند. یک شی، یک رابط عمومی برای کدهای دیگر که می خواهند از آن استفاده کنند فراهم می کند، اما وضعیت داخلی و خصوصی خود را حفظ می نماید؛ سایر بخش های سیستم نیازی ندارند از آنچه در داخل شی می گذرد اطلاع داشته باشند.
کلاس ها و نمونه ها
هنگامی که یک مسئله را با استفاده از اشیا در OOP مدل می کنیم، تعاریف انتزاعی ایجاد می کنیم که نشان دهنده انواع اشیایی هستند که می خواهیم در سیستم خود داشته باشیم. به عنوان مثال، اگر یک مدرسه را مدل کنیم، ممکن است بخواهیم اشیایی داشته باشیم که نمایانگر استادان باشند. هر استاد دارای برخی خصوصیات مشترک است: همه آن ها یک نام و یک موضوع تدریس دارند. علاوه بر این، هر استاد می تواند کارهایی انجام دهد: آن ها می توانند یک مقاله را ارزیابی کنند و می توانند خود را در ابتدای سال به دانشجویان معرفی نمایند.
بنابراین، استاد می تواند یک کلاس در سیستم ما باشد. تعریف کلاس شامل داده ها و متدهایی است که هر استاد دارد.
در کد شبه، یک کلاس استاد به این صورت تعریف می شود:
این تعریف کلاس Professor شامل موارد زیر است:
- دو خصوصیت داده ای:
name
وteaches
- دو متد:
grade()
برای ارزیابی یک مقاله وintroduceSelf()
برای معرفی خود.
به تنهایی، یک کلاس هیچ عملی انجام نمی دهد: این بیشتر شبیه یک الگو است برای ایجاد اشیای ملموس از آن نوع. هر استادی که ما ایجاد می کنیم، یک نمونه از کلاس Professor نامیده می شود. فرآیند ایجاد یک نمونه با استفاده از یک تابع خاص به نام سازنده انجام می شود. ما مقادیر را به سازنده می دهیم تا وضعیت داخلی شی جدید را مقداردهی اولیه کنیم.
به طور کلی، سازنده به عنوان بخشی از تعریف کلاس نوشته می شود و معمولاً نامی مشابه با نام کلاس دارد:
این سازنده دو پارامتر دریافت می کند، بنابراین می توانیم خصوصیات name و teaches را هنگام ایجاد یک استاد جدید مقداردهی کنیم.
اکنون که یک سازنده داریم، می توانیم تعدادی استاد ایجاد کنیم. زبان های برنامه نویسی اغلب از کلمه کلیدی new برای نشان دادن فراخوانی یک سازنده استفاده می کنند:
وراثت
فرض کنید در مدرسه خود می خواهیم دانش آموزان را نیز مدل کنیم. برخلاف استادان، دانش آموزان نمی توانند مقاله ای را ارزیابی کنند، موضوع خاصی را تدریس نمی کنند، و به یک سال تحصیلی خاص تعلق دارند.
با این حال، دانش آموزان هم دارای نام هستند و ممکن است بخواهند خود را معرفی کنند. بنابراین می توانیم تعریف کلاس Student را به این شکل بنویسیم:
مفید خواهد بود اگر بتوانیم نشان دهیم که دانش آموزان و استادان برخی ویژگی ها را به اشتراک می گذارند یا دقیق تر، اینکه آن ها در سطحی از یک نوع هستند. وراثت به ما اجازه می دهد این کار را انجام دهیم.
با مشاهده شروع می کنیم که دانش آموزان و استادان هر دو انسان هستند و انسان ها دارای نام هستند و می خواهند خود را معرفی کنند. می توانیم این را با تعریف یک کلاس جدید به نام Person مدل کنیم، جایی که تمامی ویژگی های مشترک انسان ها تعریف می شوند. سپس، Professor و Student می توانند از Person مشتق شوند و ویژگی های اضافی خود را اضافه کنند:
در این حالت، می گوییم که Person کلاس پدر (superclass) یا کلاس والد هر دو Professor و Student است. به طور معکوس، Professor و Student زیرکلاس ها (subclasses) یا کلاس های فرزند Person هستند.
شاید متوجه شوید که متد introduceSelf()
در هر سه کلاس تعریف شده است. دلیل این امر این است که اگرچه همه انسان ها می خواهند خود را معرفی کنند، اما نحوه انجام این کار برای هر گروه متفاوت است:
ممکن است بخواهیم یک پیاده سازی پیش فرض از متد introduceSelf() برای افرادی که نه دانش آموز هستند و نه استاد، ارائه دهیم:
این ویژگی که یک متد دارای نام یکسان اما پیاده سازی متفاوت در کلاس های مختلف است، چندریختی (polymorphism) نامیده می شود. وقتی یک متد در یک زیرکلاس نسخه ای از متد کلاس پدر را جایگزین می کند، می گوییم زیرکلاس آن متد را بازنویسی (override) کرده است.
کپسوله سازی
اشیا یک رابط برای کدهای دیگر که می خواهند از آن ها استفاده کنند فراهم می کنند، اما وضعیت داخلی خود را حفظ می نمایند. وضعیت داخلی شی خصوصی نگه داشته می شود، به این معنی که فقط از طریق متدهای خود شی قابل دسترسی است و سایر اشیا نمی توانند به آن دسترسی داشته باشند. خصوصی نگه داشتن وضعیت داخلی یک شی و به طور کلی ایجاد یک تفکیک واضح بین رابط عمومی آن و وضعیت داخلی خصوصی، کپسوله سازی نامیده می شود.
این ویژگی مفید است زیرا به برنامه نویس اجازه می دهد پیاده سازی داخلی یک شی را تغییر دهد بدون اینکه نیاز باشد تمام کدهایی که از آن استفاده می کنند را پیدا و به روزرسانی کند: این ویژگی نوعی دیوار حفاظتی بین این شی و بقیه سیستم ایجاد می کند.
برای مثال، فرض کنید دانش آموزان فقط در صورتی اجازه دارند تیراندازی با کمان بیاموزند که در سال دوم یا بالاتر باشند. می توانیم این موضوع را فقط با در دسترس قرار دادن خصوصیت year
پیاده سازی کنیم، و سایر کدها می توانند این خصوصیت را بررسی کنند تا تصمیم بگیرند آیا دانش آموز می تواند در این دوره شرکت کند یا خیر:
مشکل این است که اگر بخواهیم معیارهای اجازه شرکت در تیراندازی با کمان را تغییر دهیم – برای مثال، با اضافه کردن نیاز به رضایت والدین یا سرپرست – باید هر جایی در سیستم که این آزمون انجام می شود را به روزرسانی کنیم. بهتر است یک متد به نام canStudyArchery()
بر روی اشیای Student داشته باشیم که منطق را در یک مکان پیاده سازی کند:
به این ترتیب، اگر بخواهیم قوانین مربوط به تیراندازی با کمان را تغییر دهیم، تنها لازم است کلاس Student را به روز کنیم و تمام کدهایی که از آن استفاده می کنند همچنان به درستی کار خواهند کرد.
در بسیاری از زبان های OOP، می توانیم از دسترسی سایر کدها به وضعیت داخلی یک شی جلوگیری کنیم، با این کار که برخی خصوصیات را به صورت خصوصی (private) علامت گذاری کنیم. اگر کدی خارج از شی بخواهد به آن ها دسترسی پیدا کند، یک خطا ایجاد می شود:
در زبان هایی که این نوع دسترسی را به صورت داخلی enforce نمی کنند، برنامه نویسان از قراردادهای نام گذاری مانند شروع کردن نام خصوصیت با یک زیرخط (_
) استفاده می کنند تا نشان دهند که آن خصوصیت باید به عنوان خصوصی در نظر گرفته شود.
برنامه نویسی شی گرا و جاوا اسکریپت
در این مقاله، برخی از ویژگی های اساسی برنامه نویسی شی گرا مبتنی بر کلاس همانطور که در زبان هایی مانند جاوا و ++C پیاده سازی شده است، توضیح داده شد.
در دو مقاله قبلی، به چند ویژگی اصلی جاوا اسکریپت یعنی سازنده ها (constructors) و پروتوتایپ ها (prototypes) پرداختیم. این ویژگی ها قطعاً با برخی از مفاهیم برنامه نویسی شی گرا که در بالا توضیح داده شد، ارتباط دارند.
سازنده ها در جاوا اسکریپت به ما چیزی شبیه تعریف کلاس ارائه می دهند و این امکان را فراهم می کنند که “ساختار” یک شی، شامل هر متدی که دارد، در یک مکان تعریف شود. اما پروتوتایپ ها نیز در اینجا قابل استفاده هستند. برای مثال، اگر یک متد در خاصیت prototype یک سازنده تعریف شود، تمامی اشیایی که با استفاده از آن سازنده ایجاد می شوند، آن متد را از طریق پروتوتایپ خود دریافت می کنند و نیازی به تعریف آن در خود سازنده نیست.
زنجیره پروتوتایپ به نظر می رسد که روشی طبیعی برای پیاده سازی وراثت باشد. برای مثال، اگر ما یک شی Student داشته باشیم که پروتوتایپ آن Person باشد، می تواند خصوصیت name
را به ارث ببرد و متد introduceSelf()
را بازنویسی کند.
اما ارزش دارد که تفاوت های بین این ویژگی ها و مفاهیم “کلاسیک” برنامه نویسی شی گرا که در بالا توضیح داده شد را درک کنیم. در اینجا به چند تفاوت اشاره می کنیم:
- در برنامه نویسی شی گرا مبتنی بر کلاس، کلاس ها و اشیا دو سازه جداگانه هستند و اشیا همیشه به عنوان نمونه هایی از کلاس ها ایجاد می شوند. همچنین، تفاوتی بین ویژگی مورد استفاده برای تعریف یک کلاس (خود سینتکس کلاس) و ویژگی مورد استفاده برای نمونه سازی یک شی (سازنده) وجود دارد. در جاوا اسکریپت، ما می توانیم و اغلب اشیایی را بدون هیچ تعریف جداگانه ای از کلاس ایجاد کنیم، چه با استفاده از یک تابع یا یک شیء literal. این ویژگی کار با اشیا را بسیار سبک تر از برنامه نویسی شی گرا کلاسیک می کند.
- اگرچه یک زنجیره پروتوتایپ شبیه به یک سلسله مراتب وراثت به نظر می رسد و از برخی جهات نیز مشابه عمل می کند، اما از جهات دیگر متفاوت است. وقتی یک زیرکلاس نمونه سازی می شود، یک شیء واحد ایجاد می شود که خصوصیات تعریف شده در زیرکلاس را با خصوصیات تعریف شده در سطوح بالاتر سلسله مراتب ترکیب می کند. اما با استفاده از پروتوتایپ، هر سطح سلسله مراتب توسط یک شی جداگانه نمایش داده می شود و آن ها از طریق خاصیت
__proto__
به یکدیگر متصل می شوند. رفتار زنجیره پروتوتایپ کمتر شبیه به وراثت است و بیشتر شبیه به واگذاری (delegation) می باشد.
واگذاری یک الگوی برنامه نویسی است که در آن یک شی، زمانی که برای انجام یک وظیفه درخواست می شود، می تواند خود آن وظیفه را انجام دهد یا از یک شی دیگر (نماینده آن) بخواهد وظیفه را به جای آن انجام دهد. از بسیاری جهات، واگذاری یک روش انعطاف پذیرتر برای ترکیب اشیا نسبت به وراثت است (برای مثال، امکان تغییر یا جایگزینی کامل نماینده در زمان اجرا وجود دارد).
با این حال، می توان از سازنده ها و پروتوتایپ ها برای پیاده سازی الگوهای برنامه نویسی شی گرا مبتنی بر کلاس در جاوا اسکریپت استفاده کرد. اما استفاده مستقیم از آن ها برای پیاده سازی ویژگی هایی مانند وراثت دشوار است، بنابراین جاوا اسکریپت ویژگی های اضافی ارائه می دهد که بر روی مدل پروتوتایپ ساخته شده و مفاهیم برنامه نویسی شی گرا مبتنی بر کلاس را مستقیماً ترسیم می کند. این ویژگی های اضافی موضوع مقاله بعدی می باشند.
خلاصه
این مقاله ویژگی های اساسی برنامه نویسی شی گرا مبتنی بر کلاس را توضیح داده و به طور مختصر بررسی کرده است که سازنده ها و پروتوتایپ های جاوا اسکریپت چگونه با این مفاهیم مقایسه می شوند.
در مقاله بعدی، ویژگی هایی که جاوا اسکریپت برای پشتیبانی از برنامه نویسی شی گرا مبتنی بر کلاس ارائه می کند را بررسی خواهیم کرد.
مدیر2025-08-20T19:57:22+03:30آگوست 20, 2025|0 Comments
چکیده مقاله: ضریب همبستگی اسپیرمن یکی از روش های آماری غیرپارامتری برای سنجش ارتباط بین دو متغیر است. این روش زمانی کاربرد دارد که داده ها از نوع رتبه ای باشند یا زمانی که [...]
مدیر2025-08-17T22:48:18+03:30آگوست 17, 2025|0 Comments
چکیده مقاله: کتابخانه ها و Toolbox های معروف زبان برنامه نویسی متلب مجموعه ای از ابزارها و توابع آماده هستند که برای ساده سازی فرآیند حل مسائل پیچیده در حوزه های مختلف علمی و [...]
مدیر2025-08-14T17:36:11+03:30آگوست 14, 2025|0 Comments
چکیده مقاله: انواع داده های عددی در متلب شامل مجموعه ای از داده ها می باشد که برای نمایش و پردازش مقادیر عددی به کار می روند. در متلب این داده ها به شکل [...]
مدیر2025-08-08T21:16:26+03:30آگوست 8, 2025|0 Comments
چکیده مقاله: بهترین هوش مصنوعی برای ساخت ویدیو امروزه به یکی از پرجستجوترین عبارات در حوزه تولید محتوا و بازاریابی دیجیتال تبدیل شده است. با پیشرفت سریع فناوری، ابزارهای متعددی مبتنی بر هوش مصنوعی [...]
مدیر2025-08-06T20:32:36+03:30آگوست 6, 2025|0 Comments
چکیده مقاله: بهترین زبان برنامه نویسی پردازش تصویر موضوعی است که بسیاری از دانشجویان، پژوهشگران و برنامه نویسان به دنبال آن هستند. پردازش تصویر یکی از شاخه های مهم هوش مصنوعی و علوم کامپیوتر [...]
مدیر2025-08-06T00:29:07+03:30آگوست 6, 2025|0 Comments
چکیده مقاله: بهترین هوش مصنوعی برای تولید محتوا امروزه به یکی از پرکاربردترین ابزارهای دنیای دیجیتال تبدیل شده است. با رشد روزافزون اینترنت و افزایش رقابت در زمینه بازاریابی آنلاین، تولید محتوای جذاب و [...]