برنامه نویسی شی گرا

از ویکیپدیا، دانشنامه آزاد
پرش به ناوبری پرش به جستجو

برنامه نویسی شی گرا ( OOP ) یک الگوی برنامه نویسی مبتنی بر مفهوم " اشیاء " است که می تواند حاوی داده ها و کد باشد : داده ها به شکل فیلدها (اغلب به عنوان ویژگی ها یا ویژگی ها شناخته می شوند ) و کد به شکل رویه ها. (اغلب به عنوان روش شناخته می شود ).

یکی از ویژگی های مشترک اشیاء این است که رویه ها (یا متدها) به آنها متصل می شوند و می توانند به فیلدهای داده شی دسترسی پیدا کرده و آن را تغییر دهند. در این برند OOP معمولاً یک نام خاص مانند یا برای اشاره به شی فعلی وجود دارد. در OOP، برنامه های کامپیوتری با ساختن آنها از اشیایی که با یکدیگر تعامل دارند، طراحی می شوند. [1] [2] زبان‌های OOP متنوع هستند، اما محبوب‌ترین آن‌ها مبتنی بر کلاس هستند ، به این معنی که اشیاء نمونه‌هایی از کلاس‌ها هستند که انواع آنها را نیز تعیین می‌کنند . thisself

بسیاری از پرکاربردترین زبان های برنامه نویسی (مانند C++، جاوا، پایتون و غیره) چند پارادایم هستند و از برنامه نویسی شی گرا تا حد زیادی پشتیبانی می کنند، معمولاً در ترکیب با برنامه نویسی ضروری و رویه ای . زبان های مهم شی گرا عبارتند از: جاوا ، سی پلاس پلاس ، سی شارپ ، پایتون ، آر ، پی اچ پی ، ویژوال بیسیک دات نت ، جاوا اسکریپت ، روبی ، پرل ، سیم اسکریپت ، آبجکت پاسکال ، شیء- سی ، دارت ., Swift , Scala , Kotlin , Common Lisp , MATLAB و Smalltalk .

تاریخچه

نماد UML برای یک کلاس. این کلاس Button دارای متغیرهایی برای داده ها و توابع است. از طریق وراثت می توان یک زیر کلاس به عنوان زیر مجموعه کلاس Button ایجاد کرد. اشیا نمونه هایی از یک کلاس هستند.

اصطلاحات استفاده از "اشیاء" و "گرا" به معنای مدرن برنامه نویسی شی گرا اولین بار در اواخر دهه 1950 و اوایل دهه 1960 در MIT ظاهر شد. در محیط گروه هوش مصنوعی ، در اوایل سال 1960، "شیء" می توانست به موارد شناسایی شده ( اتم های LISP ) با ویژگی ها (ویژگی ها) اشاره کند. [3] [4] آلن کی بعداً در سال 1966 به درک دقیقی از درونیات LISP به عنوان تأثیری قوی بر تفکر او اشاره کرد. [5]

به این فکر کردم که اشیا مانند سلول‌های بیولوژیکی و/یا رایانه‌های منفرد در یک شبکه هستند که فقط می‌توانند با پیام‌ها ارتباط برقرار کنند (بنابراین پیام‌رسانی در همان ابتدا شروع شد - مدتی طول کشید تا ببینم چگونه می‌توان پیام‌رسانی را در یک زبان برنامه‌نویسی به اندازه کافی کارآمد انجام داد. مفید).

آلن کی، [5]

یکی دیگر از نمونه های اولیه MIT Sketchpad بود که توسط ایوان ساترلند در 1960-1961 ایجاد شد. ساترلند در واژه نامه گزارش فنی سال 1963 بر اساس پایان نامه خود در مورد Sketchpad مفاهیم «شیء» و «مثال» را (با مفهوم کلاسی تحت پوشش «مستر» یا «تعریف») تعریف کرد، البته برای تعامل گرافیکی تخصصی. [6] همچنین، یک نسخه MIT ALGOL ، AED-0، پیوند مستقیمی بین ساختارهای داده ("plex" در آن گویش) و رویه‌ها برقرار کرد، و آنچه را که بعداً "پیام‌ها"، "روش‌ها" و "عملکردهای عضو" نامیده شدند، پیش‌بینی کرد. ". [7] [8]

سیمولا مفاهیم مهمی را معرفی کرد که امروزه جزء ضروری برنامه نویسی شی گرا هستند، مانند کلاس و شی ، ارث و اتصال پویا . [9] زبان برنامه نویسی شی گرا Simula عمدتاً توسط محققان درگیر با مدل سازی فیزیکی ، مانند مدل هایی برای مطالعه و بهبود حرکت کشتی ها و محتوای آنها از طریق بنادر بار استفاده شد. [9]

در دهه 1970، اولین نسخه از زبان برنامه نویسی اسمال تاک در زیراکس PARC توسط آلن کی ، دن اینگالز و آدل گلدبرگ توسعه یافت. Smalltalk-72 شامل یک محیط برنامه نویسی بود و به صورت پویا تایپ می شد و در ابتدا تفسیر می شد نه کامپایل . اسمال تاک به دلیل کاربرد شی گرایی در سطح زبان و محیط توسعه گرافیکی آن مورد توجه قرار گرفت. اسمال تاک نسخه های مختلفی را پشت سر گذاشت و علاقه به این زبان افزایش یافت. [10]در حالی که اسمال تاک تحت تأثیر ایده های معرفی شده در Simula 67 بود، به گونه ای طراحی شد که یک سیستم کاملاً پویا باشد که در آن کلاس ها می توانند به صورت پویا ایجاد و اصلاح شوند. [11]

در دهه 1970، Smalltalk جامعه Lisp را تحت تأثیر قرار داد تا تکنیک‌های مبتنی بر شی را که از طریق ماشین Lisp به توسعه‌دهندگان معرفی شده بودند، در خود بگنجانند . آزمایش با برنامه‌های افزودنی مختلف برای Lisp (مانند Loops و Flavors که چندین وراثت و میکس‌ها را معرفی می‌کنند) در نهایت منجر به Common Lisp Object System شد که برنامه‌نویسی کاربردی و برنامه‌نویسی شی‌گرا را ادغام می‌کند و امکان گسترش را از طریق یک پروتکل Meta-object فراهم می‌کند. در دهه 1980، تلاش‌هایی برای طراحی معماری‌های پردازنده انجام شد که شامل پشتیبانی سخت‌افزاری برای اشیاء در حافظه می‌شد، اما موفقیت‌آمیز نبود. مثالها عبارتند ازIntel iAPX 432 و Linn Smart Rekursiv .

