| پارادایم‌های برنامه‌نویسی |
| --- |
| * زبان عملی
* عامل گرا
* آرایه‌گرا
* مبتنی بر اتوماتا
* رایانش همزمان
	+ نسبیت گرایی
* داده‌محور
* اعلانی (تضاد: دستوری)
	+ تابعی
		- منطق تابعی
		- تابعی خالص
	+ منطقی
		- منطقی قیاسی
		- مجموعه جواب
		- منطق همزمان
		- منطق تابعی
		- منطق استقرایی
	+ محدودیتی
		- منطق محدودیتی
			* منطق محدودیت همزمان
	+ جریان داده
		- مبتنی بر جریان
		- واکنشی
	+ هستی‌شناسی
* تشخیص پذیر
* پویا/اجرانامه‌نویسی
* رویدادمحور
* سطح تابع (تضاد: سطح مقدار)
	+ سبک بدون آرگومان
		- الحاقی
* همگانی
* دستوری (تضاد: اعلانی)
	+ رویه‌ای
	+ شیءگرا (OOP)
		- کد چندریخت
* تصمیم گرا
* زبان گرا
	+ خاص دامنه
* ادیبانه
* برنامه‌نویسی زبان طبیعی
* فرا برنامه‌نویسی
	+ خودکار
		- استقرایی
	+ پژواکی
		- صفت گرا
	+ مبتنی بر کلان‌دستور (ماکرو)
	+ خودآرا
* غیر ساخت‌یافته (تضاد: ساخت‌یافته)
	+ آرایه‌ای (برداری)
* غیرقطعی
* رایانش موازی
	+ فرایند گرا
* احتمالی
* کوانتمی
* نظریه مجموعه‌ها
* مبتنی بر پشته
* ساخت‌یافته (تضاد: غیر ساخت‌یافته)
	+ بلوک ساختاری
		- ساخت‌یافته همزمان
	+ شیءگرا (OOP)
		- مبتنی بر بازیگر
		- مبتنی بر کلاس
		- همزمان
		- بر پایه پیش‌نمونه
		- با تفکیک دغدغه‌ها:
			* جنبه‌گرا
			* نقش گرا
			* موضوع گرا
	+ بازگشتی
* نمادین
* سطح مقدار (تضاد: سطح تابع)
 |
| * ن
* ب
* و
 |

**برنامه‌نویسی شیءگرا** (به انگلیسی: Object-Oriented Programming) (به‌اختصار: OOP) یک شیوه برنامه‌نویسی است، که ساختار یا بلوک اصلی اجزای آن، شی‌ءها می‌باشند. در این شیوه برنامه‌نویسی، برنامه به شیء گرایش پیدا می‌کند، به این معنا که داده‌ها و توابعی که بر روی این داده‌ها عمل می‌کنند، تا حد امکان در قالبی به نام شیء و در کنار یکدیگر قرار گرفته، جمع‌بندی شده و یک واحد (یا یک شیء) را تشکیل می‌دهند و نسبت به محیط بیرونِ خود، کپسوله می‌شوند. از این طریق، توابع خارج از آن شیء، امکان ایجاد تغییر در داده‌های درون شیء را نخواهند داشت.

شکل‌گیری
--------

فلسفه‌ای که منجر به شکل‌گیری زبان‌های شی‌گرا شد، عبارت بود از این واقعیت که نحوه عملکرد مغز و شیوهٔ دریافت اطلاعات از محیط پیرامون و پردازش آن اطلاعات (اندیشیدن)، شیوه‌ای شی‌گراست، از همین روی می‌بایستی زبانی تعریف می‌شد که همین شیوه را مبنای کار خود قرار داده و بازتولید می‌کرد؛ و دقیقاً به همان شکل که اشیا در جهان خارج، دارای هویت و کارکرد مشخص و یگانه برای خود هستند و در عین حال با دیگر اشیا در ارتباطی تنگاتنگ و مستقیم‌اند، در زبان‌های برنامه‌نویسی نیز می‌بایستی این اصول کلی برقرار می‌شد. تا به این شکل، برنامه‌نویس بتواند با بهره‌گیری از زبانی که به روش اندیشیدنش، نزدیکی بیشتری دارد، شی‌های مختلفی را تعریف نموده، این شی‌ها را در ارتباط با یکدیگر قرار داده و از شی‌های پویای تولید شده برای حل مسئلۀ پیش روی استفاده نماید. امروزه اکثر زبان‌های دستوری برنامه‌نویسی از فنون شی‌گرایی پشتیبانی می‌کنند.

