برنامه نویسی شی گرا
برنامهنویسی شیگرا (Object-Oriented Programming یا OOP) یکی از محبوبترین پارادایمهای برنامهنویسی است که بر پایه مفاهیمی مانند شیء (Object) و کلاس (Class) طراحی شده است. این سبک برنامهنویسی با هدف برطرف کردن محدودیتها و مشکلات موجود در برنامهنویسی رویهای (Procedural Programming) به وجود آمد.
بسیاری از دانشآموزان و دانشجویان، مسیر یادگیری برنامهنویسی خود را با زبانهای رویهای مانند زبان C آغاز میکنند. در این روش، برنامه از مجموعهای از توابع و دادهها تشکیل میشود که توابع مختلف روی دادهها عملیات انجام میدهند.
با وجود سادگی، برنامهنویسی رویهای در توسعه نرمافزارهای بزرگ و پیچیده با چالشهای متعددی مواجه بود. مدیریت پروژههای گسترده، نگهداری کدها و محافظت از دادهها در این سبک دشوار میشد و کوچکترین تغییر در بخشهای مختلف برنامه میتوانست مشکلات غیرمنتظرهای ایجاد کند.
برنامهنویسی شیگرا برای حل این مشکلات معرفی شد. در این روش، اجزای برنامه بهصورت اشیاء (Objects) مدلسازی میشوند. هر شیء میتواند دادههای مخصوص به خود را داشته باشد و همچنین مجموعهای از متدها (Methods) را برای انجام عملیات روی آن دادهها ارائه دهد.
یکی از مهمترین مزایای OOP، محافظت بهتر از دادهها است. در این رویکرد، دسترسی به دادهها محدود میشود و تنها متدهای مشخصی که متعلق به همان شیء هستند، اجازه تغییر یا مدیریت دادهها را دارند. این ویژگی باعث افزایش امنیت، خوانایی و قابلیت نگهداری کد میشود.

در این مقاله، ابتدا با مفهوم برنامهنویسی شیگرا آشنا خواهید شد و سپس مفاهیم پایهای آن مانند کلاسها (Classes) و اشیاء (Objects) را یاد میگیرید. همچنین چهار اصل مهم برنامهنویسی شیگرا شامل:
- کپسولهسازی (Encapsulation)
- وراثت (Inheritance)
- انتزاع (Abstraction)
- چندریختی (Polymorphism)
را بهصورت کامل بررسی خواهیم کرد.

نیاز به رویکرد برنامه نویسی شی گرا
در رویکرد رایج برنامهنویسی رویهای (Procedural Programming)، محدودیتهای قابلتوجهی وجود داشت. یکی از مهمترین مشکلات این سبک برنامهنویسی، دشوار بودن محافظت از دادههای برنامه در برابر تغییرات ناخواسته بود.
در ساختار سنتی برنامهنویسی رویهای، برنامه از مجموعهای از متغیرها و توابع تشکیل میشود؛ بهطوریکه توابع مستقیماً روی دادهها عملیات انجام میدهند.
در بسیاری از برنامههای رویهای، دادهها بهصورت سراسری (Global) تعریف میشوند. این موضوع باعث میشود هر تابعی بتواند به این دادهها دسترسی داشته باشد و آنها را تغییر دهد. در نتیجه، کنترل و محافظت از دادهها در برابر تغییرات غیرعمدی بسیار دشوار خواهد بود.
چنین تغییراتی در دادههای سراسری میتواند عملکرد سایر توابعی را که از همان دادهها استفاده میکنند، تحت تأثیر قرار دهد و باعث بروز خطاها و مشکلات پیشبینینشده در برنامه شود.

رویکرد برنامه نویسی شی گرا (OOP) راه حل بسیاری را برای رفع محدودیت های برنامه نویسی procedural ارائه کرد.
در رویکرد برنامه نویسی OOP، کنترل دسترسی به داده ها و همچنین مدل سازی موضوعات دنیای واقعی در سبک برنامهنویسی OOP بسیار سادهتر شد.
برنامه نویسی شی گرا چیست؟
برنامه نویسی شی گرا یک رویکرد در توسعه نرم افزار کاربردی است که بر اساس مفهوم بنیادی کلاس و شی است.
در متدولوژی OOP، تمام اجزای برنامه به صورت اشیا در کد برنامه نمایش داده می شوند. اشیاء به عنوان کلاس در کد برنامه تعریف شده اند.
به عنوان مثال، دانشجو(student)، مربی(instructor)، درس(course)، بخش(department)، نمونه های کمی از آبجکت های مورد استفاده نرم افزار برای کالج هستند.