در سال 1981، گلدبرگ شماره آگوست مجله Byte را ویرایش کرد و برنامه‌های Smalltalk و شی گرا را به مخاطبان بیشتری معرفی کرد. در سال 1986، انجمن ماشین‌های محاسباتی اولین کنفرانس برنامه‌نویسی شی گرا، سیستم‌ها، زبان‌ها و برنامه‌ها (OOPSLA) را برگزار کرد که به طور غیرمنتظره‌ای با حضور 1000 نفر برگزار شد. در اواسط دهه 1980 Objective-C توسط براد کاکس ، که از اسمال تاک در شرکت ITT استفاده کرده بود، توسعه یافت و بیارن استروستروپ ، که از سیمولا برای پایان نامه دکترای خود استفاده کرده بود، در نهایت به ساخت C++ شی گرا پرداخت. [10] در سال 1985، برتراند مایرهمچنین اولین طرح از زبان ایفل را تولید کرد . ایفل با تمرکز بر کیفیت نرم افزار، یک زبان برنامه نویسی صرفا شی گرا و نمادی است که از کل چرخه عمر نرم افزار پشتیبانی می کند. مایر روش توسعه نرم‌افزار ایفل را بر اساس تعداد کمی از ایده‌های کلیدی مهندسی نرم‌افزار و علوم کامپیوتر در ساخت نرم‌افزار شی‌گرا تشریح کرد . برای تمرکز بر کیفیت ایفل، مکانیزم قابلیت اطمینان Meyer، Design by Contract ضروری است که بخشی جدایی ناپذیر از روش و زبان است.

نمودار شاخص محبوبیت زبان برنامه نویسی TIOBE از سال 2002 تا 2018. در دهه 2000 جاوا شی گرا (آبی) و رویه C (سیاه) برای جایگاه برتر رقابت کردند.

در اوایل و اواسط دهه 1990 برنامه نویسی شی گرا به عنوان پارادایم برنامه نویسی غالب توسعه یافت، زمانی که زبان های برنامه نویسی پشتیبانی کننده از تکنیک ها به طور گسترده در دسترس قرار گرفتند. اینها شامل Visual FoxPro 3.0، [12] [13] [14] C++ ، [15] و دلفی [ نیاز به نقل قول ] بود. تسلط آن با افزایش محبوبیت رابط های کاربر گرافیکی که به شدت بر تکنیک های برنامه نویسی شی گرا متکی هستند، بیشتر شد. نمونه ای از یک کتابخانه رابط کاربری گرافیکی پویا و زبان OOP نزدیک مرتبط را می توان در چارچوب های Cocoa در Mac OS X یافت که درObjective-C ، یک برنامه افزودنی شی گرا و پویا برای پیام رسانی به C بر اساس اسمال تاک. ابزارهای OOP نیز محبوبیت برنامه نویسی رویداد محور را افزایش دادند (اگرچه این مفهوم به OOP محدود نمی شود).

در ETH زوریخ ، نیکلاوس ویرث و همکارانش موضوعاتی مانند انتزاع داده ها و برنامه نویسی مدولار را نیز مورد بررسی قرار داده بودند (اگرچه این مورد در دهه 1960 یا قبل از آن رایج بود). Modula-2 (1978) شامل هر دو، و طراحی بعدی آنها، Oberon ، شامل یک رویکرد متمایز به شی گرایی، کلاس ها، و مانند آن بود.

ویژگی‌های شی‌گرا به بسیاری از زبان‌های موجود از جمله Ada ، BASIC ، Fortran ، Pascal و COBOL اضافه شده‌اند . افزودن این ویژگی‌ها به زبان‌هایی که در ابتدا برای آن‌ها طراحی نشده بودند، اغلب منجر به مشکلاتی در سازگاری و نگهداری کد می‌شد.

اخیراً، تعدادی از زبان ها ظهور کرده اند که عمدتاً شی گرا هستند، اما با روش شناسی رویه ای نیز سازگار هستند. دو زبان از این قبیل Python و Ruby هستند. احتمالاً مهم‌ترین زبان‌های شی گرا اخیراً از نظر تجاری ، جاوا هستند که توسط Sun Microsystems توسعه یافته است ، و همچنین C# و Visual Basic.NET (VB.NET) که هر دو برای پلتفرم دات‌نت مایکروسافت طراحی شده‌اند . هر یک از این دو فریم ورک به روش خود، مزایای استفاده از OOP را با ایجاد یک انتزاع از پیاده سازی نشان می دهد. VB.NET و C# از وراثت بین زبانی پشتیبانی می‌کنند و به کلاس‌های تعریف‌شده در یک زبان اجازه می‌دهند تا کلاس‌های زیر کلاس تعریف‌شده در زبان دیگر را طبقه‌بندی کنند.

ویژگی ها

برنامه نویسی شی گرا از اشیا استفاده می کند، اما همه تکنیک ها و ساختارهای مرتبط مستقیماً در زبان هایی که ادعا می کنند از OOP پشتیبانی می کنند پشتیبانی نمی شوند. این عملیات بر روی عملوندها انجام می دهد. ویژگی‌های ذکر شده در زیر در میان زبان‌هایی که به‌شدت کلاس‌گرا و شی‌گرا (یا چند پارادایم با پشتیبانی OOP) در نظر گرفته می‌شوند، با استثناهای قابل توجهی که ذکر شد، رایج است. [16] [17] [18] [19]

به اشتراک گذاشته شده با زبان های غیر OOP

پشتیبانی از برنامه نویسی ماژولار امکان گروه بندی رویه ها را در فایل ها و ماژول ها برای اهداف سازمانی فراهم می کند. ماژول ها دارای فضای نام هستند بنابراین شناسه های یک ماژول با رویه یا متغیری که همان نام را در یک فایل یا ماژول دیگر به اشتراک می گذارد تضاد ندارند.

اشیاء و کلاسها

زبان‌هایی که از برنامه‌نویسی شی‌گرا (OOP) پشتیبانی می‌کنند، معمولاً از وراثت برای استفاده مجدد از کد و توسعه‌پذیری در قالب کلاس‌ها یا نمونه‌های اولیه استفاده می‌کنند. آنهایی که از کلاس ها استفاده می کنند از دو مفهوم اصلی پشتیبانی می کنند:

  • کلاس ها - تعاریف قالب داده و رویه های موجود برای یک نوع یا کلاس معین از شی. همچنین ممکن است خود شامل داده ها و رویه ها (معروف به متدهای کلاس) باشد، یعنی کلاس ها حاوی اعضای داده و توابع عضو هستند
  • اشیاء - نمونه هایی از کلاس ها

گاهی اوقات اشیاء با چیزهایی که در دنیای واقعی یافت می شوند مطابقت دارند. به عنوان مثال، یک برنامه گرافیکی ممکن است دارای اشیایی مانند "دایره"، "مربع"، "منو" باشد. یک سیستم خرید آنلاین ممکن است دارای مواردی مانند «سبد خرید»، «مشتری» و «محصول» باشد. [20] گاهی اوقات اشیاء موجودیت های انتزاعی تری را نشان می دهند، مانند یک شی که یک فایل باز را نشان می دهد، یا یک شی که خدمات ترجمه اندازه گیری ها را از ایالات متحده به متریک ارائه می دهد.

