شی گرایی در برنامه نویسی چیست؟ [هر آنچه باید در مورد شی گرایی بدانید]
در دنیای امروز استفاده از برنامههای کامپیوتری چنان رایج شده است که دیگر زندگی را نمیتوان بدون آنها تصور کرد. برای گفتگو با رایانهها و بیان دستورات مختلفی که لازم است اجرا کنند، باید با زبان های برنامهنویسی با آنها ارتباط برقرار کرد. نوشتن این کد و دستورها به نوعی یافتن روشی برای حل مسائل از طریق رایانه است. در این مقاله قرار است به یکی از پارادایمهای مهم در زبان برنامهنویسی بپردازیم و به این پرسش که شی گرایی چیست پاسخ خواهیم داد.
برنامهنویسی چیست؟
در سوال برنامه نویسی چیست باید بگوییم حتماً میدانید که کامپیوترها تنها زبان متشکل از صفر و یک را برای دریافت دادهها و فرمانهای مختلف متوجه میشوند. برای اینکه بتوان برای انجام یک برنامه رایانه را برنامهریزی کرد، باید با استفاده از کدهای مختلف دستورات و دادهها را در اختیار آن قرار داد.
در صورتی که برای ساختن یک برنامه، صفحه وب و ... مسیر و طبقهبندی دادهها را برنامهریزی کنید و کدهای مربوط به آن را نوشته به کامپیوتر دهید تا پردازش کند، شما برنامهنویسی انجام دادهاید.
زبانهای برنامهنویسی
به زبانی که برای برقراری ارتباط با کامپیوتر از آن استفاده میشود و دارای الگوریتمها و ساختار مخصوص به خود است زبان برنامهنویسی گفته میشود. زبانهای برنامهنویسی را میتوان از جنبههای مختلف طبقهبندی کرد.
زبانهای برنامهنویسی بر اساس نزدیکی به زبان ماشین
- زبانهای برنامهنویسی سطح پایین
- زبانهای برنامهنویسی سطح میانی
- زبانهای برنامهنویسی سطح بالا
زبانهای برنامهنویسی بر اساس نوع ترجمه در رایانه
- مفسری
- کامپایلری
زبانهای برنامهنویسی بر اساس پلتفرم و بستر مورد استفاده
- زبانهای برنامهنویسی تحت دسکتاپ
- زبانهای برنامهنویسی تحت وب
زبانهای برنامهنویسی بر اساس رابط برنامهنویسی
- زبانهای مبتنی بر متن
- زبانهای مبتنی بر گرافیک (ویژوال)
زبانهای برنامهنویسی بر اساس روشهای برنامهنویسی
- برنامهنویسی دستوری (Imperative programming)
- برنامهنویسی تابعی (Functional programming)
- برنامهنویسی اعلانی (Declarative programming)
- برنامهنویسی رویهای (Procedural programming)
- برنامهنویسی شی گرایی (Object-oriented programming)
در این دستهبندی زبانهای برنامهنویسی به برنامهنویسی شی گرا اشاره شد که در این مقاله موضوع موردنظر ما هم بررسی برنامهنویسی شی گراست که در ادامه به طور خلاصه به آن و پاسخ به پرسش شی گرایی چیست خواهیم پرداخت.
آشنایی با بهترین زبان های برنامه نویسی دنیا
برنامهنویسی رویهای چگونه است؟
در گذشته و در ابتدای مسیر برنامهنویسی از روش برنامهنویسی ساختاریافته یا رویهای استفاده میشده است. در این روش برنامهنویسی برنامهها پشتسرهم از ابتدا به انتها اجرا میشدند. این روش در برنامهنویسی C و یا COBOL به کار برده میشد. این روش به دلیل نواقص و نارساییهایی که داشت با روشهای جدیدتر جایگزین شده است.
برنامهنویسی شی گرایی چیست؟
برنامهنویسی شی گرایی (Object Oriented Programming) که به آن بهاختصار OOP هم اطلاق میشود، شیوهای از برنامهنویسی و مدل کردن است که توابع و متغیرهای مختلف کلاسها را میسازند و کلاسها هم اشیا را تشکیل میدهند. دادهها و پردازش آنها که در قالب اشیا بیان میشوند امکان دسترسی و کنترل بهتری را برای برنامهنویسان فراهم میکنند تا از پیچیدگیهای ایجادشده کم کنند.
زبانهای برنامهنویسی غیر شی گرایی و شی گرایی چیست؟
شی گرایی بودن یا نبودن یکی از راههایی است که با استفاده از آن میتوانیم زبانهای برنامهنویسی را دستهبندی کنیم. زبانهای برنامهنویسی غیر شی گرا شامل زبانهای قدیمی برنامهنویسی مانند C و یا COBOL است و اما این سؤال که زبانهای معروف شی گرایی چیست؟
- زبان برنامهنویسی جاوا
- زبان برنامهنویسی جاوا اسکریپت
- زبان برنامهنویسی پایتون
- زبان برنامهنویسی ++ C
- زبان برنامهنویسی سی شارپ
- زبان برنامهنویسی Ruby
- زبان برنامهنویسی Scala
- زبان برنامهنویسی PHP
از جمله زبانهایی هستند که بر طبق مدل شی گرایی هستند.
مفاهیم اساسی در برنامهنویسی شی گرایی چیست؟
برای اینکه بهتر بدانیم شی گرایی چیست باید با مفاهیم بنیادین و اساسی آن آشنا شویم. در ادامه به توضیح مفاهیم شی، صفت، روش و کلاس در برنامهنویسی شی گرایی میپردازیم.
شی (Object) در برنامهنویسی شی گرایی
مفهومی کلی است که برای درک بهتر به آن هویت و موجودیت داده میشود و برای آن ویژگی و رفتار متصور میشویم.
صفت (property) در برنامهنویسی شی گرایی
از آنجایی که هر شی دارای ویژگیها و مشخصههایی است، پس برای بیان و توصیف آن مشخصات از صفت استفاده میکنیم.
روش (Method) در برنامهنویسی شی گرایی
اشیا با داشتن صفات مختلف میتوانند در برابر عوامل بیرونی از خود واکنش نشان دهند. به این رفتارهایی که از اشیا میتوانیم ببینیم روش، شیوه و یا متد گفته میشود.
کلاس (Class) در برنامهنویسی شی گرایی
ما میتوانیم بر اساس خصوصیات مختلفی اشیا را دستهبندی کنیم. هر مجموعهای که از اشیا ایجاد میکنیم یک کلاس را تشکیل میدهد.
برای مثال میتوانیم اینچنین بگوییم که یک خودرو یک شی فرض شود. رنگ و مشخصههای ظاهری آن صفات این خودرو هستند. هر خودرویی هم در شرایط مختلف ویژگیهایی از خود نشان میدهد مثلاً در هنگام پیچیدن با سرعت بالا خودروهای مختلف روش و رفتار خاص خود را بروز میدهند. خودروها را میتوان در کلاسهای متعددی دستهبندی کنیم.
اصول اساسی برای شی گرایی چیست؟
در برنامهنویسی شی گرایی اشیا، دادهها و رفتارهای مرتبط با آن را در یک مجموعه نگهداری میکنند. ارتباط این دادهها میتواند به صورتهای مختلفی تنظیم شود. در ادامه مبحث شی گرایی چیست به این اصول پایهای میرسیم که هر یک را بهصورت مختصر برای شما تعریف میکنیم.
انتزاع (Abstraction)
بر اساس این اصل، اشیا مکانیسمهایی که در داخل مجموعه صورت میگیرد تا از اشیا استفاده شود را پنهان میکند. در این حالت ما میتوانیم از آن مجموعه یک دید کلی داشته باشیم و ضرورتی برای آگاهی از همه جزئیات سازنده آن نداریم. این ویژگی به توسعهدهندگان برنامه این اجازه را میدهد تا به مرور زمان بتوانند در این مجموعه تغییرات لازم را لحاظ کنند.
کپسولهسازی یا محصورسازی (Encapsulation)
همانطور که در اصل انتزاع به آن اشاره کردیم، میتوانیم اشیا و دادهها را در یک کلاس یا مجموعه محصور کنیم تا هنگام استفاده از آن کاری به جزئیات تشکیلدهنده فرایندهای آن نداشته باشیم. حال اگر برای این کپسولی که گفته شد میزان دسترسی را هم مشخص کنیم، از اصل کپسولهسازی بهره گرفتهایم.
وراثتپذیری (Inheritance)
در مواردی که اشیا دارای شباهت هستند به کار میرود. اشیایی که دارای شباهت هستند را در کلاسهایی قرار داده و کلاسهای دیگر را بر اساس همین ویژگی از آن مشتق میکنند. این هم یکی از اصول اساسی در برنامهنویسی شی گرایی است که میتواند دادهها و اشیا را با قاعده وراثتپذیری مرتب کند. همچنین قابلیت دسترسی و اضافه کردن ویژگیهای جدید را بدون تکرار موارد مشابه در کلاسهای مشتقشده از کلاس اصلی، میتوان با استفاده از وراثتپذیری انجام داد.
چندریختی (Polymorphism)
در مواردی که از رفتارهای متفاوتی در شرایط مختلف تعریف شود ما در شی گرایی پلیمورفیسم یا شکلی را مشاهده خواهیم کرد که دارای کاربردهای بسیاری در زبانهای برنامهنویسی شی گرایی است.
مزایای برنامهنویسی شی گرایی چیست؟
حالا که با مفاهیم و اصولی اساسی در مبحث شی گرایی چیست آشنا شدیم، میتوانیم به بررسی مزایا و معایب این پارادایم بپردازیم. مزایای برنامهنویسی شی گرایی به طور خلاصه شامل موارد زیر است:
- امنیت برنامه در برنامهنویسی شی گرا به مراتب بالاتر از غیر شی گراست.
- با توجه به اصول اساسی که گفته شد، در برنامهنویسی شی گرایی برنامهها را بهتر میتوان تحلیل کرد و امکان دستیابی و اعمال تغییرات بر روی کدها سادهتر است.
- با این روش دیگر نیازی به نوشتن کدهای تکراری نیست.
- در منابع و هزینههای مربوط به نگهداری صرفهجویی به عمل میآید.
- امکان استفاده مجدد از آن در برنامهنویسی شی گرایی وجود دارد.
معایب برنامهنویسی شی گرایی چیست؟
هر روشی میتواند دارای معایبی باشد که با توجه به این ایرادات افراد مختلف از استفاده از آن پرهیز کنند یا با آن مشکل داشته باشند. از جمله معایبی که برای برنامهنویسی شی گرایی گفته میشود میتوان به موارد زیر اشاره کرد:
- درک کردن مفاهیم مربوط به شی و کلاس و ارتباطات آنها در چارچوب چهار اصل بیانشده برای بسیاری از افراد دشوار بوده و نمیتوانند با شی گرایی بهخوبی ارتباط برقرار کنند.
- در برنامهنویسی رویهای یا خطی زمان کامپایل کردن کوتاه است اما در برنامهنویسی شی گرا چون پیچیدگیهای مختلفی در آن وجود دارد، پس زمان لازم برای کامپایل کردن هم به مراتب بیشتر است. این موضوع میتواند یکی از عیبهایی باشد که برای برنامهنویسی شی گرا در نظر گرفته میشود.
ایرادات برنامهنویسی شی گرایی چیست؟
ممکن است که شما سالها از برنامهنویسی شی گرا استفاده کنید و به هیچیک از نارساییها و ایرادات آن برخورد نکنید. اما این موضوع ایرادات وارد بر برنامهنویسی شی گرا را منکر نخواهد نشد. در ادامه به ایرادات و مسائلی که به برنامهنویسی شی گرا وارد شده است خواهیم پرداخت.
ایرادات اصل وراثتپذیری
مسئله موز میمون جنگل
حتماً از دیدن این عنوان شگفتزده شدید! اما این مثالی برای بیان سادهتر یکی از مشکلات اصل وراثتپذیری در برنامهنویسی شی گراست. در صورتی که شما بخواهید از یک شی یا کلاس در شی گرایی استفاده کنید باید تمام اشیا و کلاسهای مرتبط با آن را در اختیار داشته باشید تا بتوانید از آن در یک پروژه جدید استفاده کنید.
این موضوع به دلیل ساختار کلاسبندیهای بسیار تودرتویی خواهد بود که با اصل وراثتپذیری آن را ایجاد کردهاید. برای فهم بهتر این موضوع میتوان شی را میوه موز در نظر گرفت که وقتی بخواهید آن را بردارید، باید میمون و درخت و جنگلی که میمون در آن حضور دارد را هم همراه داشته باشید.
برای برطرف کردن این ایراد در اصل وراثتپذیری میتوانید کلاسبندی و سلسلهمراتب عمیق و بسیار درهمآمیخته را کمتر استفاده کنید تا در صورتی که بخواهید از یک شی یا کلاس بهره ببرید، نیاز به داشتن متعلقات بسیار زیاد به همراه آن نباشید.
مسئله الماس در شی گرایی
مسئله الماس یعنی وقتیکه یک کلاس مشخص از دو کلاس مختلف مشتق شده و وراثت بپذیرد، دستور کدامیک را اجرا کند؟ این مسئله یکی از ایراداتی است که به برنامهنویسی شی گرا وارد است. برای حل مسئله الماس همراهی نداریم جز اینکه در هنگام تعریف وراثتپذیری کلاسها، یک کلاس خاص را از دو کلاس والد مشتق نکنیم تا در اجرای دستور آنها دچار سردرگمی نشویم.
این موضوع چنان میتواند باعث ایجاد ایراد در برنامهنویسی شود که بسیاری از زبانهای برنامهنویسی خود جلوی انجام چنین مشتقپذیری معیوبی را نمیدهند.
مسئله پایه شکننده
یکی دیگر از ایراداتی که بر برنامهنویسی شی گرا وارد شده است این مسئله است که در صورتی که کوچکترین تغییری در کلاسهای والد صورت بگیرد، کل برنامه را تحتتأثیر قرار داده و میتواند عملکرد آن را مختل کند. با استفاده از Contain و Delegate میتوان تا حدودی این مسئله را حل کرد.
ایراد اصل کپسولهسازی
اصل کپسولهسازی بر دسترسی به هر مجموعه اشاره دارد. در این اصل توابع بهجای انتقال اشیا اشارهگری به اشیا را منتقل میکنند و با این کار دسترسی به خود شی را کنترل میکنند. برای ارجاع یا اشارهگری به اشیا باید کلون سازی از آنها صورت بگیرد و این شبیهسازی از اشیا همیشه ممکن نیست و مشکلاتی در پی دارد.
به دلیل کاهش امنیت اشیا در مسئله ارجاع، زبانهای برنامهنویسی شی گرا کمکم از کپسولهسازی فاصله میگیرند.
ایراد اصل پلیمورفیسم
استفاده از پلیمورفیسم برای تعریف متد برای کلاسها و زیر کلاسهای مختلف راهی مناسب و کاربردی است. اما ایرادی که بدان وارد میشود این است که استفاده از پلیمورفیسم مبتنی بر اینترفیس به مراتب از پلیمورفیسم شی گرا مناسبتر و سادهتر است.
کلام پایانی
در این مقاله سعی کردیم تا بحث مفصل پیرامون این پرسش که شی گرایی چیست را به طور خلاصه برای شما توضیح دهیم. همانطور که در بالا در مورد مفاهیم، اصلها و مزایای برنامهنویسی شی گرا گفته شد، این روش میتواند با داشتن قابلیتهای عالی در حل مسائل و برنامهنویسی در حیطههای مختلف به کار رود. امروزه هم استفاده از زبانهای برنامهنویسی مبتنی بر شی گرایی بسیار رایج است.
همانند همه روشها و فناوریهای ساخته بشر، برنامهنویسی هم دستخوش تغییرات و تکامل شده است و قطار پیشرفت و تکامل در آن از ایستگاههای مختلفی عبور میکند. از اینرو زبانهای برنامهنویسی هر روز با برطرفکردن نواقص و کاستیهای زبانهای پیشین، در جهت بهتر شدن حرکت میکنند.
برنامهنویسی شی گرا هم از این قاعده مستثنی نیست و با توجه به معایب و ایراداتی که از آن در بالا گفته شد، نیازمند بهبود و تغییرات است. برنامهنویسی کمکم از شی گرایی به سوی تابع گرا (فانکشنال) در حال گذار است. در هر حال علم و مهارت برنامهنویسی روزبهروز اهمیت بیشتری پیدا میکند و یادگیری آن میتواند پنجرهای بهسوی جهان شگفتانگیز دیگری باشد.