در برنامه OOP، گروهی از متغیرهای مرتبط با object و method های کار بر روی دادهها را به عنوان یک واحد ترکیب میکنیم. یک شی کوچکترین جزء در برنامه OOP است. هر شی دارای برخی property (ویژگی) و Method (رفتار) است.
Object در برنامه نویسی شی گرا
شی(Object) یک موجودیت در دنیای واقعی است که باید در برنامه نرم افزاری نمایش داده شود. دنیای اطراف ما پر از اشیایی است مانند خودکار، چراغ، خانه، ماشین، گربه، سگ، همگی نمونه هایی از آبجکت هستند.
با این حال، از دیدگاه توسعه نرم افزار، یک شی می تواند موجودیت زنده، جسم فیزیکی یا حتی مفهوم تجاری مانند حساب بانکی باشد.
هر شی دارای identity (شناسه) و state (وضعیت) منحصر به فرد است. وضعیت یک شی توسط متغیرهای عضو آن تعریف می شود. رفتار شی توسط متدهای عضو آن تعریف می شود.

آبجکت ها موجودیت های زمان اجرا هستند که در طول اجرای برنامه ایجاد می شوند. برای ایجاد یک آبجکت ، برای تخصیص حافظه، منابع (resource)مورد نیاز است.
برنامه نویس ابتدا باید آبجکت را در قالب یک کلاس تعریف کند. یک کلاس به عنوان یک template برای آبجکت کار می کند.
به عنوان مثال، میتوانیم به تعداد آبجکت دانشآموز از کلاس دانشجویی که در کد برنامه تعریف شدهاند، نمونهسازی کنیم (ایجاد کنیم).
مثالی از object در برنامه نویسی شی گرا
برنامه OOP ممکن است دارای آبجکت باشد. هر شی را می توان به طور منحصر به فرد با شناسه (identity)و وضعیت (state) خود شناسایی کرد.
متدهای اشیاء تمام عملیاتی که آن شی می تواند انجام دهد را توصیف می کنند.

وضعیت شی (Object State)
هر آبجکت دارای State است که با property آن تعریف می شود(داده). property آبجکت با داده ها نمایش داده می شوند (که به عنوان متغیر نیز نامیده می شود).
State یک آبجکت با property های آن توصیف می شود. هر آبجکت مجموعه ای از داده های خاص خود را دارد.
رفتار شی (Object Behavior)
هر آبجکت نیز رفتاری از خود نشان می دهد. رفتار شی به وسیله متد (method) تعریف می شود.
رفتار آبجکت توسط متدها نشان داده می شود. برنامه نویس می تواند تعدادی متد را در کلاس تعریف کند.
شناسه منحصر به فرد آبجکت (Object Unique Identity)
هر آبجکت در برنامه OOP یک شناسه منحصر به فرد دارد. برنامه نویس می تواند property ها و method های آبجکت را مطابق با نیازهای برنامه تغییر دهد.
به عنوان مثال، اجازه دهید مثالی از یک آبجکت اتومبیل را در نظر بگیریم. هر خودرو را می توان به صورت جداگانه با شماره ثبت منحصر به فرد خود، شماره شاسی و مشخصات مالک آن شناسایی کرد.
Propertyها و method های آبجکت
Propertyها و method ها ، کامپوننت های ضروری آبجکت هستند. Propertyهای شی ، با متغیر نشان داده می شود. در حالی که رفتار آبجکت ، با method تعریف می شود.

کلاس در برنامه نویسی شی گرا
یک کلاس به عنوان طرحی اولیه (blueprint) برای ایجاد یک object تعریف می شود. یک کلاس همچنین می تواند به صورت متناوب به عنوان یک template که یک شی را توصیف می کند، نامیده می شود.
کلاس مکانیزمی در برنامه نویسی شی گرا است که متغیرها و متدهای مربوط به یک شی را به هم متصل می کند.
برنامه نویس می تواند قابلیت مشاهده متغیرهای کلاس و متدها را با استفاده از تعیین کننده دسترسی تعریف کند. متغیرها و متدهای public را می توان در هرجای کد برنامه به آن دسترسی داشت.
در روش OOP، کد برنامه به صورت مجموعه ای از کلاس ها سازماندهی می شود. کلاس ، آبجکت را در کد برنامه تعریف می کند.
مفهوم کلاس در برنامه نویسی شی گرا