گفته می شود که هر شیء نمونه ای از یک کلاس خاص است (به عنوان مثال، یک شی با فیلد نام آن روی "Mary" تنظیم شده است، ممکن است نمونه ای از کلاس Employee باشد). رویه ها در برنامه نویسی شی گرا به عنوان روش ها شناخته می شوند . متغیرها به‌عنوان فیلد ، اعضا، ویژگی‌ها یا ویژگی‌ها نیز شناخته می‌شوند. این منجر به اصطلاحات زیر می شود:

  • متغیرهای کلاس - به کل کلاس تعلق دارند . از هر کدام فقط یک کپی وجود دارد
  • متغیرها یا ویژگی‌های نمونه – داده‌هایی که به اشیاء منفرد تعلق دارند . هر شیء دارای کپی مخصوص به خود از هر یک است
  • متغیرهای عضو - هم به متغیرهای کلاس و هم به متغیرهای نمونه ای اشاره دارد که توسط یک کلاس خاص تعریف شده اند
  • متدهای کلاس - به کل کلاس تعلق دارند و فقط به متغیرهای کلاس و ورودی های فراخوانی رویه دسترسی دارند.
  • متدهای نمونه - متعلق به اشیاء مجزا هستند و به متغیرهای نمونه برای شی خاصی که فراخوانی می شوند، ورودی ها و متغیرهای کلاس دسترسی دارند.

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

برنامه نویسی شی گرا که از کلاس ها استفاده می کند، گاهی اوقات برنامه نویسی مبتنی بر کلاس نامیده می شود ، در حالی که برنامه نویسی مبتنی بر نمونه اولیه معمولاً از کلاس ها استفاده نمی کند. در نتیجه، اصطلاحات بسیار متفاوت و در عین حال مشابهی برای تعریف مفاهیم شیء و نمونه استفاده می شود.

در برخی از زبان ها، کلاس ها و اشیاء را می توان با استفاده از مفاهیم دیگری مانند صفات و ترکیبات ترکیب کرد.

مبتنی بر کلاس در مقابل نمونه اولیه

در زبان های کلاس محور، کلاس ها از قبل تعریف می شوند و اشیاء بر اساس کلاس ها نمونه سازی می شوند. اگر دو شیء سیب و پرتقال از کلاس Fruit نمونه باشند، ذاتاً میوه هستند و تضمین می‌شود که می‌توانید آنها را به همان شیوه مدیریت کنید. به عنوان مثال یک برنامه نویس می تواند انتظار وجود همان ویژگی ها مانند color یا sugar_content یا is_ripe را داشته باشد.

در زبان های مبتنی بر نمونه اولیه ، اشیا موجودیت های اصلی هستند. حتی هیچ کلاسی وجود ندارد. نمونه اولیه یک شی فقط شی دیگری است که شی به آن مرتبط است. هر شی دارای یک پیوند نمونه اولیه (و فقط یک) است. اشیاء جدید را می توان بر اساس اشیاء موجود از قبل انتخاب شده به عنوان نمونه اولیه آنها ایجاد کرد. اگر شیء میوه وجود داشته باشد، می توانید دو شی متفاوت سیب و پرتقال را میوه بنامید، و هر دو سیب و پرتقال میوه به عنوان نمونه اولیه خود دارند. ایده طبقه میوه به صراحت وجود ندارد، اما به عنوانکلاس هم ارزی اشیایی که نمونه اولیه یکسانی دارند. ویژگی ها و روش های نمونه اولیه به تمام اشیاء کلاس هم ارزی تعریف شده توسط این نمونه اولیه واگذار می شود. ویژگی‌ها و روش‌هایی که به‌صورت جداگانه متعلق به شی هستند، نمی‌توانند توسط سایر اشیاء از همان کلاس هم ارزی به اشتراک گذاشته شوند. به عنوان مثال، ویژگی sugar_content ممکن است به طور غیرمنتظره ای در apple وجود نداشته باشد . فقط وراثت منفرد را می توان از طریق نمونه اولیه پیاده سازی کرد.

ارسال پویا / ارسال پیام

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

فراخوانی متد به عنوان ارسال پیام نیز شناخته می شود . این به عنوان یک پیام (نام روش و پارامترهای ورودی آن) است که برای ارسال به شیء ارسال می شود.

انتزاع داده

انتزاع داده ها یک الگوی طراحی است که در آن داده ها فقط برای توابع مرتبط معنایی قابل مشاهده هستند تا از سوء استفاده جلوگیری شود. موفقیت انتزاع داده ها منجر به ترکیب مکرر پنهان کردن داده ها به عنوان یک اصل طراحی در برنامه نویسی شی گرا و تابعی خالص می شود.

اگر یک کلاس به کد فراخوانی اجازه دسترسی به داده‌های شی داخلی را نمی‌دهد و فقط از طریق روش‌ها اجازه دسترسی را می‌دهد، این یک شکل قوی از انتزاع یا پنهان کردن اطلاعات است که به نام انتزاع شناخته می‌شود . برخی از زبان‌ها (به عنوان مثال جاوا) به کلاس‌ها اجازه می‌دهند تا محدودیت‌های دسترسی را به‌صراحت اعمال کنند، برای مثال داده‌های داخلی را با privateکلمه کلیدی مشخص می‌کنند و روش‌هایی را که برای استفاده توسط کدهای خارج از کلاس با publicکلمه کلیدی در نظر گرفته شده است، تعیین می‌کنند. متدها همچنین ممکن است در سطوح عمومی، خصوصی یا میانی طراحی شوند، مانند protected(که اجازه دسترسی از همان کلاس و زیر کلاس‌های آن را می‌دهد، اما نه اشیاء کلاس متفاوت). در زبان‌های دیگر (مانند پایتون) این فقط با قرارداد اجرا می‌شود (مثلاً، privateروش‌ها ممکن است نام‌هایی داشته باشند که با زیرخط شروع می‌شوند ).

کپسولاسیون

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

ترکیب، وراثت، و تفویض

اشیاء می توانند شامل اشیاء دیگری در متغیرهای نمونه خود باشند. این به عنوان ترکیب شی شناخته می شود . به عنوان مثال، یک شی در کلاس Employee ممکن است شامل (مستقیما یا از طریق یک اشاره گر) یک شی در کلاس Address، علاوه بر متغیرهای نمونه خودش مانند "first_name" و "position" باشد. ترکیب شیء برای نشان دادن روابط "has-a" استفاده می شود: هر کارمند یک آدرس دارد، بنابراین هر شیء کارمند به مکانی برای ذخیره یک شیء Address دسترسی دارد (خواه مستقیماً در خودش تعبیه شده باشد یا در یک مکان جداگانه که از طریق یک اشاره گر آدرس داده شده است) .