زبان‌هایی مانند جاوا، سی پلاس پلاس(++c)، سی شارپ، دلفی و پایتون از جمله زبان‌های شی‌گرا هستند. حتی بسیاری از زبان‌های روال‌گونه که ساختار برنامه‌ها در آن‌ها بلوک‌هایی با نام پروسیجر است، امروزه از فنون شی‌گرایی نیز پشتیبانی می‌کنند. زبان‌های سی++ و پی‌اچ‌پی از این جمله هستند. هر شیء یک سری خصوصیت و قابلیت دارد، که اصطلاحاً Properties و Operation خوانده می‌شوند. در این پارادایم برنامه‌نویسی، دید برنامه‌نویس به سیستم، دید شخصی است، که سعی می‌نماید با پیدا کردن اشیاء مختلف در سیستم و برقراری ارتباط بین آن‌ها، سیستم را تولید نماید.

مقایسه
------

لازم است ذکر شود که تکنیک برنامه‌نویسی شی‌گرا به مراتب کارا و پیچیده‌تر از سبک برنامه‌نویسی مبتنی بر تابع است. دلایل برتری برنامه‌نویسی شی‌گرا:

1. قابلیت سازمان دهی بهینه‌تر کدها
2. قابلیت تقسیم برنامه به برنامه‌های کوچک‌تر اما مستقل. برنامهٔ اصلی به صورت یک EXE در می‌آید که دیگر قسمت‌های مستقل برنامه را فراخوانی می‌کند.
3. عدم نیاز به نوشتن کدهای تکراری و قابلیت‌هایی که قبلاً پیاده‌سازی شده‌اند و صرف جویی در استفاده از منابع.

با این وجود، بسیاری از توسعه دهندگان سعی می‌کنند در پروژه‌های کوچک و ساده خود از سبک برنامه‌نویسی مبتنی بر تابع بهره بگیرند.

کلاس
----

کلاس نوع خاصی از آرایه است که امکان ذخیره و جمع‌بندی تعداد زیادی المان را (که شامل داده‌ها و توابع هستند) برای یک شی جدید فراهم آورده و تحت یک نام مشترک ذخیره می‌کند. اما برخلاف آرایه که تنها قادر به ذخیرهٔ داده‌هایی هم جنس است، کلاس می‌تواند داده‌هایی از جنس‌های مختلف را ذخیره نماید. به‌طور مثال در نظر بگیرید که می‌خواهیم تاریخ ۱۳ نوامبر ۲۰۰۶ را که تشکیل شده از روز، ماه و سال است مورد استفاده قرار دهیم. برای این منظور سه نوع متغیر متفاوت مورد نیاز است:

```
int day;
String month;
int year;

```

حال در نظر بگیرید که نه فقط یک تاریخ، بلکه n تاریخ متفاوت مورد نیاز است. این بدان معنی ست که می‌بایستی به تعداد n بار، سه متغیر بالا، جداگانه تعریف شوند و تعریفِ تک تک و پیاپی متغیرها، نه فقط از لحاظ زمانی بسیار وقت گیر می‌نماید، بلکه از لحاظ میزان کد مورد نیاز نیز بسیار غیر عملی ست، چرا که هر بار می‌بایستی نام جدیدی برای متغیرها در نظر گرفته شود (دو متغیر متفاوت نمی‌توانند هم نام باشند).

