برنامه نویسی شی گرا یا Object-Oriented Programming که به اختصار به آن OOP میگویند، نوعی رویکرد برنامه نویسی است که در آن طراحی کردن یک نرم افزار، عوض توابع و منطق، حول دادهها و شیها (یا همان objectها) میگردد. شی گرایی به توسعه دهندگان این امکان را میدهد تا با تعریف آبجکتها یا شیهای مختلف، سیستمهای نرم افزاری را مدل سازی کنند. یک آبجکت (Object) میتواند از هر نوع دادهای تشکیل شده و شامل یک یا چند ویژگی باشد.
برنامه نویسی شی گرا یکی از معروفترین و پر استفاده ترین رویکرد است که در زمینههای مختلف از جمله نرم افزار کامپیوتری، نرم افزار موبایل، بازی و سیستمهای شبیه سازی مورد استفاده قرار میگیرد. در برنامه نویسی با رویکرد شی گرایی، ابتدا هدف به صورت مجموعهای از کلاس (Class)ها ساخته میشود و در ادامه ی روند توسعهی یک برنامه، آبجکتهایی از این کلاسها ساخته شده و تغییر پیدا میکنند و مورد استفاده قرار میگیرند. هر آبجکت از تعدادی خصوصیت یا Attribute ساخته شده است که میتوانند مقادیر و انواع مختلفی داشته باشند، مانند یک عدد، یک رشته و یا یک کلاس دیگر.
به عنوان مثال در یک بازی کامپیوتری، اسلحه یک کلاس است و فرضا AK-47 یک آبجکت که از این کلاس بوجود آمده و شامل خصوصیتهای ویژهی خود است، مثلا تعداد گلوله، تعداد شلیک در ثانیه، رنگ، وزن و خیلی از موارد دیگر. اصطلاحات و اصول مختلفی در برنامه نویسی با رویکرد شی گرایی وجود دارد که در ادامه به طور کامل با ذکر یک نمونه به این موارد میپردازیم.
ساختار برنامه نویسی شی گرا چیست؟
به طور کلی برنامه نویسی شی گرا از 4 بخش اصلی زیر تشکیل شده است:
- کلاس (Class): اولین بخش یک برنامه نویسی شی گرا، کلاس است. کلاس در واقع حکم کالبد یک شی (Object) را دارد. تمامی متدها، خصوصیتها، تغییرات قابل اعمال، دسترسیهایی به شی و... در بدنه ی یک کلاس تعریف میشوند.
- اشیاء (Objects) : شی ها یا آبجکتها در واقع نمونههایی (Instances) از کلاسها هستند که با دادهی خاصی ساخته شدهاند. آبجکتها میتوانند نمایانگر یک شی در دنیای واقعی باشند، مثل یک ماشین، یک اسلحه، یک سرور و یا یک شی خیالی باشند، مثلا یک سطر از جدول نمرات دانشجو.
- متد ها (Methods): متدها ( که گاهی به آن Function یا تابع هم میگویند) در واقع توابعی هستند که داخل کلاسها تعریف میشوند تا رفتار یک آبجکت را مشخص کنند. در برنامه نویسی شی گرا، برنامه نویسان، یک کلاس را کپسوله سازی (Encapsulation) میکنند تا از خارج از کلاس، امکان ایجاد تغییرات در داخل کلاس وجود نداشته باشد و در عوض، هر تغییری و هر درخواست، به وسیلهی متدها قابل انجام باشد. یک کلاس میتواند از هر تعداد و نوع متدی ساخته شود. به عنوان مثال کلاس انسان شامل متد های راه رفتن، حرف زدن، خوابیدن و.. است
- خصوصیات (Attributes): خصوصیات که به آن ویژگی هم میگویند در واقع متغیرهایی هستن که در بدنهی کلاس (Class) تعریف شده و خصوصیات یک مدل در قالب Attributeها پیاده سازی میشوند. به عنوان مثال کلاس انسان میتواند شامل خصوصیات قد، وزن، رنگ چشم، سن، جنسیت و... باشد.
برای اینکه مفهوم موارد ذکر شده را دقیق تر متوجه شوید، تصویر بالا را در نظر بگیرید. ماشین یک کلاس (Class) است و سمند و پراید، یک آبجکت (Object) و در واقع نمونههایی از کلاس ماشین هستند. حداکثر سرعت، اسب بخار، حجم موتور و رنگ، خصوصیات کلاس ماشین هستند و گاز دادن، ترمز کردن، کلاچ گرفتن و بوق زدن نیز متد های این کلاس میباشند.
اصول اصلی برنامه نویسی شی گرایی چیست؟
برنامه نویسی شی گرایی بر پایه ی اصول زیر هستند:
- کپسوله سازی (Encapsulation): اصل کپسوله سازی به این معنا است که اطلاعات و خصوصیات یک آبجکت، تنها از داخل آن آبجکت قابل تغییر باشد و هیچ آبجکتی در خارج نتواند تغییراتی در آبجکتهای دیگر بوجود بیاورد، تنها راه خواندن و تغییر دادن دادهها یا خصوصیات یک آبجکت، باید به وسیلهی متد های تعریف شده میسر باشد. هدف از این اصل جلوگیری از بوجود آمدن خطا های منطقی و تغییرات ناخواسته است.
- انتزاع (Abstraction): یکی از مفاهیم مهم در برنامه نویسی شی گرا، بحث انتزاع یا تجرید است. مفهوم انتزاع برای برنامه نویسان تازه وارد ممکن است کمی گنگ باشد. انتزاع در لغت به معنای امر جدا شده، گسسته و مجرد است. در برنامه نویسی، کلاس های Abstract برای ساخت یک اساس و مفهوم کلی ساخته میشوند، برخلاف مثالهایی از کلاسهایی که بالاتر ذکر کردیم، کلاس Abstract هیچ پیاده سازیای ندارد و تنها تعاریف در آنها قرار گرفتهاند. به عنوان مثال متد مربوط به گاز دادن در آن قرار دارد اما بدنهی متد خالی است. به همین دلیل در کد نویسی، نمونه سازی یا ساخت شی از کلاس های Abstract ممکن نیست و در عوض کلاسها میبایست از یک کلاس Abstract مشتق بشوند. در بخش بعدی مقاله، مفهوم انتزاع را در قالب مثال نیز نمایش خواهیم داد.
- ارث بری (Inheritance): کلاسها میتوانند از دیگر کلاسها، خصوصیات و متد ها را به ارث ببرند. به این ترتیب میتوان از کدها استفادهی مجدد کرد و علاوه بر صرف جویی در زبان، باعث خوانایی کد و کاهش پیچیدگی آن نیز میشود. کلاس های مشتق شده که به آنها Child Class میگویند، از کلاس والد یا Parent Class ارث بری میکنند. کلاس های مشتق شده همچنین میتوانند خصوصیات و متد های جدیدی نیز داشته باشند. گاهی اوقات به کلاس های والد، Supperclass و به کلاس های فرزند Subclass نیز میگویند.
- چند ریختی (Polymorphism): در بخش ارث بری گفتیم که کلاسها میتوانند از کلاس دیگری مشتق شوند و خصوصیات و متد های آنها را داشته باشند. اما گاهی اوقات میخواهیم این متد ها و خصوصیات، طور دیگری رفتار کنند یا مقادیر دیگری داشته باشند. قابلیت چند ریختی یا پلیمورفیسم به ما این اجازه را میدهد تا این تغییرات را بسادگی بوجود بیاوریم. بدین منظور در کلاس فرزند، متدی که قصد تغییر آن را داریم، مجددا مینویسیم و بدنهی آن متد را در کلاس فرزند به صورت دلخواه بازنویسی میکنیم. در زبانهای مختلف برنامه نویسی، راههای مختلفی برای اینکار وجود دارد.
مثالی جامع از یک برنامه ی OOP
در این قسمت یک مثال جامع از مباحثی که تاکنون یاد گرفته اید میآوریم تا کل مفاهیم شی گرایی برای شما واضح تر شود. تصویر زیر را به دقت نگاه کنید:
در تصویر بالا، کلاس وسایل نقلیه، یک کلاس انتزاعی یا Abstract است که تعاریف وسایل نقلیه در آن قرار گرفته است. مانند داشتن چرخ، امکان گاز دادن، بوق زدن و... اما هیچ پیاده سازی ای صورت نگرفته است. یعنی داشتن چرخ برای یک وسیلهی نقلیه تعریف شده اما چه تعداد چرخ داشته باشد مشخص نشده. کلاس ماشین، یک کلاس انتزاعی مشتق شده از کلاس وسایل نقلیه است که بعضی از موارد تعریف شده در کلاس وسایل نقلیه در آن پیاده سازی شده است.
به عنوان مثال تعداد چرخ ها برابر 4 است. دو کلاس سمند و پراید، کلاسهای مشتق شده از کلاس ماشین هستند که هرکدام ویژگیهای خاص خودشان را دارند. این دو کلاس دیگر انتزاعی نمیباشند و امکان ساخت شی یا آبجکت از آن ها وجود دارد. مثلا ساخت آبجکت (Object) از نوع سمند مثل سمند سورن، سمن ال اکس، یا ساخت آبجکت پراید مانند پراید 131، 141 و... کلاس (Class) پراید تاکسی یک کلاس است که از کلاس پراید ارث بری (Inheritance) کرده و رنگ این پراید نیز به زرد تغییر پیدا کرده است. کلاس سمند پلیس نیز یک کلاس دیگر است که از کلاس سمند ارث بری کرده است. سمند پلیس، متد بوق زدن را تغییر داده است، یعنی از خاصیت چند ریختی (Polymorphism) استفاده کرده. همچنین متد آژیر زدن را نیز اضافه کرده است.
مزایای برنامه نویسی شی گرا
برنامه نویسی با رویکرد شی گرایی مزایای زیادی دارد که در اینجا بعضی از مهمترین آنها را ذکر کرده ایم:
- قابلیت استفاده ی مجدد (Reusability): شاید بتوان گفت از مهم ترین ویژگی های برنامه نویسی شی گرا قابلیت استفادهی مجدد کدها از طریق ارث بری (Inheritance) است. در این صورت تیم های برنامه نویسی دیگر نیاز نیست یک کد را چندین بار تکرار کنند. همچنین برنامه نویسان میتوانند از کدهایی که شرکتها یا تیم های دیگر نوشته اند نیز استفاده کنند.
- ماژولار بودن (Modularity): ماژول در برنامه نویسی به قطعه کدهای جدا شدهای میگویند که کار خاصی را انجام میدهد، ماژولار بودن برنامه نویسی شی گرا یعنی کل منطق برنامه به بخشهای مختلفی تقسیم میشود که هرکدام از آنها توابع مخصوصی دارند و کار خود را انجام میدهند. این مفهوم از طریق کپسوله سازی (Encapsulation) کردن قابل پیاده سازی است و باعث میشود خطایابی و کار کردن به صورت تیمی راحت تر انجام شود.
- بروزرسانی و مقیاس پذیری آسان: برنامه نویسان به راحتی میتوانند توابعی که دوست دارند را به صورت کاملا مستقل در برنامه ی نوشته شده پیاده سازی کنند.
- افزایش امنیت (Security): استفاده از قابلیت کپسوله سازی (Encapsulation) و قواعد انتزاع، باعث میشود کدهای پیچیده از دید کاربران مخفی شوند، به این ترتیب نگهداری نرم افزارها راحتتر میشود و از پروتکلهای نرم افزاری نیز محافظت میشود. (به عنوان مثال محافظت از پروتکلهای اینترنتی)
- انعطاف پذیری (Flexibility): قابلیت چند ریختی (Polymorphism) باعث شده که یک تابع نوشته شده بتواند در کلاسهای فرزند بازنویسی شود، به این ترتیت میتوان گفت که برنامه نویسی با رویکرد شی گرایی از انعطاف پذیری بالایی برخوردار است.
- افزایش بهره وری (Productivity): برنامه نویسان میتوانند با سرعت بیشتری برنامههای جدیدی را از طریق کتابخانههای موجود بسازند. این ویژگی، از خصوصیت Reusability شی گرایی نشات میگیرد.
معایب برنامه نویسی شی گرایی:
تا اینجا از خوبی های برنامه نویسی شی گرا گفتیم. بد نیست کمی در مورد معایب این رویکرد نیز بدانیم.
- برنامههای نوشته شده با رویکرد شی گرایی، نسبت به بقیه ی رویکردها حجم بیشتری را اشغال میکنند.
- نوشتن برنامهی شی گرا نیاز به تخصص ویژه دارد و ساختن همچین برنامههایی تلاش بیشتری نسبت به بقیه ی رویکردها میخواهد.
- با توجه به حجم نسبتا بیشتر کدها نسبت به بقیه ی برنامهها، سرعت اجرا شدن و کامپایل شدن آنها در مقایسه با دیگر رویکردها آهستهتر است.
- برای بعضی از برنامهها، رویکرد شی گرایی (Object-Oriented) اصلا قابل استفاده نیست، یکی از این نوع برنامهها، موتورهای بازی سازی میباشد، در اکثر بازیها به جای استفاده از Object-Oriented از Data-Oriented استفاده میشود.
نمونه هایی از زبان های برنامه نویسی شی گرا
اولین زبان برنامه نویسی شی گرا، Simula نام داشت که در سال 1962 عرضه شد. امروزه زبان های شی گرایی بسیاری وجود دارد که در عرصه های مختلف مورد استفاده قرار میگیرد. با اینکه هدف این زبانها از شی گرایی یک مساله است اما رویکرد متفاوتی دارند. به عنوان مثال بعضی از زبانها به صورت خالص OOP میباشند، در این زبانها همه چیز به عنوان یک شی در نظر گرفته میشود. در حالی که بعضی از زبان ها عمدتا برای OOP ساخته شده اند و یا بعضی دیگر از زبانها به صورت غیر شی گرا هم وجود داشتن که OOP را هم وارد زبان خود کردهاند.
از نمونه زبانهایی که به طور خالص به صورت OOP هستند میتوان به موارد زیر اشاره کرد:
- Ruby
- Scala
- JADE
- Emerald
زبان های زیر به طور کلی برای OOP طراحی شدهاند (اما مانند زبانهای OOP خالص یا Pure OOP همه چیز را یک شی در نظر نمیگیرند):
- جاواجاوا چیست؟ تعریف، معنی و ویژگی های جاوا (java) از 0تا100جاوا یک زبان برنامه نویسی همه منظوره، مبتنی بر کلاس و شی گرا است که برای داشتن وابستگی های پیاده سازی کمتر طراحی شده است، زبان برنامه نویسی جاوا شبیه ++C است
- پایتون
- سی پلاس پلاسبرنامه نویسی سی پلاس پلاس چیست؟ مزایای برنامه نویسی C++؟برنامه نویسی سی پلاس پلاس چیست و چه کاربردی دارد؟ این صفحه عالی به بررسی مزایای برنامه نویسی C++ پرداخته و نمونه هایی از کدهای زبان برنامه نویسی ++C را آورده
نمونههای زیر هم زبانهایی هستند که OOP را وارد زبان خود کردهاند:
تفاوت برنامه نویسی شی گرا و برنامه نویسی ساخت یافته
یکی از سوالاتی که خیلی پرسیده میشود، تفاوت دو رویکرد ساخت یافته و شی گرایی است. به طور خلاصه برنامه نویسی ساخت یافته یک رویکرد Top Down یا بالا به پایین دارد، یعنی یک دستورالعمل کلی به طور کامل تعریف میشود و سپس در موارد دیگر مورد استفاده قرار میگیرد. در حالی که شی گرایی به صورت Bottom Up یا پایین به بالا است و هر آبجکت اطلاعات مورد نیازش را از کلاس بالاتر از خودش به ارث میبرد. همچنین برنامه های ساخت یافته، به توابع کوچکتر مستقل تقسیم میشوند در حالی که برنامههای شی گرا به آبجکتها تبدیل میشوند.
جمع بندی
رویکرد شی گرایی در برنامه نویسی یکی از معروف ترین و پرکاربرد ترین رویکردها در صنعت ساخت نرم افزار است. در این مقاله به طور کامل شی گرایی (Object-Oriented) را توضیح دادیم و مزایا و معایب این رویکرد را بررسی کردیم. همچنین با ذکر یک مثال سعی کردیم مفاهیم گفته شده را به صورت کاربردی توضیح دهیم.
برنامه نویسی شی گرا چیست؟
به طور خلاصه برنامه نویسی شی گرا (OOP)، رویکردی است که در آن توسعه دهندگان، دادهها و توابع را با یکدیگر در قالب کلاسها و آبجکتها ادغام میکنند، هر کلاس یک مدل از یک داده (مثلا ماشین) میباشد که دارای خصوصیات (مثل رنگ) و توابع (مثل فرمان دادن) است و هر آبجکت یا شیء یک نمونه از این کلاس است (مثل پژو) که در یک برنامه مورد استفاده قرار میگیرد.
کدام زبان ها شی گرا می باشند؟
زبانهای زیادی وجود دارد که یا به طور خالص OOP هستند و یا میتوان به وسیلهی آنها برنامهی شی گرا نوشت. مانند جاوا، پایتون، سی پلاس پلاس، سی شارپ، روبی و...
چهار اصل پایه ی برنامه نویسی شی گرایی چیست؟
انتزاع (Abstraction)
کپسوله سازی (Encapsulation)
ارث بری (Inheritance)
چند ریختی (Polymorphism)