زبان هایی که از کلاس ها پشتیبانی می کنند تقریباً همیشه از وراثت پشتیبانی می کنند. این اجازه می دهد تا کلاس ها در یک سلسله مراتب مرتب شوند که نشان دهنده روابط "نوع است". برای مثال، کلاس Employee ممکن است از کلاس Person ارث ببرد. تمام داده ها و متدهای موجود برای کلاس والد نیز در کلاس فرزند با همین نام ظاهر می شوند. برای مثال، کلاس Person ممکن است متغیرهای "first_name" و "last_name" را با متد "make_full_name()" تعریف کند. اینها همچنین در کلاس Employee در دسترس خواهند بود، که ممکن است متغیرهای "موقعیت" و "حقوق" را اضافه کند. این تکنیک امکان استفاده مجدد آسان از همان رویه‌ها و تعاریف داده‌ها را فراهم می‌کند، علاوه بر این که به طور بالقوه روابط دنیای واقعی را به روشی بصری منعکس می‌کند. به جای استفاده از جداول پایگاه داده و برنامه های فرعی برنامه نویسی، توسعه دهنده از اشیایی استفاده می کند که کاربر ممکن است با آنها بیشتر آشنا باشد: اشیاء از دامنه برنامه آنها [21]

زیر کلاس ها می توانند روش های تعریف شده توسط سوپرکلاس ها را لغو کنند. وراثت چندگانه در برخی از زبان‌ها مجاز است، اگرچه این امر می‌تواند حل‌وفصل موارد لغو را پیچیده کند. برخی از زبان‌ها پشتیبانی ویژه‌ای از میکس‌ها دارند، اگرچه در هر زبانی با وراثت چندگانه، یک mixin صرفاً کلاسی است که نشان‌دهنده یک رابطه is-a-type نیست. مخلوط ها معمولاً برای افزودن روش های مشابه به چندین کلاس استفاده می شوند. به عنوان مثال، کلاس UnicodeConversionMixin ممکن است زمانی که در کلاس FileReader و کلاس WebPageScraper قرار می گیرد، یک روش unicode_to_ascii () ارائه دهد، که والد مشترکی ندارند.

کلاس های انتزاعی را نمی توان در اشیا مثال زد. آنها فقط به منظور ارث بردن به سایر طبقات "بتی" که می توانند نمونه سازی شوند وجود دارند. در جاوا finalمی توان از کلمه کلیدی برای جلوگیری از زیر کلاسه شدن یک کلاس استفاده کرد.

دکترین ترکیب بر وراثت حامی اجرای روابط دارای یک با استفاده از ترکیب به جای وراثت است. به عنوان مثال، به جای ارث بردن از کلاس Person، کلاس Employee می تواند به هر شیء Employee یک شی Person داخلی بدهد، که سپس این فرصت را دارد که از کد خارجی پنهان کند، حتی اگر کلاس Person دارای ویژگی ها یا متدهای عمومی زیادی باشد. برخی از زبان ها مانند Go به هیچ وجه از وراثت پشتیبانی نمی کنند.

« اصل باز/بسته » مدافع این است که کلاس‌ها و توابع «باید برای گسترش باز باشند، اما برای اصلاح بسته باشند».

تفویض اختیار یکی دیگر از ویژگی های زبانی است که می تواند به عنوان جایگزینی برای وراثت استفاده شود.

چند شکلی

زیر تایپ - نوعی چندشکلی - زمانی است که فراخوانی کد می تواند مستقل از کلاس در سلسله مراتب پشتیبانی شده باشد - کلاس والد یا یکی از فرزندان آن. در همین حال، نام عملیات یکسان در میان اشیاء در یک سلسله مراتب ارثی ممکن است رفتار متفاوتی داشته باشد.

به عنوان مثال، اشیاء از نوع Circle و Square از یک کلاس مشترک به نام Shape مشتق شده اند. تابع Draw برای هر نوع Shape آنچه را که برای رسم خود لازم است پیاده سازی می کند در حالی که فراخوانی کد می تواند نسبت به نوع خاصی از شکل ترسیم شده بی تفاوت بماند.

این نوع دیگری از انتزاع است که کدهای خارج از سلسله مراتب کلاس را ساده می کند و جداسازی قوی نگرانی ها را امکان پذیر می کند .

باز کردن بازگشت

در زبان‌هایی که از بازگشت باز پشتیبانی می‌کنند، روش‌های شی می‌توانند روش‌های دیگری را روی همان شی (از جمله خودشان) فراخوانی کنند، معمولاً از یک متغیر یا کلمه کلیدی خاص به نام thisیا selfاستفاده می‌کنند. این متغیر دیر کران است . به یک متد تعریف شده در یک کلاس اجازه می دهد تا متد دیگری را فراخوانی کند که بعداً در برخی از زیر کلاس های آن تعریف شده است.

زبان های OOP

سیمولا (1967) به طور کلی به عنوان اولین زبان با ویژگی های اولیه یک زبان شی گرا پذیرفته شده است. این برنامه برای ساختن برنامه های شبیه سازی ایجاد شد ، که در آن آنچه که اشیاء نامیده می شد مهمترین نمایش اطلاعات بودند. اسمال تاک (1972 تا 1980) نمونه اولیه دیگری است، و نمونه ای است که بسیاری از نظریه OOP با آن توسعه یافته است. در مورد درجه شی گرایی، تمایزات زیر را می توان انجام داد:

OOP در زبانهای پویا

در سال های اخیر، برنامه نویسی شی گرا به ویژه در زبان های برنامه نویسی پویا محبوب شده است . Python ، PowerShell ، Ruby و Groovy زبان‌های پویا هستند که بر اساس اصول OOP ساخته شده‌اند، در حالی که Perl و PHP از Perl 5 و PHP 4 ویژگی‌های شی گرا و ColdFusion از نسخه 6 اضافه کرده‌اند.

مدل شی سند اسناد HTML ، XHTML و XML در اینترنت دارای پیوندهایی با زبان محبوب جاوا اسکریپت / ECMAScript است. جاوا اسکریپت شاید شناخته شده ترین زبان برنامه نویسی مبتنی بر نمونه اولیه باشد که از شبیه سازی از نمونه های اولیه به جای ارث بردن از یک کلاس استفاده می کند (تضاد با برنامه نویسی مبتنی بر کلاس ). زبان اسکریپت نویسی دیگری که این رویکرد را اتخاذ می کند، Lua است .

OOP در یک پروتکل شبکه