اینجاست که کلاس‌ها به خوبی وارد عمل می‌شوند. با استفاده از کلاس‌ها می‌توان متغیرهای متعدد را زیر عنوان یک جنسیت مشترک جدید (به‌طور مثال هر سه را در یک کلاس با نام Date)، تعریف و جمع‌بندی نمود؛ و بعد از آن، بدون نیاز به تعریف مجدد روز، ماه و سال، از کلاس Date به میزان مورد نیاز استفاده کرد:

```
class Date{
int day;
String month;
int year;
}

```

وراثت
-----

وراثت یا ارث بری (Inheritance) از مفاهیم اساسی برنامه‌نویسی شی گرا است. هر شیء یک نمونه از یک کلاس است و هر کلاس می‌تواند از کلاس یا کلاسهای دیگری مشتق شده باشد (خواص متدها یا رویدادهای کلاس‌های دیگر را به ارث ببرد). در یک مثال ساده می‌توان اتومبیلی را در نظر گرفت که برای جلوگیری از بازنویسی خواص عمومی اتومبیل شامل: چهار چرخ، متدهای حرکت چرخ، متد چرخاندن فرمان، بدنه، در و غیره، می‌توان یک کلاس پایه از اتومبیل ایجاد کرد سپس مثلاً برای اتومبیل سیتروئن مدل C۵ یک کلاس جدید ایجاد کرده که خواص، متدها و رویدادهای عمومی اتومبیل را داشته باشد و فقط برای خواص، متدها و رویدادهای جدید این اتومبیل کد نوشته شود. این ویژگی باعث صرفه‌جویی در نوشتن کد و تا حدودی تضمین صحت کد موجود می‌شود. به عنوان مثال اگر کلاس پایه مشکلی داشته باشد فقط کافی است کلاس پایه تغییر داده شود و در تمامی کلاس‌هایی که از این کلاس پایه ویژگی‌ای را به ارث برده‌اند این تغییر اعمال خواهد شد.

مخفی‌سازی
---------

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

چندشکلی
-------

چند ریختی، کمیتی است که به یک رابط امکان می‌دهد تا از عملیات یکسانی در قالب یک کلاس عمومی استفاده کند. عمل خاص کلاس را ذات حقیقی شیء تعیین می‌کند. مثال ساده‌ای از چند ریختی، فرمان اتومبیل است. عمل فرمان اتومبیل برای تمام اتومبیل‌ها بدون توجه به ساز و کاری که دارند، یکسان است. فرمان برای اتومبیل که به‌طور مکانیکی کار می‌کند یا با نیروی برق یا هر چیز دیگری، عمل یکسانی را انجام می‌دهد؛ بنابراین، پس از اینکه شما عملکرد فرمان را یادگرفتید، می‌توانید فرمان هر اتومبیلی را کنترل کنید. همین هدف در برنامه‌نویسی نیز اعمال می‌شود.

به‌طور کلی، مفهوم چند ریختی، اغلب با عبارت «یک رابط، چندین روش» بیان می‌شود. این بدین معنی است که امکان طراحی رابط عمومی برای گروهی از عملیات مرتبط وجود دارد. چند ریختی یا چندشکلی (Polymorphism) به این معنا است که اشیاء می‌توانند در موقعیت‌های مختلف، رفتارهای متفاوتی بروز دهند. مثلاً یک تابع در صورتی که بر روی نمونه‌ای از کلاس آ فراخوانی شود، رفتار ب را بروز دهد در حالی که اگر بر روی کلاس ج (که فرزند کلاس آ است) فراخوانی شود، رفتاری متفاوت انجام دهد.

انتزاع
------

