شما کم و بیش اسم برنامه نویسی شی گرا به گوشتان خورده است، اما شاید اطلاعات کافی در مورد این داستان به شدت جالب اطلاعات کمی داشته باشید. تقریبا میتوان گت که اکثر زبانهای برنامه نویسی، دارای این قابلیت هستند. قبل از این که به شما این پارادایم به شدت کاربردی را معرفی کنم، میخواهم شما را با انواع پارادایمهای برنامه نویسی آشنا کنم و توضیح کوتاهی از هر کدام به شما بدهم.
اگر بخواهیم پارادایمهای برنامه نویسی را برایتان لیست کنیم، به انواع زیر تقسیم میشوند:
-
برنامه نویسی رویهای
برنامه نویسی رویهای یک الگوی برنامه نویسی است که بر اساس این ایده ساخته شده است که برنامهها دنبالهای از دستورالعملها هستند که باید اجرا شوند. این الگو به شدت بر تقسیم برنامهها به مجموعه دستورالعملها با نام رویه، تمرکز دارد. یک رویه میتواند دادههای محلی را که از خارج از محدوده رویه قابل دسترسی نیستند، ذخیره کند و همچنین میتواند به متغیرهای دادههای سراسری دسترسی داشته باشد و آنها را تغییر دهد.
اگر بخواهیم مثالی از زبان برنامه نویسی رویهای مثال بزنیم، میتوانیم به Fortran و ALGOL اشاره کرد.
-
برنامه نویسی تابعی
برنامه نویسی تابعی (FP) رویکردی برای توسعه نرم افزار است که از توابع خالص برای ایجاد نرم افزار قابل نگهداری استفاده می کند. به عبارت دیگر توسعه برنامه با استفاده از ترکیب توابع انجام میشود. برنامه نویسی تابعی از دادههای تغییر ناپذیر استفاده میکند و در آن State های مشترک وجود ندارد و این دقیقا بالعکس برنامه نویسی شی گرا است.
برنامه نویسی تابعی از محاسبه لامبدا توسط آلونزو چرچ در دهه ۱۹۳۰ تکامل یافته است. بسیاری از زبانهای برنامه نویسی از الگوی تابعی استفاده میکنند، مانند : C# ،Java، JavaScript، PHP و حتی Python.
-
اسکریپت نویسی
برای اجرای برنامههای بسیاری از زبانهای مختلف نظیر C++، کد ابتدا باید کامپایل شود و بعد به مرحله اجرا برود. اما بعضی از زبانها کد را کامپایل نمیکنند و آن را تفسیر (جرا) میکنند، به این زبانها، زبان مفسری گفته میشود مانند زبان جاوااسکریپت.
کلا اسکریپت تکه کدی است که مستقیم اجرا میشود و نیاز به کامپایل شدن ندارد. از دیگر زبانهای معروف اسکریپتی میتوان به پرل(Prel) اشاره کرد.
-
برنامه نویسی منطقی
این نوع از زبان های برنامه نویسی به برنامه نویسان این امکان را میدهند که عبارتهای اعلانی (Declarative) ایجاد کنند، سپس به ماشین اجازه میدهند درباره پیامدهای آن عبارتهای استدلال کنند. به صورت کلی میتوان گفت که این نوع از زبان های برنامه نویسی به رایانهها نمیگویند چگونه کاری را انجام دهند، بلکه محدودیتهایی را در مورد انجام وظایف، اعمال میکنند. برای مثال زبان برنامه نویسی پرولاگ (Prolog)، یک زبان برنامه نویسی منطقی است.
به عبارتی برنامه نویسی منطقی این یک الگوی برنامه نویسی است که از مدارهای منطقی و نه فقط توابع ریاضی برای کنترل نحوه بیان حقایق و قوانین استفاده می کند.
به جای یک جریان کنترل با ساختار دقیق که زمان اجرا و نحوه ارزیابی فراخوانی عملکردها یا سایر دستورالعمل ها را تعیین می کند ، قوانین منطقی برنامه به صورت جمله های منطقی یا قضایا نوشته می شوند.
برنامه نویسی شی گرا
خب حال که با انواع پارادایمهای برنامه نویسی آشنا شدید، نوبت به پارادایم برنامه نویسی شی گرایی است که یکی از بهترین و خفنترین پارادایمهای برنامه نویسی است.
اگر بخواهیم یک تعریف کلی از برنامه نویسی شی گرا داشته باشیم به صورت زیر میشود:
تعریف یک سری ویژگی یا رفتار و نسبت دادن اون ویژگی و رفتار ها به چیز های مختلف.
این نوع از زبان های برنامه نویسی، همه چیز را به عنوان گروهی از اشیاء میبینند که دارای دادههای داخلی و دسترسی خارجی به بخشهایی از آن دادهها است. هدف این نوع زبان برنامه نویسی تفکیک کدها به مجموعهای از اشیاء و ارائه خدماتی برای حل یک مشکل خاص به حساب میآید. یکی از اصول اصلی زبان برنامه نویسی شی گرا، کپسوله سازی (Encapsulation) به شمار میرود، یعنی هر چیزی که یک شی به آن نیاز دارد باید در داخل شی وجود داشته باشد. همچنین این نوع از زبان های برنامه نویسی قابلیت استفاده مجدد از طریق وراثت (Inheritance) و چندریختی یا همان پلی مورفیسم (Polymorphism) را دارند.
بگذارید شما را با چند مفهوم بالا که برایتان گفتم بیشتر آشنا کنم.
برنامه نویسی شی گرا کپسوله سازی (Encapsulation)
کپسولهسازی بدین معنا است که تمامی اطلاعات مهم، درون شی نگهداری میشوند و نمیتوان به آنها از بیرون کلاس دسترسی داشت. به عبارتی، با ساخت یک شی به عنوان نمونهای از کلاس، مشخصهها و متدهای کپسولهسازی شده از بیرون کلاس قابل دسترسی و ویرایش نیستند و فقط میتوان به دادههایی از کلاس دسترسی داشت که برنامه نویس آنها را بهصورت عمومی در اختیار سایر کاربران قرار داده است. این اصل شی گرایی باعث ایجاد امنیت بیشتر برای کدهای برنامه میشود.
خب طبق این مفهوم ما سه حالت برای کلاسهای تعریف شده میتوانیم داشته باشیم که عبارتند از : کلاسهای خصوصی(Private)، کلاسهای محافظت شده(Protected) و کلاسهای عمومی(Public).
درک این موضوع احتمالا برای شما سخت باشد، به همین دلیل میخواهم آن را با ذکر مثالی برای شما راحت کنم. فرض کنید سوار بر خودرویتان در حال رانندگی در بزرگ راه هستید و میخواهید به فرعی بروید، در این زمان شما راهنما خواهید زد تا دیگر رانندگان مطلع شوند. راهنما زدن یک عملیات عمومی است که همه رانندگان آن را میبینند اما اطلاعاتی مانند دمای موتور خودروی شما خصوصی است و فقط شما قادر به اطلاع از آن هستید. به این مفهوم کپسوله سازی میگویند.
برنامه نویسی شی گرا وراثت (Inheritance)
اصل وراثت در شی گرایی این اجازه را به برنامه نویس میدهد تا در کلاس جدیدی، از متدها و مشخصههای سایر کلاسها استفاده کند. به عبارتی، کلاسی را میتوان به عنوان کلاس فرزند تعریف کرد که مشخصهها و متدهای کلاس دیگری (کلاس والد) را به ارث ببرد. بدینترتیب، میتوان از یک کلاس به دفعات در برنامه استفاده کرد که همین امر باعث میشود از نوشتن قطعه کدهای زیاد و تکراری جلوگیری شود. همچنین، میتوان در کلاس فرزند، مشخصهها و متدهای جدیدی را ایجاد کرد که در کلاس والد وجود ندارند و فقط مختص کلاس فرزند هستند.
خب اجازه دهید که این موضوع را هم با ذکر مثالی برای شما راحت کنم. کلمه وسیله نقلیه را در نظر بگیرید، وسیله نقلیه شامل وسایل نقلیه دریایی، زمینی و هوایی میشود. خب در اینجا ما با مفهوم عبارت پدر که عنوان وسیله نقلیه دارد روبرو میشویم که یک سری ویژگیهای مشترک دارد. یک مقداری اگر این موضوع را گسترش بدهیم، وسایل نقلیه زمینی را باید در نظر بگیریم که شامل وسایل نقلیه چهار چرخ، سه چرخ و دو چرخ میشود که باز هم ویژگیهای مشترکی در والد خود دارند. و این موضوع همان وراثت است.
برنامه نویسی شی گرا چندریختی یا همان پلی مورفیسم (Polymorphism)
بر اساس اصل وراثت، کلاس فرزند میتواند متدها و مشخصههای کلاس والد را به ارث ببرد. با این حال، در برنامه نویسی شی گرا، اصلی با عنوان اصل چندریختی وجود دارد که بر اساس آن، میتوان در کلاس فرزند، متدی همنام با متد کلاس والد تعریف کرد، به طوری که وظیفه این متد، با وظیفه متد کلاس وارد متفاوت باشد. به عبارتی، اصل چندریختی این امکان را برای کاربر ایجاد میکند تا کلاس فرزندی مشابه با کلاس والد ایجاد شود، به نحوی که عملکرد متدهای آن با عملکرد متدهای کلاس والدش متفاوت باشد. در مثالی که برای اصل ارثبری ارائه شد، وسایل نقلیه میتوانند شامل دو دسته وسایل نقلیه چرخدار و وسایل نقلیه غیرچرخدار باشد. چنانچه کلاس والد وسایل نقلیه، متدی با نام «روشن کردن وسیله نقلیه» داشته باشد و کلاسهای فرزند از این کلاس والد ارثبری کنند، تمامی کلاسهای فرزند نیز متد «روشن کردن وسیله نقلیه» را به ارث میبرند؛ اما میتوان نحوه روشن کردن وسیله نقلیه در هر یک از کلاسهای فرزند را به شیوهای متفاوت تعریف کرد.
مزایای رویکرد شی گرایی
رویکرد شی گرایی در بسیاری از جهات بهتر از سایر رویکردها عمل میکند و دارای مزایایی است که در ادامه شما را با آنها آشنا خواهیم کرد:
-
ماژولار بودن (Modularity)
این ویژگی باعث میشود که بتوان برنامه را به قسمتهای کوچکی تقسیم کرد که هم توسعه آن توسط چند نفر امکان پذیر باشد و هم خطایابی برنامه آسانتر شود. این ویژگی به لطف اصل کپسوله سازی ممکن شده است.
-
قابلیت استفاده مجدد از کدها
با استفاده از اصل وراثت این امکان به وجود آمده که از تکرار کدها کاهش پیدا کند و کدهای تکراری حذف شوند.
-
بهرهوری بیشتر
دو ویژگی وراثت و کپسوله سازی باعث این شده که برنامه نویسان از نوشتن کدهای تکراری جلوگیری کنند و راحتتر در برنامه خطایابی کنند که همین دو موضوع باعث ایجاد توسعه سریعتر شده است.
-
بهروزرسانی و مقیاس پذیری آسان
با استفاده از سه اصل شی گرایی، یعنی کپسوله سازی، ارث بری و چند ریختی، به راحتی میتوان برنامه را به روز کرد و هر بخش از برنامه را جداگانه گسترش داد.
-
افزایش سطح امنیت برنامه نویسی
با استفاده از اصل کپسوله سازی میتوان کدهای برنامه را از در دسترس بودن کاربران خارج کرد.
-
انعطاف پذیری بالا
با استفاده از اصل چند ریختی میتوان یک متد با نام مشابه را بر اساس نیاز کاربر طوری طراحی کرد که عملکرد متفاوتی داشته باشد.
معایب رویکرد شی گرایی
همانطور که این رویکرد مزایا دارد، قطعا معایبی را هم همراه خواهد داشت که در ادامه به بررسی آنها خواهیم پرداخت:
-
زمان اجرای بالا
میزان حجم کدهای نوشته شده در رویکرد شی گرایی بیشتر از سایر رویکردهای برنامه نویسی دیگر است و همین امر باعث شده که برنامههای نوشته شده با این رویکرد به زمان بیشتری برای اجرا نیاز داشته باشند.
-
تعداد کم زبانهای این رویکرد
فقط چند مورد از زبانهای برنامه نویسی این قابلیت را دارا میباشند، مانند پایتون، جاوا، جاوااسکریپت، سیپلاسپلاس، سیشارپ.
-
محدود بودن
نمیتوان از این رویکرد در تمام پروژههای نرمافزاری استفاده کرد.
-
زمانبر بودن پروژه
به دلیل این که این رویکرد بر پایه مفهوم شی شکل گرفته است پس زمان زیادی را باید به بررسی و تشخیص اشیا اختصاص داد.
زبان برنامه نویسی جاوا (Java)، ویژوال بیسیک (Visual Basic)، روبی(Ruby)، پایتون، جاوااسکریپت(JavaScript)، C++، C# نمونههایی از این نوع زبان برنامه نویسی هستند.