هر کلاس نشان دهنده یک موجودیت دنیای واقعی است. به عبارت دیگر، یک شی باید در کد برنامه نمایش داده شود.
متودولوژی برنامه نویسی OOP به وضوح مالکیت داده ها را بر حسب کلاس ها تعریف می کند. هر کلاس دادهها و متدهایی را که روی دادهها کار میکنند را به هم متصل میکند.
مثالی از کلاس در OOP
اجازه دهید نمونه ای از تعریف کلاس در جاوا را در نظر بگیریم. کلاس با استفاده از کلمه کلیدی class در جاوا تعریف می شود. در این مثال، کلاسی را با نام MethdDemoتعریف کرده ایم.

اصول برنامه نویسی شی گرا
OOP بر چهار اصل اساسی استوار است.
- کپسوله سازی(Encapsulation)
- وراثت(Inheritance)
- انتزاعی(Abstraction)
- چند ریختی(Ploymorphism)

1.کپسوله سازی(Encapsulation)
کپسوله سازی در برنامه نویسی شی گرا چیست؟
فرآیند اتصال داده ها و متدها به یکدیگر تحت عنوان یک واحد را کپسوله سازی می گویند. کمبود امنیت داده کافی یکی از محدودیت های اصلی برنامه نویسی procedural بود. در برنامه نویسی شی گرا، دسترسی به داده ها محدود به متدهایی است که متعلق به شی است

2-ارث بری (Inheritance).
ارث بری در برنامه نویسی شی گرا چیست؟
ارث بری فرآیند به دست آوردن قابلیت های موجود کلاس والد و افزودن ویژگی ها و عملکردهای اضافی به کلاس فرزند ارثی است.
ارث بری در برنامه نویسی شی گرا ، فرآیند استخراج یک کلاس از کلاس دیگر است که به عنوان Inheritance شناخته می شود. کلاس inherited (به ارث برده) به طور موثر همانند کلاس والد(parent) عمل می کند که به آن ، کلاس فرزند(child) می گویند.
ارث بری یکی از مهمترین اصول اساسی در پارادایم برنامه نویسی شی گرا است. ارث بری اساساً با قابلیت استفاده مجدد از کد برنامه سروکار دارد.به عنوان مثال، وراثت تک سطحی و چند سطحی در جاوا مجاز است.
سوپر کلاس چیست؟
کلاس پایه (Base Class) یا کلاس والد (Parent Class).
زمانی به کلاس، یک super class گفته می شود که توسط یک یا چند کلاس به ارث برده شود. super class به طور متناوب به عنوان کلاس پایه یا کلاس والد نیز نامیده می شود.
Sub Class (کلاس فرعی) چیست؟
کلاس فرزند (Child Class) یا کلاس استخراج شده (Derived Class).
زمانی به یک کلاس ، Sub Class گفته می شود که از کلاس دیگری مشتق شده باشد. کلاس فرعی نیز به طور متناوب به عنوان کلاس فرزند یا کلاس مشتق شده نامیده می شود.
کلاس مشتق شده پس از ایجاد، کپی خود را از متغیرها و متدهای تعریف شده در کلاس والد خواهد داشت.
با این حال، کلاس فرعی (Sub Class) می تواند متغیرها و متدهای بیشتری را علاوه بر متغیرها و متدهای به ارث برده از کلاس والد ، اضافه و تعریف کند.
انواع ارث بری در شی گرا

قابلیت استفاده مجدد کد یکی از ویژگی های مهم برنامه نویسی شی گرا است.
قابلیت استفاده مجدد کد به برنامه نویس اجازه می دهد تا از کلاس های از قبل ایجاد شده ، در کد برنامه استفاده کند.
با استفاده از ارث بری ، برنامه نویس از کدهای موجود که قبلاً برای پروژه های دیگر نوشته و آزمایش شده است استفاده می کند. ارث بری به کاهش زمان کلی توسعه برای توسعه نرم افزار کمک می کند.
چه چیزی مجاز نیست؟
به عنوان مثال، ارث بری ترکیبی(hybrid inheritance) و ارث بری چندگانه (multiple inheritance)در جاوا مجاز نیست.