انتزاع داده یا پنهان کردن اطلاعات، Abstraction نامیده می‌شود. به عبارت دیگر فرآیندی برای انتزاع یا پنهان‌سازی عملکردها می‌باشد و فقط امکان استفاده از آن‌ها را برای کاربران یا برنامه نویسان فراهم می‌کند. برای مثال متد Console.WriteLine. هیچ کس نمی‌داند چه عملیاتی در تابع اتفاق می‌افتد و ما فقط با صدا زدن و ارسال پارامتر از آن استفاده می‌کنیم.

مثال کاربردی
------------

در اطراف ما اشیاء زیادی وجود دارد و می‌توان تمام مفاهیم موجود در طبیعت را با اشیاء تقلیل داد. مثلاً یک ماشین باربری. این ماشین یک سری خصوصیات دارد: چهار چرخ، یک پدال ترمز، یک پدال گاز، یک فرمان و یک محل بزرگ برای قرار دادن اشیاء در آن و… این ماشین در صورتی که ما پدال گاز آن را فشار دهیم، حرکت می‌کند. در صورتی که فرمان آن را بچرخانیم تغییر مسیر می‌دهد. پس این شیء علاوه بر یک سری خصوصیات، یک سری رفتار مشخص هم به ما نشان می‌دهد؛ ولی فقط این یک ماشین نیست که این کار را انجام می‌دهد. تمامی ماشین‌ها این کارها را انجام می‌دهند. پس می‌توانیم این ماشین را 'تعریف' کنیم و بگوییم: ماشین باربری وسیله‌ای است که چهار چرخ، یک گاز، یک ترمز، یک فرمان و یک محل برای حمل بار دارد و اگر پدال گاز آن فشار داده شود حرکت می‌کند. این تعریف این ماشین است ولی خود آن نیست. هر زمانی چنین ماشینی بخواهیم به کارخانه تولید آن می‌رویم و از فروشندگان می‌خواهیم تا با توجه به این تعریف یک ماشین به ما بدهند. مفاهیم فوق در زبان‌های برنامه‌نویسی شیءگرا گنجانده شده‌اند. در این زبان‌ها، اشیاء زیادی از پیش وجود دارند که برنامه‌نویسان می‌توانند از آن‌ها استفاده کنند.

ارتباط اشیاء
------------

مجدداً به مثال ماشین باربری بر می‌گردیم و این بار، یک ماشین سواری را تعریف می‌کنیم. ماشین سواری شیئی است که چهار چرخ، یک ترمز، یک پدال گاز و یک صندوق عقب دارد. این تعریف به تعریف ماشین باربری بسیار شبیه‌است. به عبارت دیگر ما به یک تعریف جدید می‌رسیم: *خودرو*.
خودرو وسیله‌ای است که چهار چرخ، یک ترمز، یک پدال گاز دارد. پس از این به بعد تعریف ماشین باربری و ماشین سواری خیلی ساده‌تر می‌شود. ماشین باربری، *خودرویی* است که محلی برای قرار دادن بار داشته باشد و ماشین سواری، *خودرویی* است که صندوق عقب داشته باشد.

* اگر کسی به در کارخانه مراجعه کند و بگوید که «خودرو» می‌خواهد، چیزی دریافت نمی‌کند. خودرو یک تعریف انتزاعی است، برای تعریف خودرو شیء وجود ندارد؛ پس مشتری تنها می‌تواند خودرو باربری یا خودرو سواری بخواهد.
* کارواش را در نظر می‌گیریم. این کارواش خودرو را تمیز می‌کند و دیگر به‌طور جزئی عنوان نمی‌کند که کدام نوع خودرو را تمیز می‌کند. به عبارت دیگر نوع خودرو برای کارواش مهم نیست.
* وقتی شخصی قصد اجاره خودرویی دارد، و می‌خواهد جنسی را حمل کند در هنگام تماس با متصدی کرایه ماشین می‌گوید: «اگر خودرو شما از نوع باربری است، برای من ارسال کنید»، ولی اگر قصد جابجا شدن را دارد می‌گوید: «برای من یک ماشین سواری بفرستید.»

