برنامهنویسی شئگرا (Object Oriented Programming) که به اختصار OOP نیز نامیده میشود، در حقیقت نوعی منطق یا الگوست که برگرفته از زندگی روزمرهی ما بوده و حدودا در دههی 1960 میلادی مطرح شد، در ادامه با همیار آیتی همراه باشید تا بیشتر با مفهوم شی گرایی و برنامهنویسی شئ گرا آشنا شویم.

همانطوری که گفتیم در برنامه نویسی شی گرا، برنامه را شبیه به دنیای اطراف و زندگی روزمره خودمان میبینیم، در حقیقت برپایهی مدلسازی اشیا.
این موضوع را با یک مثال برای شما شرح میدهیم:
یک خودرو را به عنوان یک شئ در نظر بگیرید، ویژگیهایی مانند رنگ، وزن، سرعت و… از جمله مواردی هستند که میتوان به عنوان ویژگیهای یک خودرو در نظر گرفت، همچنین یک خودرو مجموعه رفتارهایی مانند، حرکت کردن، ترمز گرفتن، بوق زدن و… را نیز از خود نشان میدهد.
به هر موجودیتی که دارای خصوصیت، اطلاعات، وضعیت یا رفتار خاصی باشد یک شئ یا Object گفته میشود، این آبجکت را میتوان به صورت فیزیکی یا منطقی در نظر گرفت.
به اطلاعات و ویژگیهای موجود برای یک شئ خصوصیت یا Atribute میگویند و اعمالی که یک شئ میتواند از خود بروز دهد رفتار یا Behavior نام دارند.
در مثال بالا خودرو را به عنوان یک شئ یا Object در نظر بگیرید، خصوصیات این شئ عبارتند از رنگ، سرعت و… که همان Attributeها هستند، همچنین اعمالی مانند حرکت کردن، بوق زدن و… رفتارها یا Behaviorهای این شئ نامیده میشوند.
در ادامه بیشتر با این مفاهیم در برنامهنویسی آشنا خواهیم شد و ارتباط آنها را با برنامهنویسی شئگرا بیان خواهیم کرد، اما در ابتدا بیایید با چند مفهوم دیگر در شئگرایی آشنا شویم.
مفهوم کلاس (Class) در شئگرایی چیست؟
به زبان ساده میتوان کلاس را به عنوان قالبی برای اشیا در نظر گرفت، مثلا خودروی BMW یک نمونه شئ از کلاس خودرو است، کلاسها معمولا در بردارندهی خصوصیات و رفتار اشیا هستند، مثلا کلاس خودرو دربردارندهی ویژگیهای یک خودرو مثل سرعت، وزن، رنگ و… است و هر مدل خودرویی که از این کلاس در نظر بگیریم تمامی ویژگیهای گفته شده در کلاس را درون خود خواهد داشت، برای درک بهتر این مفهوم تصویر زیر را ببینید:

چرا از برنامهنویسی شئ گرا استفاده میکنیم؟
در حالت عادی شما کل برنامه را در قالب دستورات و توابع پشت سر هم مینویسید (Procedural) و برای تغییر هرچیزی از برنامه احتیاج دارید تا کل ساختار برنامه را بررسی کرده و موارد مورد نیاز را تغییر دهید.
فرض کنید در حال نوشتن برنامهای در خصوص مدیریت خودروها هستید، شما برای هر مدل خودرو چندین خط کد مینویسید، در ادامه تصمیم میگیرید ویژگی جدیدی به خودروهای خود اضافه کنید، مثلا میزان شتاب خودرو، در این صورت باید کل دستورات برنامه را جستجو کرده و در تمام خطوط این ویژگی جدید را به تمامی خودروها اضافه کنید.
اما اگر برنامهی خود را با استفاده از مفهوم شئگرایی نوشته باشید در این صورت تنها کافیست این ویژگی (Attribute) جدید را به کلاس اصلی برنامه اضافه کنید تا سایر اشیا (خودروها) نیز این ویژگی جدید را به ارث ببرند و آن را درون خود داشته باشند، در این صورت دیگر احتیاجی نیست تک به تک خطوط برنامه را دستخوش تغییر کنید.
علاوه بر آن به دلیل ویژگیهای خاصی که در برنامهنویسی شئگرا حاکم است، دسترسی به دادههای درون کلاس از بیرون امکانپذیر نیست و این مورد میتواند در حفظ امنیت برنامهها به شما کمک کند.
به نقل از ویکیپدیا، برنامهنویسی شیگرا یک شیوه برنامهنویسی است که ساختار یا بلوک اصلی اجزای آن، شیها میباشند. در واقع در این شیوه برنامهنویسی، برنامه به شی گرایش پیدا میکند. به این معنا که دادهها و توابعی که قرار است بر روی این دادهها عمل کنند، تا حد امکان در قالبی به نام شی در کنار یکدیگر قرار گرفته، جمعبندی شده و یک واحد (شی) را تشکیل داده و نسبت به محیط بیرونِ خود، کپسوله میشوند و از این طریق، توابع بیگانهٔ خارج از آن شی، دیگر امکان ایجاد تغییر در دادههای درون آن شی را ندارند.
مفهوم ارثبری (Inheritance) در شی گرایی
به زبان بسیار ساده، اشیا خصوصیات و رفتارها را از کلاس والد خود به ارث میبرند، به عنوان مثال خودروی BMW خصوصیاتی مانند سرعت، وزن، رنگ و… را از کلاس اصلی (والد) خود به ارث برده است، هر شئ دیگری نیز از این کلاس بسازید این ویژگیها را در خود دارد، یک کلاس میتواند تعدادی ویژگی را از کلاس دیگری به ارث ببرد، در این صورت شئ ساخته شده از کلاس جدید، ویژگیهای هردو کلاس را در خود خواهد داشت، این مفهوم را ارثبری مینامیم.
آشنایی با مفهوم Public و Private در کلاسها
همانطور که بالاتر اشاره کردیم دادههای موجود در کلاس از بیرون قابل دستیابی نیستند و این مفهوم به کمک وضعیت Private برای دادهها امکانپذیر خواهد بود، در حالت کلی حالات مختلفی برای دادهها قابل استفاده است، حالت Private یعنی دادهها تنها داخل کلاس شناختهشده هستند و در خارج از کلاس امکان مشاهده و تغییر آنها وجود نخواهد داشت، اما در نقطهی مقابل در حالت Public است که اطلاعات موجود در کلاس در خارج از بدنهی کلاس نیز قابل دستیابی و تغییر هستند.
حال که تا حدودی با مفهوم کلاسها آشنا شدیم، یک نمونه کلاس نوشته شده را در قطعه کد زیر مشاهده کنید:
class Car { int Speed; int Weight; string Color; void Moving(); void Brake(); void Hoot(); }
اگر به این قطعه کد دقت کنید و آن را با تصویر بالا (خودرو) مقایسه کنید شباهت آنها را خواهید یافت.
مزایای برنامهنویسی شئگرا چیست؟
هرچند برنامهنویسی شئگرا در ابتدا شاید کمی پیچیده به نظر برسد و احتیاج به تجزیه تحلیلهای اولیهی برای پیادهسازی برنامه داشته باشد، اما در دراز مدت و در مراحل تست و نگهداری برنامه به شدت به کمک شما خواهد آمد، از ویژگیهای برنامهنویسی شئگرا میتوان به موارد زیر اشاره کرد:
- افزایش امنیت برنامه
- کاهش هزینه نگهداری
- قابلیت استفاده مجدد
- تحلیل سادهتر برنامه
همانطور که در ابتدای مقاله گفتیم برنامهنویسی شئگرا به شدت به دنیای واقعی ما انسانها شباهت دارد و معمولا سادهتر توسط ذهن درک میشود، بنابراین سعی کنید تا حد ممکن برنامههای خود را با استفاده از اصول شئگرایی نوشته و به دنیای برنامهنویسان حرفهای نزدیکتر شوید.
شما یک گام جلوتر از دیگران باشید! اگر به آیتی و تکنولوژی علاقهمندید و دوست دارید سریعتر در این زمینه پیشرفت کنید، همین حالا به جمع 15,916 عضو همیار آیتی بپیوندید، دسترسی به تمام آموزشهای پریمیوم، دریافت جدیدترین آموزشهای کاربردی مرتبط با آیتی و استفاده از مشاورهی رایگان، برخی از مزایای عضویت در سایت هستند، شما نیز به کاربران همیار پیوسته و همین حالا وارد دنیای حرفهایها شوید... من هم میخواهم عضو ویژهی همیار شوم
عالی. صادقانه بگم که ده ها سایت و وبلاگ و ویکیپدیا رو خوندم و متاسفانه اصلا نفهمیدم چی میگن!!! نمیدونم چرا اینها اینقدر قلمبه و پیچیده و تخصصی توضیح دادن!!!
بابا !!! شما اول بیا مفهوم اولیه اون موضوع رو به طرف مقابل بفهمون (مثل توضیحات و مثال عالی شما) بعد در مورد چیزای دیگه توضیح بده!
فرض کنید یکی از صد سال پیش اومده و گوشی منو دیده و میگه این چیه؟! منم برگردم بگم موبایله ، دوربینش اینقدر پیکسله! هر پیکسل اینقدر میکرون! و فیلمبرداری فور کی و اتصال 5 جی و سنسور فلان و فلان داره!!! به نظرتون طرف مقابل متوجه میشه؟! یا باید اول فقط بگم کارش صحبت کردن از راه دوره و بعد دونه دونه و به صورت مجزا دوربین و …. رو توضیح بدم؟!
واقعا که بعضیا نمیفهمند ، دروغ نگم میخواستم از خجالت چندتاشون در بیام اما گفتم لعنت بر شیطون!! شاید من مشکل دارم. (در حالی که من ریاضی تدریس میکنم و به گفته اکثر بچهها خیلی قابل فهم و ساده توضیح میدم)
بهرحال دم شما گرم که منِ با گیرایی پایین رو در فهمیدن این مطلب کمک کردید.
سلام توضیحاتتون عالی بود خیلی ممنونم
سپاسگزارم جناب گوهری بزرگوار
ممنون از راهنمایی ارزشمندتون.
یک سوال دیگه هم داشتم، برای این منظور آیا فقط php کافیه و یا اینکه مهارت های دیگری هم نیاز هست. چون می خوام با استفاده از فرمول هایی، داده های استخراج شده رو تجزیه و تحلیل کنم و خروجی که می گیرم نتایج این تجزیه و تحلیل ها باشه.
و برای این منظور منبع خاصی هست که با مراجعه به اون بتونم به اسن هدفم برسم؟
سلام و سپاس از مطالب مفیدتان
بنده برای تجزیه و تحلیل بر روی برخی داده ها نیازمند استفاده از داده های یک سایت دیگر هستم. بدین منظور مدتی است به زبان برنامه نویسی علاقه مند شده ام و در حال یادگیری زبان PHP هستم.
چون در ابتدای راهم سوالی داشتم؛ آیا امکان استفاده آنلاین از داده های یک سایت دیگر در سایت خود (به گونه ای که هر گونه تغییرات در داده های سایت مورد نظر در سایت مقصد هم به صورت خودکار بروزرسانی شود) وجود دارد؟ و برای این امر آیا زبان PHP مناسب است؟ و چه سطحی از مهارت برنامه نویسی برای رسیدن به این هدف لازم است؟ سپاسگزار می شوم در این زمینه راهنمایی بفرمایین.
سلام، از اینکه مقاله برای شما مفید بوده خیلی خوشحالیم.
چیزی که مد نظر شماست، اصطلاحا Web Scraping نامیده میشه و در اکثر زبانهای برنامهنویسی هم میتونید بهش دسترسی داشته باشید؛ برای اینکه نمونهکدهای بیشتری ازش ببینید میتونید عبارت php web scraping رو در اینترنت جستجو کنید و چندان چیز پیچیدهای نیست و میتونید با کمی آشنایی با زبان PHP انجامش بدید.
سلام امکان داره واسه امتحانات نهایی دانشگاه کمکمون کنید
سلام فرق بین variables و Data type چیه اگه ممکن توضیح بدید ممنون میشم
سلام دوست عزیز، دو مفهوم کاملا متفاوت هستند، دیتاتایپ در حقیقت نوع دادهای هست که دارید باهاش کار میکنید (مثلا میتونه از نوع عدد صحیح باشه یا از نوع کارکتر یا اعداد اعشاری و…) اما متغیر یا وریبل در حقیقت اون جایی هست که دادهها رو داخلش قرار میدید (مثل یک ظرف تصورش کنید) حالا متغیرهای شما میتونن دربردارندهی دیتاتایپهای مختلفی باشند، مثلا داخل یک متغیر دادهای از نوع عدد صحیح قرار بدید و در یک متغیر دیگه دادهی نوع کارکتری قرار بدید؛ فرض کنید ظرفهایی دارید که داخل یکیش آب قرار میدید و داخل دیگری شکلات قرار میدید، در این مثال ظرف شما میشه همون متغیر و نوع مواد غذایی که داخلش گذاشتید (آب و شکلات) میشه دیتاتایپ (نوع دادهها)
امیدوارم تونسته باشم خوب منظورم رو برسونم، اما اگر باز هم جایی رو متوجه نشدید، بگید که بیشتر براتون توضیح بدم.
عالی بود ممنون از شما
عالی
بسیار عالی و روان توضیح داده شده بود. بسیار سپاسگزارم
خیلی خوشحالیم که این آموزش برای شما مفید بوده.
واقعا روان توضیح دادین لذت بردم و با شوق کامل درس رو فهمیدم اونقدر جذاب بود که دلم میخواد برای همه توضیح بدم.خداقوت
ممنون که نظرتون رو با ما به اشتراک گذاشتید و خیلی خوشحالیم که این آموزش برای شما مفید بوده.
سپاس فراوان از شما
خیلی ساده و روان و با مثالی قابل درک کاری کردید که تونستم این موضوع رو در درجه ی اول خودم بفهمم و بتونم در کلاس راجع بهش ارائه بدم
متن های بالا رو هم با ذکر منبع (اسم سایتتون) برای استاد فرستادم
یک دنیا تشکر
سلام، خیلی خوشحالیم که این آمورش برای شما مفید بوده و تشکر بابت ذکر منبع.
سلام خسته نباشید در خصوص برنامه نویسی رویه ایی و منطقی ی توضیح وچکی میدهید و فرق اینها با شی گرایی چیست؟ ممنون
سلام، برنامهنویسی رویهای یا فانکشنال به این صورت هست که معمولا فرایندهایی که قراره انجام بشه در قالب توابع و به ترتیب و پشتسر هم نوشته و اجرا میشن، اما در برنامهنویسی شیگرا تعدادی کلاس تعریف میشه که هر کلاس یکسری ویژگی داره و اون اشیایی که از روی کلاسها ساخته میشن هم اون ویژگیها و خصوصیات کلاس رو دارند، یه سری مزایی در برنامهنویسی شیگرا داریم مثل ارثبری و… که اونها رو در برنامهنویسی رویهای نداریم دیگه، معمولا برای سیستمهای خیلی بزرگ برای اینکه بعدا امکان رفع مشکلات و توسعهی سیستم وجود داشته باشه از شیگرایی استفاده میشه.
بسیار روان و ساده این مفهوم رو برام جا انداختید.
خدا خیرتون بده
خیلی خوشحالیم که این آموزش برای شما مفید بوده حسام عزیز.
همین؟؟؟ با عنوانش سازگارنبود. خیلی خلاصه هست و مفاهیم دیگه پس چی؟ حداقل ۴ تا مفهوم اصلی
سلام.وقت بخیر
متدها و تعریف property و تفاوت ان در js با css و.. و تفاوت ان با اتربیوت ها هم اگر بشود توضیحی ارایه فرمایید.
با تشکر
خیلی مفید و خلاصه بود. تویحات مناسب و قابل فهمی داشت. ممنون از نویسنده عزیز و مدیر محترم وبسایت
خیلی خوشحالیم که این آموزش برای شما مفید بوده علیاصغر عزیز
خیلی خوب بود.اما جا داشت که به مفاهیم دیگر هم بپردازید.مثل پلی مارفیسم و ….
سلام، ممنون از اینکه دیدگاهتون رو با ما به اشتراک گذاشتید، سعی میکنیم مقاله رو به زودی بهروزرسانی کرده و این موارد رو هم داخلش درج کنیم.
توضیحاتتون عالی بود و واقعا ازش استفاده کردم. من خودم پایتون کارکردم و همیشه با شی گرایی مشکل داشتم و نمیدونستم اصلا چیه ولی خب با این مقاله فهمیدم که دنیا دست کیه و کی به کی و چی به چیه 🙂
سلام امید عزیز، خیلی خوشحالیم که این آموزش برای شما مفید بود و در درک مفهوم شیگرایی به شما کمک کرد.
خیلی مفید بود مچکرم
ممنون .
منظورتون از برنامه زیمنس همان زبان برنامه نویسی PLC است ؟ من به زبان برنامه ریزی plc مسلط هستم . دنبال برنامه ای میگردم که با این محیط های برنامه نویسی قابل مچ شدن باشد .
سلام، بله زبان برنامهنویسی زیمنس که برای PLC استفاده میشه، البته من خودم تخصص اصلیم آیتی هست و برنامهنویسی سختافزار کار نمیکنم، این زبان رو یکی از دوستان به عنوان زبان مناسب برای کار PLC به بنده معرفی کردند.
درود استاد عزیز.
بنده در حال فعالیت در رشته اتوماسیون صنعتی هستم . به عبارتی برنامه ریزی کنترل کننده ها به نام PLC . تا حدودی میتوان گفت مشابه برنامه نویسی کامپیوتر است . البته تا حدودی.
از خیلی دوستان سوال پرسیدم که بهترین زبان برای اینکه بتوانم برنامه ای بنویسم تا با این کنترلر ها ارتباط برقرار کنم چه هستش ؟
سلام، زبان siemens برای اینکار مناسبه و میتونید ازش استفاده کنید.
بسیار عالی حرف نداره واقعا لذت میبرم
خوشمان امد
خوب بود
خیلی ممنون آقای گوهری با حرفاتون بهم انگیزه دادید، پس به مسیرم ادامه میدم. باز هم بخاطر راهنمایی هاتون ممنون من سایتتون رو دنبال میکنم. اگر از مطالب آموزشی react هم بزارید که دیگه چه بهتر
خواهش میکنم، سعی میکنیم آموزشهای بیشتری در خصوص مفاهیم برنامهنویسی در سایت منتشر کنیم.
بله آقای گوهری من میخام برنامه نویسی react رو یاد بگیرم. در این زمینه در حال تحقیق هستم. در حال حاضر هم دارم ECS6 رو کار میکنیم.
اما هنوز نمیدونم که آیا react درآمد زا هست یا خیر؟
البته در آخر react native رو یاد میگیرم. در این زمینه اگه اطلاعاتی دارید ممنون میشم
خیلی عالیه که در حال یادگیری این زبانهای نسبتا جدید هستید، بله این زبانها با توجه یه جدید بودنشون اتفاقا در آینده میتونن بازار کار خیلی خوبی داشته باشن.
فارق از این موضوع اگر بتونید به صورت تخصصی روشون کار کنید و توی این زمینه حرفهای بشید، مطمئن باشید موقعیتهای شغلی خیلی خوبی داخل استارتاپهای بزرگ در انتظارتون هست، توصیه میکنم یادگیریشون رو ادامه بدید.
ضمن اینکه برای بهتر یاد گرفتنشون حتما سعی کنید در حین آموزش پروژههای کوچکی برای خودتون تعریف کنید و انجامشون بدید، اینکار خیلی به یادگیری و فهم بهتر برنامهنویسی کمک میکنه.
خیلی ممنون بخاطر توضیحاتتون برای بنده که مفید بود
خوشحالیم که این آموزش برای شما مفید بوده، اگر به برنامهنویسی علاقهمندید، میتونید مجموعه آموزشهای زیر رو هم مطالعه کنید:
https://www.hamyarit.com/programing/
خیلی روان و ساده توضیح دادید ممنون ، ولی ای کاش مفاهیم پیچیده تر oop را مثل : وراثت ، Encap توضیح میدادید sulation ، abstraction ، Polymorphism راهم
سلام امیر عزیز
سپاس از اینکه دیدگاهتون رو با ما در میون گذاشتید و ممنون از پیشنهاد خوبتون، البته موارد بالا تا حدودی به صورت انتزاعی در این آموزش بیان شده، اما بهزودی پست رو بهروزرسانی کرده و مفاهیم پیشرفتهتر رو هم بهش اضافه میکنیم.
سلام استاد، مقاله خوبتون رو مطالعه کردم و سوالی برام پیش اومد. الان میشه گفت شی گرایی همون تابع هست؟ چون تابع هم کاربردش همینه، یکبار مینویسیم و چندین بار استفاده میکنیم.
سلام دوست عزیز
خیر، نمیشه شئگرایی رو دقیقا برابر با استفاده از توابع در نظر گرفت، همونطوری که در آموزش هم اشاره کردیم کلاسها در برنامهنویسی شئگرا نقش یک قالب رو بازی میکنند، داخل این قالب میتونه شامل داده و تابع باشه، در حقیقت شما وقتی یک نمونه از روی کلاس درست میکنید یک شئ از اون کلاس ساختید و کل ویژگیهای کلاس رو درون خودش داره، اما چنین چیزی در تابع وجود نداره، تابع فقط ورودی میگیره و به تناسب خروجی رو تولید میکنه.
موفق باشید
ممنون ولی خیلی سخت و پیچیده توضیح دادید…
تمام سعی ما بر این بوده که تا حد ممکن این مبحث رو بسیار ساده شرح بدیم ولی خب بحث شئگرایی در کل کمی پیچیده و سنگین هست، مقاله رو کامل مطالعه بفرمایید هرجا سوال یا ابهامی بود بپرسید بنده سعی میکنم تا حد ممکن راهنماییتون کنم.