3-انتزاع (Abstraction).
انتزاع در OOP چیست؟
اصطلاح انتزاع(Abstraction) یکی دیگر از اصول اساسی مهم در OOP است. اصطلاح Abstraction در OOP به سادگی به معنای ارائه نمای ساده و پنهان کردن پیچیدگی است.
کلمه abstract از یک کلمه لاتین به معنای “کشیده شدن، جدا شدن” گرفته شده است. ایده اصلی در Abstraction چیزی است که از object فیزیکی واقعی جدا شده است.
Abstraction اغلب برای انتقال ایده ها استفاده می شود. که کاربرد روشنی برای یک شی خاص زندگی واقعی ندارد. این بدان معناست که به صورت تصویری یک شیء خاص زندگی واقعی را نشان نمی دهد.مفهوم Abstraction در برنامه OOP برای ارائه نمای ساده تر از یک شی با حذف جزئیات نامربوط استفاده می شود.

مفهوم Abstraction کاربردهای زیادی دارد. در مهندسی نرم افزار، برای تسهیل درک سیستم های نرم افزاری پیچیده استفاده می شود.
Abstraction به ویژه در حل مسائل پیچیده ضروری است، زیرا حلکننده را قادر میسازد تا بر حسب ایدههای مفهومی فکر کند و نه بر اساس هر موضوع خاص.
مثالی از انتزاع در OOP
کلاسی که با استفاده از کلمه کلیدی abstract تعریف می شود به عنوان کلاس انتزاعی شناخته می شود. کلاس abstract ممکن است شامل متدهای انتزاعی باشد یا نباشد.
که به عبارت دیگر به این معنی است که در کلاس انتزاعی می توانیم متدهای concrete را نیز تعریف کنیم. یک متد زمانی concrete است که بدنه متد و پیاده سازی (implementation) آن را داشته باشد.
یک کلاس انتزاعی همچنین می تواند حاوی متدهای انتزاعی باشد. به متد زمانی یک متد انتزاعی گفته می شود که بدنه متد و پیاده سازی (implementation) آن را نداشته باشد.

یک کلاس انتزاعی را نمی توان نمونه سازی کرد. یعنی ما نمیتوانیم یک شی از کلاس انتزاعی ایجاد کنیم.
کلاس abstract می تواند توسط کلاس فرزند به ارث برده شود و جزئیات پیاده سازی را برای متدهای انتزاعی ارائه دهد.
4-چند ریختی (Polymorphism).
چند ریختی در OOP چیست؟
پلی مورفیسم یکی از چهار مفهوم اصلی طراحی OOP است که به طور گسترده در برنامه نویسی شی گرا استفاده می شود.
کلمه پلی مورفیسم از دو کلمه یونانی poly و morph تشکیل شده است. کلمه poly به معنی چند و کلمه morph به معنای اشکال است. اصطلاح چندریختی به سادگی به معنای اشکال بسیاری است.
- پلی مورفیسم را می توان به عنوان یک شی منفرد با چندین رفتار متفاوت نیز تعریف کرد.
- رفتار چند ریختی object به شرایط بستگی دارد.
- رایج ترین استفاده از پلی مورفیسم در OOP، استفاده از یک مرجع کلاس والد برای ارجاع به یک شی کلاس فرزند می باشد.
- رایج ترین و ساده ترین کاربرد پلی مورفیسم در برنامه OOP استفاده از نام متد مشابه است.
به عنوان مثال، می توان بسیاری از متدها را با نام متد یکسان اما با پیاده سازی متفاوت تعریف کرد.