در زبان‌های برنامه‌نویسی شیءگرا نیز اشیاء مختلفی وجود دارند که تعریف آن‌ها تکمیل‌کننده یکدیگر است، به عبارت دیگر اشیا از یکدیگر ارث بری می‌کنند. برخی از تعاریف کاملاً عام است و نمی‌توان از آن‌ها نمونه شیئی ساخت و تنها تعریف هستند. به این تعاریف Interface گفته می‌شود.

مدیریت پیچیدگی
--------------

اعمال شیوه‌های مدیریتی با محوریت اشیاء در مطالعه، طراحی، ایجاد، و اجراء پروژه‌های مهندسی نرم‌افزار و مهندسی دانش.

جستارهای وابسته
---------------

* مهندسی نرم‌افزار
* کلاس (برنامه‌نویسی)

منابع
-----

1. ↑  «*برنامه‌نویسی شیءگرا*» [*رایانه و فنّاوری اطلاعات*] هم‌ارزِ «*OO programming*»؛ منبع: گروه واژه‌گزینی. جواد میرشکاری، ویراستار. *دفتر پنجم*. فرهنگ واژه‌های مصوب فرهنگستان. تهران: انتشارات فرهنگستان زبان و ادب فارسی. شابک ۹۷۸-۹۶۴-۷۵۳۱-۷۶-۴ (ذیل سرواژهٔ *برنامه‌نویسی شیءگرا*)
2. ↑
3. ↑  Christian Ullenboom, Java ist auch eine Insel, 10. Auflage, ISBN 3-8362-1802-X
4. ↑  بابک بشری راد (۱۳۹۴). *برنامه‌سازی پیشرفته با ++C*. تهران: ناقوس. شابک ۹۷۸-۹۶۴-۳۷۷-۷۴۶-۳.
5. 1 2  Prof. Hanspeter Mössenböck, Sprechen Sie Java?, 3.Auflage, ISBN 3-89864-362-X

| * ن
* ب
* و
مهندسی نرم‌افزار |
| --- |
| حوزه‌ها | تحلیل نیازمندی‌ها •  تحلیل سامانه‌ها •  طراحی نرم‌افزار •  برنامه‌نویسی •  روش‌های صوری •  وارسی مدل •  تست نرم‌افزار •  توسعه نرم‌افزار •  گسترش نرم‌افزار •  نگهداری نرم‌افزار |
| مفاهیم | مدل‌سازی داده •  معماری سازمانی •  مشخصات کاربردی •  زبان مدل‌سازی •  پارادایم برنامه‌نویسی •  نرم‌افزار •  معماری نرم‌افزار •  فرایند توسعه نرم‌افزار •  فرایند تولید نرم‌افزار •  کیفیت نرم‌افزار •  تضمین کیفیت نرم‌افزار •  Software archaeology •  تحلیل ساختمند |
| گرایشات | مدل چابک •  مدل طراحی جنبه‌گرا •  شیءگرایی •  آنتولوژی •  سرویس‌گرایی •  چرخه حیات توسعه سیستم‌ها |
| مدل‌ها | 

|  |  |
| --- | --- |
| مدل‌های توسعه | مدل چابک •  آریوپی  •  اسکرام •  مدل مارپیچی •  مدل آبشاری •  برنامه‌سازی مفرط •  مدل وی •  مدل تکراری و افزایشی •  پیش‌نمونه |
| مدل‌های دیگر | Automotive SPICE •  مدل بلوغ قابلیت یکپارچه •  مدل داده •  مدل تابع •  مدل اطلاعات •  فرامدل •  مدل شیءگرایی •  مدل‌سازی سیستم‌ها •  مدل نما |
| زبان‌های مدل سازی | IDEF •  زبان مدل‌سازی یکپارچه |

 |