پیام‌هایی که بین رایانه‌ها برای درخواست خدمات در یک محیط کلاینت-سرور جریان می‌یابند، می‌توانند به‌عنوان خطی‌سازی اشیاء تعریف‌شده توسط اشیاء کلاسی که هم برای کلاینت و هم برای سرور شناخته شده‌اند، طراحی شوند. به عنوان مثال، یک شی خطی ساده از یک فیلد طول، یک نقطه کد شناسایی کننده کلاس و یک مقدار داده تشکیل شده است. یک مثال پیچیده تر، فرمانی است که از طول و نقطه کد فرمان و مقادیر متشکل از اشیاء خطی شده که پارامترهای فرمان را نشان می دهد، تشکیل شده است. هر دستوری از این قبیل باید توسط سرور به شیئی هدایت شود که کلاس (یا سوپرکلاس) آن دستور را تشخیص داده و بتواند سرویس درخواستی را ارائه دهد. کلاینت ها و سرورها به بهترین شکل به عنوان ساختارهای شی گرا پیچیده مدل سازی می شوند. معماری مدیریت داده های توزیع شده(DDM) از این رویکرد استفاده کرد و از اشیاء کلاس برای تعریف اشیاء در چهار سطح از یک سلسله مراتب رسمی استفاده کرد:

  • فیلدهایی که مقادیر داده‌ای را که پیام‌ها را تشکیل می‌دهند، مانند طول، نقطه کد و مقادیر داده، تعریف می‌کنند.
  • اشیاء و مجموعه ای از اشیاء مشابه آنچه در برنامه Smalltalk برای پیام ها و پارامترها یافت می شود.
  • مدیرانی مشابه IBM i Objects ، مانند فهرست راهنمای فایل‌ها و فایل‌هایی که از ابرداده‌ها و رکوردها تشکیل شده‌اند. مدیران به طور مفهومی منابع حافظه و پردازش را برای اشیاء محتوی خود فراهم می کنند.
  • یک کلاینت یا سرور متشکل از تمام مدیران لازم برای اجرای یک محیط پردازش کامل، که از جنبه هایی مانند خدمات دایرکتوری، امنیت و کنترل همزمان پشتیبانی می کند.

نسخه اولیه DDM خدمات فایل توزیع شده را تعریف کرد. بعدها به عنوان پایه و اساس معماری پایگاه داده رابطه ای توزیع شده (DRDA) گسترش یافت.

الگوهای طراحی

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

وراثت و زیرتایپ رفتاری

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

الگوهای طراحی گروه چهار

الگوهای طراحی: عناصر نرم افزار شی گرا با قابلیت استفاده مجدد یک کتاب تأثیرگذار است که در سال 1994 توسط اریش گاما ، ریچارد هلم ، رالف جانسون و جان ولیسیدز منتشر شد که اغلب به صورت طنز از آن با عنوان "باند چهار" یاد می شود. همراه با بررسی قابلیت ها و مشکلات برنامه نویسی شی گرا، 23 مشکل برنامه نویسی رایج و الگوهای حل آنها را تشریح می کند. از آوریل 2007، این کتاب در سی و ششمین چاپ خود بود.

این کتاب الگوهای زیر را شرح می دهد:

شی گرایی و پایگاه داده

هم برنامه نویسی شی گرا و هم سیستم های مدیریت پایگاه داده رابطه ای (RDBMS) امروزه در نرم افزار بسیار رایج هستند . از آنجایی که پایگاه‌های داده رابطه‌ای اشیاء را مستقیماً ذخیره نمی‌کنند (اگرچه برخی از RDBMS‌ها دارای ویژگی‌های شی گرا برای تقریبی این هستند)، نیاز کلی به پل زدن بین دو جهان وجود دارد. مشکل پل زدن دسترسی های برنامه نویسی شی گرا و الگوهای داده با پایگاه های داده رابطه ای به نام عدم تطابق امپدانس شی رابطه ای شناخته می شود . تعدادی از رویکردها برای مقابله با این مشکل وجود دارد، اما هیچ راه حل کلی بدون جنبه های منفی وجود ندارد. [23] یکی از رایج‌ترین رویکردها، نگاشت شی رابطه‌ای است که در زبان‌های IDE مانندVisual FoxPro و کتابخانه هایی مانند Java Data Objects و Ruby on Rails ActiveRecord.

همچنین پایگاه داده های شی وجود دارد که می توان از آنها برای جایگزینی RDBMS ها استفاده کرد، اما از نظر فنی و تجاری به اندازه RDBMS ها موفق نبوده اند.

مدل سازی و روابط در دنیای واقعی

OOP را می توان برای مرتبط کردن اشیا و فرآیندهای دنیای واقعی با همتایان دیجیتالی استفاده کرد. با این حال، همه موافق نیستند که OOP نقشه‌برداری مستقیم دنیای واقعی را تسهیل می‌کند (به بخش نقد مراجعه کنید ) یا اینکه نقشه‌برداری دنیای واقعی حتی یک هدف ارزشمند است. برتراند مایر در ساخت نرم افزار شی گرا [24] استدلال می کند که یک برنامه مدلی از جهان نیست بلکه مدلی از بخشی از جهان است. "واقعیت یک پسر عمویی است که دو بار حذف شده است". در همان زمان، برخی از محدودیت های اصلی OOP ذکر شده است. [25] برای مثال، حل مشکل دایره-بیضی با استفاده از مفهوم وراثت OOP دشوار است .

با این حال، نیکلاوس ویرث (که این ضرب المثل را که اکنون به عنوان قانون ویرث شناخته می‌شود، رایج کرد : «نرم‌افزار با سرعت بیشتری کندتر از سخت‌افزار سریع‌تر می‌شود) در مورد OOP در مقاله‌اش، «ایده‌های خوب از طریق شیشه‌ی نگاه» گفت: «این پارادایم از نزدیک منعکس‌کننده ساختار سیستم‌ها «در دنیای واقعی»، و بنابراین برای مدل‌سازی سیستم‌های پیچیده با رفتارهای پیچیده مناسب است» [26] (تضاد اصل KISS ).

استیو یگ و دیگران خاطرنشان کردند که زبان‌های طبیعی فاقد رویکرد OOP برای اولویت‌بندی دقیق چیزها (اشیاء/ اسم‌ها ) قبل از اعمال (روش‌ها/ افعال ) هستند. [27] این مشکل ممکن است باعث شود OOP از راه حل های پیچیده تری نسبت به برنامه نویسی رویه ای رنج ببرد. [28]

OOP و کنترل جریان

OOP برای افزایش قابلیت استفاده مجدد و قابلیت نگهداری کد منبع ایجاد شد. [29] نمایش شفاف جریان کنترل هیچ اولویتی نداشت و قرار بود توسط یک کامپایلر مدیریت شود. با افزایش ارتباط سخت‌افزار موازی و کدگذاری چند رشته‌ای ، توسعه جریان کنترل شفاف مهم‌تر می‌شود، چیزی که رسیدن به آن با OOP دشوار است. [30] [31] [32] [33]

مسئولیت در مقابل طراحی مبتنی بر داده

طراحی مسئولیت‌محور کلاس‌ها را برحسب قرارداد تعریف می‌کند، یعنی یک کلاس باید حول یک مسئولیت و اطلاعاتی که به اشتراک می‌گذارد تعریف شود. این مورد توسط Wirfs-Brock و Wilkerson با طراحی مبتنی بر داده مقایسه می شود ، جایی که کلاس ها حول ساختارهای داده ای که باید نگه داشته شوند تعریف می شوند. نویسندگان معتقدند که طراحی مسئولیت محور ترجیح داده می شود.