بسته به روشی که متد فراخوانی می شود، روش صحیح فراخوانی می شود.
تصمیم برای فراخوانی متد مناسب می تواند در زمان کامپایل یا در زمان اجرا اتفاق بیفتد.
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
|
class Shape{ void draw(){System.out.println("drawing...");} } class Rectangle extends Shape{ void draw(){System.out.println("drawing rectangle...");} } class Circle extends Shape{ void draw(){System.out.println("drawing circle...");} } class Triangle extends Shape{ void draw(){System.out.println("drawing triangle...");} } class TestPolymorphism2{ public static void main(String args[]){ Shape s; s=new Rectangle(); s.draw(); s=new Circle(); s.draw(); s=new Triangle(); s.draw(); } } |
مزایای برنامه نویسی شی گرا
برنامه نویسی شی گرا در مقایسه با برنامه نویسی رویه ای (procedural) مزایای زیادی دارد.
- OOP می تواند از پروژه نرم افزاری بزرگ پشتیبانی کند.
- OOP حفاظت بهتری از داده ها ارائه می دهد.
- قابلیت استفاده مجدد کد.
- بازنمایی بهتر از اشیاء دنیای واقعی.
- تعمیر و نگهداری بهتر نرم افزار.
- امنیت پیشرفته.
- اصلاح کد آسان

OOP می تواند از پروژه نرم افزاری بزرگ پشتیبانی کند.
زبانهای برنامهنویسی procedural در طراحی یک نرمافزار در مقیاس بزرگ محدودیتهای عمدهای داشتند.
برنامه نویسی شی گرا می تواند به راحتی پروژه توسعه نرم افزار در مقیاس بزرگ و پیچیده را مدیریت کند.
OOP محافظت بهتری از داده ها ارائه می دهد.
الگوی برنامه نویسی OOP فیچرهای بسیاری را ارائه می دهد که حفاظت عالی از داده ها را فراهم می کند. در OOP، مجوزهای دسترسی به داده ها به شدت کنترل می شود.
برنامه نویسی OOP به برنامه نویس اجازه می دهد تا مجوزهای دسترسی به داده ها را تعریف و تنظیم کند.
قابلیت استفاده مجدد کد
یکی از ویژگی های مهم همه زبان های برنامه نویسی شی گرا است.
برنامهنویس میتواند کتابخانهای از کلاسهای استاندارد ایجاد کند تا عملکردهای رایج را مدیریت کند.
در غیر این صورت، استفاده از متدهای استاندارد کتابخانه کلاس نیز با گنجاندن این کتابخانه کلاس در کد برنامه امکان پذیر است.
نمایش بهتر اشیاء دنیای واقعی برنامه نویسی OOP بر اساس مفهوم اساسی شی و کلاس است. شی نشان دهنده یک موجودیت دنیای واقعی است.
برنامه نویسی OOP به برنامه نویس اجازه می دهد تا فیچرهای یک شی را در کلاس توصیف کند. برنامه نویس به راحتی می تواند اشیاء دنیای واقعی را به صورت واقعی در کد برنامه نمایش دهد.
تعمیر و نگهداری بهتر نرم افزار
تعمیر و نگهداری نرم افزار یک چالش بزرگ برای اکثر شرکت های نرم افزاری است. با این حال، مدیریت برنامه OOP در درازمدت نسبتاً ساده تر است.
مسائل مربوط به نگهداری کد معمولی را می توان به راحتی در OOP حل کرد. طراحی ماژولار اولیه به برنامه نویس اجازه می دهد تا تغییرات لازم را در کد برنامه اعمال کند.
امنیت پیشرفته
زبان های OOP ویژگی های امنیتی قوی را ارائه می دهند. زبان های برنامه نویسی OOP ویژگی های امنیتی بسیار خوبی را ارائه می دهند که به برنامه نویس اجازه می دهد تا ویژگی های امنیتی لازم را در خود جای دهد.
زبان های برنامه نویسی مبتنی بر OOP مانند جاوا. به عنوان مثال زبان جاوا از اشاره گرهایی که دسترسی مستقیم به حافظه را می دهد پشتیبانی نمی کند.
اصلاح کد آسان
برنامه های نرم افزاری به گونه ای طراحی شده اند که برای مدت طولانی به کاربر نهایی خدمات رسانی کنند. در اکثر مواقع همه نرم افزارها باید با اعمال تغییرات در نرم افزار اصلاح شوند. چنین تغییراتی می تواند یک اشکال نرم افزاری ایجاد کند.
با این حال، نرم افزار مبتنی بر زبان OOP را می توان به راحتی به دلیل ساختار ماژولار آن بدون تأثیر نامطلوب بر عملکرد سایر ماژول ها تغییر داد.