| مهندساننرم‌افزار سرشناس | 
* ویکتور باسیلی
* کنت بک
* گریدی بوچ
* فردریک بروکز
* Barry Boehm
* وارد کانینگهام
* تام دی ماکرو
* ادسخر دیکسترا
* مارتین فولر
* تونی هور
* واتس هامفری
* مایکل ای. جکسون
* ایوار جاکوبسون
* Stephen J. Mellor
* برترند میر
* دیوید پارناس
* وینستون واکر رویس
* جیمز رامبا
* نیکلاوس ویرت
* Edward Yourdon
* Mohamed Fayad

 |
| حوزه‌های مرتبط | 
* علوم رایانه
* مهندسی کامپیوتر
* مدیریت پروژه
* مدیریت ریسک
* مهندسی سامانه‌ها

 |
|  •  رده  •  انبار |

| * ن
* ب
* و
گونه‌های زبان‌های برنامه‌نویسی |
| --- |
| 
* Actor-based
* Array
* جنبه‌گرا
* مبتنی بر کلاس
* Concatenative
* محاسبات همزمان
* Data-structured
* Dataflow
* اعلانی
* خاص دامنه
* پویا
* محرمانه
* رویدادمحور
* Extensible
* تابعی
* دستوری
* منطقی
* ماکرو
* فرا برنامه‌نویسی
* چندالگویی
* مبتنی بر شئ
* شیءگرا
* خط لوله
* رویه‌ای
* بر پایه پیش‌نمونه
* پژواکی
* قانون محور
* اسکریپت‌نویسی
* Synchronous
* Templating

 |
| 
* اسمبلی
* ترجمه‌شده
* تفسیری
* ماشین

 |
| 
* سطح پایین
* سطح بالا
* Very high-level

 |
| 
* First generation
* Second generation
* نسل سوم
* نسل چهارم
* زبان برنامه‌نویسی نسل پنجم

 |
| 
* Non-English-based
* تصویری

 |

| * ن
* ب
* و
زبان مدل‌سازی یکپارچه |
| --- |
| کنشگرها | 
* *سازمان‌ها*
	+ گروه مدیریت شیء
	+ UML Partners
* *اشخاص*
	+ گریدی بوچ
	+ ایوار جاکوبسون
	+ جیمز رامبا

 |  |
| مفاهیم | 

|  |  |
| --- | --- |
| شیءگرا | 
* برنامه‌نویسی شیءگرا
* طراحی و آنالیز شئ‌گرا
* Object-oriented modeling

 |
| ساختار | 
* کنشگر
* صفت
* Artifact
* کلاس
* Component
* Interface
* شیء
* Package
* Profile diagram

 |
| رفتار | 
* Activity
* Event
* فرستادن پیام
* اسلوب
* حالت
* مورد کاربرد

 |
| روابط | 
* Association
* Composition
* جفتگری
* تعمیم (or وراثت)

 |
| توسعه‌پذیری | 
* پروفایل یو ام‌ال
* Stereotype

 |
| سایر | 
* نمودار کلاس

 |

 |
| نمودارها | 

|  |  |
| --- | --- |
| ساختاری | 
* نمودار کلاس
* دیاگرام اجزا
* Composite structure
* Deployment
* نمودار شئ
* Package

 |
| رفتاری | 
* نمودار فعالیت
* ماشین حالت یو.ام.ال
* نمودار مورد کاربرد

 |
| تعاملی | 
* نمودار ارتباطی
* نمودار توالی
* Interaction overview
* Timing

 |

 |
| زبان‌های مشتق‌شده | 
* زبان مدل‌سازی سیستم‌ها
* UML eXchange Format (UXF)|
* XML Metadata Interchange (XMI)|
* Executable UML (xUML)|

 |
| سایر موضوعات | 
* Glossary of UML terms
* فرایند یکپارچه رشنال
* مقایسه ابزارهای زبان مدل‌سازی یکپارچه
* Object Modeling in Color

 |