دستورالعمل SOLID و GRASP

SOLID یک یادداشت اختراع شده توسط مایکل فیرز است که پنج اصل طراحی مهندسی نرم افزار را بیان می کند:

GRASP (الگوهای نرم افزار تخصیص مسئولیت عمومی) مجموعه دیگری از دستورالعمل هایی است که توسط کریگ لارمن حمایت می شود .

انتقاد

پارادایم OOP به دلایل متعددی مورد انتقاد قرار گرفته است، از جمله عدم تحقق اهداف اعلام شده خود در مورد قابلیت استفاده مجدد و مدولار بودن، [34] [35] و به دلیل تأکید بیش از حد بر یک جنبه از طراحی و مدل سازی نرم افزار (داده ها/اشیاء) به قیمت سایر موارد مهم. جنبه ها (محاسبات / الگوریتم ها). [36] [37]

لوکا کاردلی ادعا کرده است که کد OOP "ذاتا کارایی کمتری" نسبت به کد رویه‌ای دارد، که کامپایل OOP ممکن است طولانی‌تر طول بکشد، و اینکه زبان‌های OOP دارای "ویژگی‌های ماژولاریت بسیار ضعیف با توجه به گسترش و اصلاح کلاس هستند" و بسیار پیچیده هستند. . [34] نکته اخیر توسط جو آرمسترانگ ، مخترع اصلی Erlang تکرار شده است، که نقل شده است: [35]

مشکل زبان های شی گرا این است که آن ها تمام این محیط ضمنی را دارند که با خود حمل می کنند. تو یک موز می خواستی اما چیزی که به دست آوردی گوریلی بود که موز و کل جنگل را در دست داشت.

مطالعه ای توسط پوتوک و همکاران. تفاوت معنی داری در بهره وری بین رویکردهای OOP و رویه ای نشان نداده است. [38]

کریستوفر جی دیت اظهار داشت که مقایسه انتقادی OOP با سایر فناوری‌ها، مخصوصاً رابطه‌ای، به دلیل عدم وجود یک تعریف مورد توافق و دقیق از OOP دشوار است. [39] با این حال، Date و Darwen یک پایه نظری در OOP ارائه کرده اند که از OOP به عنوان نوعی سیستم نوع قابل تنظیم برای پشتیبانی از RDBMS استفاده می کند. [40]

لارنس کروبنر در مقاله‌ای ادعا کرد که در مقایسه با زبان‌های دیگر (گویش‌های LISP، زبان‌های کاربردی و غیره) زبان‌های OOP هیچ نقطه قوت منحصر به فردی ندارند و بار سنگینی از پیچیدگی غیر ضروری را تحمیل می‌کنند. [41]

الکساندر استپانوف شی گرایی را به طرز نامطلوبی با برنامه نویسی عمومی مقایسه می کند : [36]

به نظر من OOP از نظر فنی نادرست است. این تلاش می کند تا جهان را از نظر رابط هایی که در یک نوع واحد متفاوت است تجزیه کند. برای مقابله با مشکلات واقعی به جبرهای چند مرتبه نیاز دارید - خانواده هایی از رابط هایی که انواع مختلفی را در بر می گیرند. به نظر من OOP از نظر فلسفی نادرست است. ادعا می کند که همه چیز یک شی است. حتی اگر درست باشد، خیلی جالب نیست - گفتن اینکه همه چیز یک شی است، اصلاً چیزی نمی گوید.

پل گراهام پیشنهاد کرده است که محبوبیت OOP در شرکت های بزرگ به دلیل "گروه های بزرگ (و اغلب در حال تغییر) برنامه نویسان متوسط ​​است". به گفته گراهام، نظم و انضباط تحمیل شده توسط OOP از هر برنامه نویسی از "ضرر دادن بیش از حد" جلوگیری می کند. [42]

لئو برودی ارتباطی بین ماهیت مستقل اشیاء و تمایل به تکرار کد [43] را پیشنهاد کرده است که برخلاف اصل خودت تکرار نشو [44] توسعه نرم افزار است.

استیو یگ اشاره کرد که برخلاف برنامه نویسی تابعی : [45]

برنامه نویسی شی گرا، اسم ها را در اولویت قرار می دهد. چرا اینقدر تلاش می کنید که یک قسمت از سخنرانی را روی یک پایه قرار دهید؟ چرا باید یک نوع مفهوم بر دیگری ارجحیت داشته باشد؟ اینطور نیست که OOP به طور ناگهانی افعال را در طرز فکر واقعی ما کمتر کرده باشد. این یک چشم انداز عجیب و غریب است.

ریچ هیکی ، خالق Clojure ، سیستم های شی را به عنوان مدل های بسیار ساده از دنیای واقعی توصیف کرد. او بر ناتوانی OOP در مدل‌سازی درست زمان تاکید کرد، که با افزایش همزمان سیستم‌های نرم‌افزاری مشکل‌ساز می‌شود. [37]

Eric S. Raymond ، برنامه نویس یونیکس و مدافع نرم افزار منبع باز ، از ادعاهایی که برنامه نویسی شی گرا را به عنوان "یک راه حل واقعی" معرفی می کند، انتقاد کرده است و نوشته است که زبان های برنامه نویسی شی گرا تمایل به تشویق برنامه های لایه ای ضخیم دارند. از بین بردن شفافیت [46] ریموند این را به طرز نامطلوبی با رویکرد یونیکس و زبان برنامه نویسی C مقایسه می کند. [46]

راب پایک ، برنامه نویسی که در ایجاد UTF-8 و Go نقش دارد، برنامه نویسی شی گرا را " اعداد رومی محاسبات" نامیده است [47] و گفته است که زبان های OOP اغلب تمرکز را از ساختارهای داده و الگوریتم ها به انواع تغییر می دهند. [48] ​​علاوه بر این، او نمونه‌ای از یک استاد جاوا را ذکر می‌کند که راه‌حل «اصطلاح‌آمیز» برای یک مسئله، ایجاد شش کلاس جدید بود، نه صرفاً استفاده از جدول جستجو . [49]

معناشناسی رسمی

اشیا موجودیت های زمان اجرا در یک سیستم شی گرا هستند. آنها ممکن است نشان دهنده یک شخص، یک مکان، یک حساب بانکی، جدولی از داده ها یا هر موردی باشند که برنامه باید آنها را مدیریت کند.

چندین تلاش برای رسمی کردن مفاهیم مورد استفاده در برنامه نویسی شی گرا صورت گرفته است. مفاهیم و ساختارهای زیر به عنوان تفسیر مفاهیم OOP استفاده شده است:

تلاش‌ها برای یافتن یک تعریف یا نظریه اجماع در پشت اشیاء چندان موفق نبوده است (با این حال، برای تعاریف رسمی بسیاری از مفاهیم و سازه‌های OOP ، به Abadi & Cardelli, A Theory of Objects [51] مراجعه کنید)، و اغلب به طور گسترده با هم تفاوت دارند. به عنوان مثال، برخی از تعاریف بر فعالیت های ذهنی تمرکز دارند و برخی بر ساختار برنامه. یکی از تعاریف ساده‌تر این است که OOP عمل استفاده از ساختارهای داده یا آرایه‌های "نقشه" است که می‌تواند حاوی توابع و نشانگرهایی به نقشه‌های دیگر باشد، همگی با مقداری قند نحوی و محدوده‌ای در بالا. وراثت را می توان با شبیه سازی نقشه ها (که گاهی اوقات "نمونه سازی" نامیده می شود) انجام داد.

همچنین ببینید

سیستم ها

زبانهای مدلسازی

منابع

  1. ^ کیندلر، ای. کریوی، آی (2011). "شبیه سازی شی گرا سیستم ها با کنترل پیچیده". مجله بین المللی سیستم های عمومی: 313-343. {{cite journal}}:Cite journal requires |journal= (help)
  2. ^ لوئیس، جان؛ لوفتوس، ویلیام (2008). راه حل های نرم افزار جاوا مبانی طراحی برنامه نویسی ویرایش ششم . ISBN . Pearson Education Inc 978-0-321-53205-3.، بخش 1.6 "برنامه نویسی شی گرا"
  3. ^ مک کارتی، جی. برایتون، آر . ادواردز، دی . فاکس، پی . هودس، ال . لاکهام، دی . مالینگ، ک . پارک، دی . راسل، اس. (مارس 1960). "راهنمای برنامه نویسان LISP I" (PDF) . بوستون ، ماساچوست : گروه هوش مصنوعی، مرکز محاسبات MIT و آزمایشگاه تحقیقاتی: 88f. بایگانی شده از نسخه اصلی (PDF) در 17 جولای 2010. در patois محلی MIT، فهرست‌های تداعی [نمادهای اتمی] به‌عنوان «فهرست‌های دارایی» نیز شناخته می‌شوند، و نمادهای اتمی گاهی اوقات «اشیاء» نامیده می‌شوند. {{cite journal}}: Cite journal requires |journal= (help)
  4. ^ مک کارتی، جان ؛ آبراهامز، پل دبلیو. ادواردز، دانیل جی . هارت، سواپنیل د. لوین، مایکل اول (1962). راهنمای برنامه نویس LISP 1.5 . مطبوعات MIT . پ. 105 . شابک 978-0-262-13011-0. شی - مترادف نماد اتمی
  5. ^ a b "دکتر آلن کی در مورد معنای "برنامه نویسی شی گرا". 2003 . بازیابی شده در 11 فوریه 2010 .
  6. ساترلند، IE (30 ژانویه 1963). "Sketchpad: یک سیستم ارتباطی گرافیکی انسان و ماشین" . گزارش فنی شماره 296، آزمایشگاه لینکلن، موسسه فناوری ماساچوست از طریق مرکز اطلاعات فنی دفاعی (stinet.dtic.mil) . بازبینی شده در 17 جولای 2019 .[ لینک مرده دائمی ]
  7. توسعه زبان‌های سیمولا، کریستن نایگارد ، اول یوهان دال ، ص 254 Uni-kl.ac.at
  8. ^ راس، داگ. "اولین زبان مهندسی نرم افزار" . جدول زمانی آزمایشگاه LCS/AI . آزمایشگاه علوم کامپیوتر و هوش مصنوعی MIT . بازبینی شده در 13 مه 2010 .
  9. ^ a b Holmevik، Jan Rune (1994). "تدوین شبیه‌سازی: مطالعه تاریخی پیدایش تکنولوژی" (PDF) . IEEE Annals of the History of Computing . 16 (4): 25-37. doi : 10.1109/85.329756 . S2CID 18148999 . بایگانی شده از نسخه اصلی (PDF) در 30 اوت 2017 . بازبینی شده در 3 مارس 2018 .  
  10. ^ a b برتراند مایر (2009). Touch of Class: آموزش برنامه نویسی خوب با اشیاء و قراردادها . Springer Science & Business Media. پ. 329. Bibcode : 2009tclp.book.....M . شابک 978-3-540-92144-8.
  11. ^ کی، آلن. "تاریخ اولیه اسمال تاک" . بایگانی شده از نسخه اصلی در 10 جولای 2008 . بازبینی شده در 13 سپتامبر 2007 .
  12. ^ 1995 (ژوئن) Visual FoxPro 3.0، FoxPro از یک زبان رویه ای به یک زبان شی گرا تبدیل شد. Visual FoxPro 3.0 یک کانتینر پایگاه داده، قابلیت های یکپارچه کلاینت/سرور، پشتیبانی از فناوری های ActiveX، و OLE Automation و پشتیبانی تهی را معرفی می کند. خلاصه ای از انتشارات فاکس
  13. ^ وب سایت FoxPro History: Foxprohistory.org
  14. ^ راهنمای بازبینان 1995 برای Visual FoxPro 3.0: DFpug.de
  15. خورانا، روهیت (1 نوامبر 2009). برنامه نویسی شی گرا با C++، 1E . شابک 978-81-259-2532-3.
  16. دبورا جی آرمسترانگ. کوارک های توسعه شی گرا . بررسی نزدیک به 40 سال ادبیات محاسباتی که تعدادی از مفاهیم اساسی موجود در اکثریت بزرگ تعاریف OOP را به ترتیب نزولی از محبوبیت شناسایی کرد: ارث، شیء، کلاس، کپسولاسیون، روش، ارسال پیام، چند شکلی و انتزاع.
  17. جان سی. میچل ، مفاهیم در زبان های برنامه نویسی ، انتشارات دانشگاه کمبریج، 2003، ISBN 0-521-78098-5 ، ص278. فهرست ها: اعزام پویا، انتزاع، چند شکلی زیرنوع، و وراثت. 
  18. مایکل لی اسکات، عمل شناسی زبان برنامه نویسی ، ویرایش 2، مورگان کافمن، 2006، ISBN 0-12-633951-1 ، ص. 470. کپسولاسیون، وراثت، و ارسال پویا را فهرست می کند. 
  19. پیرس، بنجامین (2002). انواع و زبان های برنامه نویسی مطبوعات MIT. شابک 978-0-262-16209-8.، بخش 18.1 "برنامه نویسی شی گرا چیست؟" فهرست‌ها: ارسال پویا، کپسوله‌سازی یا چند روش (ارسال چندگانه)، چندشکلی فرعی، وراثت یا تفویض، بازگشت باز ("this"/"self")
  20. بوچ، گریدی (1986). مهندسی نرم افزار با آدا . ادیسون وسلی پ. 220. شابک 978-0-8053-0608-8. شاید بزرگترین نقطه قوت یک رویکرد شی گرا برای توسعه این باشد که مکانیزمی ارائه می دهد که مدلی از دنیای واقعی را به تصویر می کشد.
  21. یاکوبسن، ایوار؛ مگنوس کریسترسون؛ پاتریک جانسون؛ گونار اورگارد (1992). مهندسی نرم افزار شی گرا . مطبوعات ACM Addison-Wesley. صص  43-69 . شابک 978-0-201-54435-0.
  22. «زبان برنامه نویسی زمرد» . 26 فوریه 2011.
  23. نیوارد، تد (26 ژوئن 2006). "ویتنام علوم کامپیوتر" . قابلیت همکاری اتفاق می افتد. بایگانی شده از نسخه اصلی در 4 جولای 2006 . بازیابی شده در 2 ژوئن 2010 .
  24. ^ مایر، چاپ دوم، ص. 230
  25. ^ M.Trofimov، OOOP - سومین راه حل "O": OOP را باز کنید. کلاس اول، OMG ، 1993، جلد. 3، مسأله 3، ص14.
  26. ویرث، نیکلاوس (2006). "ایده های خوب، از طریق شیشه" (PDF) . کامپیوتر . 39 (1): 28-39. doi : 10.1109/mc.2006.20 . S2CID 6582369 . بایگانی شده از نسخه اصلی (PDF) در 12 اکتبر 2016 . بازبینی شده در 2 اکتبر 2016 .  
  27. Yegge, Steve (30 مارس 2006). "اعدام در قلمرو اسم" . steve-yegge.blogspot.com . بازیابی شده در 3 جولای 2010 .
  28. بورونچیک، تیموتی (11 ژوئن 2009). "چه مشکلی با OOP وجود دارد" . zaemis.blogspot.com . بازیابی شده در 3 جولای 2010 .
  29. امبلر، اسکات (1 ژانویه 1998). "نگاهی واقع بینانه به استفاده مجدد شی گرا" . drdobbs.com . بازبینی شده در 4 جولای 2010 .
  30. شلی، اساف (22 اوت 2008). "نقایص مدل سازی شی گرا" . شبکه نرم افزاری اینتل بازبینی شده در 4 جولای 2010 .
  31. جیمز، جاستین (1 اکتبر 2007). "چند ریسمانی یک فعل است نه یک اسم" . techrepublic.com. بایگانی شده از نسخه اصلی در 10 اکتبر 2007 . بازیابی شده در 4 جولای 2010 .
  32. شلی، اساف (22 اوت 2008). "نحوه: برنامه نویسی چند هسته ای (چند پردازشی) دستورالعمل های طراحی کلاس ویژوال C++، توابع اعضا" . support.microsoft.com . بازیابی شده در 4 جولای 2010 .
  33. رابرت هارپر (17 آوریل 2011). "چند نظر در مورد آموزش FP" . وبلاگ نوع وجودی . بازیابی شده در 5 دسامبر 2011 .
  34. ^ a b Cardelli، Luca (1996). "ویژگی های مهندسی بد زبان های شی گرا" . کامپیوتر ACM. Surv _ 28 (4es): 150–es. doi : 10.1145/242224.242415 . ISSN 0360-0300 . S2CID 12105785 . بازبینی شده در 21 آوریل 2010 .  
  35. ^ a b آرمسترانگ، جو. در برنامه نویسان در کار: تأملاتی در مورد هنر برنامه نویسی. پیتر سیبل، ویرایش. Codersatwork.com بایگانی شده در 5 مارس 2010 در Wayback Machine ، مشاهده شده در 13 نوامبر 2009.
  36. ^ a b استپانوف، الکساندر . "STLport: مصاحبه ای با A. Stepanov" . بازبینی شده در 21 آوریل 2010 .
  37. ^ a b Rich Hickey، JVM Languages ​​Summit 2009 سخنرانی کلیدی، آیا هنوز آنجا هستیم؟ نوامبر 2009.
  38. ^ پوتوک، توماس؛ ملادن ووک; اندی ریندوس (1999). "تحلیل بهره وری از نرم افزار شی گرا توسعه یافته در یک محیط تجاری" (PDF) . نرم افزار: تمرین و تجربه . 29 (10): 833-847. doi : 10.1002/(SICI)1097-024X(199908)29:10<833::AID-SPE258>3.0.CO;2-P . بازبینی شده در 21 آوریل 2010 .
  39. ^ تاریخ CJ، مقدمه ای بر سیستم های پایگاه داده، ویرایش ششم، صفحه 650
  40. سی جی دیت، هیو دارون. بنیاد سیستم های پایگاه داده آینده: مانیفست سوم (ویرایش دوم)
  41. کروبنر، لارنس. "برنامه نویسی شی گرا یک فاجعه گران قیمت است که باید پایان یابد . " smashcompany.com. بایگانی شده از نسخه اصلی در 14 اکتبر 2014 . بازبینی شده در 14 اکتبر 2014 .
  42. ^ گراهام، پل . "چرا ARC به ویژه شی گرا نیست" . PaulGraham.com _ بازیابی شده در 13 نوامبر 2009 .
  43. برودی، لئو (1984). چهارم فکر کردن (PDF) . ص 92-93 . بازبینی شده در 4 مه 2018 .
  44. ^ هانت، اندرو. "خودت را تکرار نکن " دسته برنامه نویسی افراطی . بازبینی شده در 4 مه 2018 .
  45. «حرف های بلاگ استیو: اعدام در قلمرو اسم ها» . بازیابی شده در 20 مه 2020 .
  46. ^ a b اریک اس. ریموند (2003). "هنر برنامه نویسی یونیکس: یونیکس و زبان های شی گرا" . بازبینی شده در ۶ اوت ۲۰۱۴ .
  47. پایک، راب (2 مارس 2004). "[9fans] Re: Threads: Sewing badges of honor on a Kernel" . comp.os.plan9 (لیست پستی) . بازبینی شده در 17 نوامبر 2016 .
  48. پایک، راب (25 ژوئن 2012). "کمتر به صورت تصاعدی بیشتر" . بازبینی شده در 1 اکتبر 2016 .
  49. پایک، راب (14 نوامبر 2012). "چند سال پیش من این صفحه را دیدم" . بایگانی شده از نسخه اصلی در 14 آگوست 2018 . بازبینی شده در 1 اکتبر 2016 .
  50. ^ نظرسنجی، اریک. "زیر تایپ و وراثت برای انواع داده های طبقه بندی شده" (PDF) . بازیابی شده در 5 ژوئن 2011 .
  51. ^ الف آبادی، مارتین ؛ کاردلی، لوکا (1996). نظریه اشیاء . Springer-Verlag New York, Inc. ISBN 978-0-387-94775-4. بازبینی شده در 21 آوریل 2010 .

ادامه مطلب

پیوندهای خارجی