Object-oriented programming

UML notation for a class. This Button class has variables for data, and functions. Through inheritance, a subclass can be created as a subset of the Button class. Objects are instances of a class.

Object-oriented programming (OOP) is a programming paradigm based on objects[1]software entities that encapsulatedata and function(s). An OOP computer program consists of objects that interact with one another.[2][3] An OOP language is one that provides object-oriented programming features, but as the set of features that contribute to OOP is contested, classifying a language as OOP – and the degree to which it supports OOP – is debatable. As paradigms are not mutually exclusive, a language can be multi-paradigm (i.e. categorized as more than only OOP).

Notable languages with OOP support include Ada, ActionScript, C++, Common Lisp, C#, Dart, Eiffel, Fortran 2003, Haxe, Java,[4]JavaScript, Kotlin, Logo, MATLAB, Objective-C, Object Pascal, Perl, PHP, Python, R, Raku, Ruby, Scala, SIMSCRIPT, Simula, Smalltalk, Swift, Vala and Visual Basic (.NET).

History

بدأت فكرة "الكائنات" في البرمجة مع مجموعة الذكاء الاصطناعي في معهد ماساتشوستس للتكنولوجيا (MIT) في أواخر الخمسينيات وأوائل الستينيات. في ذلك الوقت، كان مصطلح "الكائن" يشير إلى وحدات LISP ذات خصائص محددة (سمات). [ 5 ] [ 6 ] ومن الأمثلة المبكرة الأخرى برنامج Sketchpad الذي ابتكره إيفان ساذرلاند في معهد ماساتشوستس للتكنولوجيا في الفترة 1960-1961. في مسرد تقريره التقني، عرّف ساذرلاند مصطلحات مثل "الكائن" و"النسخة" (مع تغطية مفهوم الفئة بمصطلح "الرئيسي" أو "التعريف")، وإن كان ذلك مخصصًا للتفاعل الرسومي. [ 7 ] لاحقًا، في عام 1968، ربطت لغة البرمجة ALGOL ، AED-0، وهي نسخة معهد ماساتشوستس للتكنولوجيا ، بين هياكل البيانات ("plexes") والإجراءات، مما مهّد الطريق لما سُمّي لاحقًا "الرسائل" و"الأساليب" و"الدوال الأعضاء". [ 8 ] [ 9 ] كانت مواضيع مثل تجريد البيانات والبرمجة المعيارية من النقاط الشائعة للنقاش في ذلك الوقت.

في غضون ذلك، طُوِّرت لغة سيمولا في النرويج خلال الفترة من 1961 إلى 1967. [ 8 ] وقد أدخلت سيمولا مفاهيم أساسية في البرمجة الكائنية، مثل الأصناف ، والوراثة، والربط الديناميكي . [ 10 ] استُخدمت سيمولا بشكل رئيسي من قِبل الباحثين العاملين في مجال النمذجة الفيزيائية ، مثل حركة السفن ومحتوياتها عبر موانئ الشحن. [ 10 ] وتُعتبر سيمولا عمومًا أول لغة تتمتع بالخصائص والإطار الأساسيين للغة كائنية التوجه. [ 11 ]

لقد فكرت في أن الأشياء تشبه الخلايا البيولوجية و/أو أجهزة الكمبيوتر الفردية على شبكة، ولا يمكنها التواصل إلا من خلال الرسائل (لذا جاءت الرسائل في البداية - استغرق الأمر بعض الوقت لمعرفة كيفية القيام بالرسائل في لغة برمجة بكفاءة كافية لتكون مفيدة).

آلان كاي، [ 1 ]

بدأ آلان كاي، متأثرًا بكلٍ من معهد ماساتشوستس للتكنولوجيا ولغة سيمولا، بتطوير أفكاره الخاصة في نوفمبر 1966. ثم ابتكر لغة سمول توك ، وهي لغة برمجة كائنية التوجه مؤثرة. وبحلول عام 1967، كان كاي يستخدم مصطلح "البرمجة كائنية التوجه" في أحاديثه. [ 1 ] ورغم أنه يُلقب أحيانًا بـ"أبو" البرمجة كائنية التوجه، [ 12 ] فقد صرّح كاي بأن أفكاره تختلف عن المفهوم الشائع للبرمجة كائنية التوجه، وألمح إلى أن الأوساط العلمية في مجال علوم الحاسوب لم تتبنَّ فكرته. [ 1 ] وتشير مذكرة صادرة عن معهد ماساتشوستس للتكنولوجيا عام 1976، شاركت في كتابتها باربرا ليسكوف، إلى لغات سيمولا 67 ، وكلو ، وألفارد كلغات كائنية التوجه، لكنها لا تذكر لغة سمول توك. [ 13 ]

في سبعينيات القرن العشرين، طُوِّرت النسخة الأولى من لغة البرمجة سمول توك في مركز أبحاث زيروكس بارك على يد آلان كاي ، ودان إنجلز، وأديل غولدبرغ . تميزت سمول توك-72 باستخدامها للكائنات على مستوى اللغة وبيئة التطوير الرسومية الخاصة بها. [ 14 ] كانت سمول توك نظامًا ديناميكيًا بالكامل، يسمح للمستخدمين بإنشاء وتعديل الفئات أثناء عملهم. [ 15 ] وقد طُوِّر جزء كبير من نظرية البرمجة الكائنية التوجه في سياق سمول توك، مثل الوراثة المتعددة. [ 16 ]

في أواخر سبعينيات وثمانينيات القرن العشرين، برزت البرمجة الكائنية التوجه (OOP) بشكل ملحوظ. بدأ تطوير لغة Flavors Lisp الكائنية التوجه عام 1979، حيث قدمت مفهومي الوراثة المتعددة والمزج (mixins) . [ 17 ] في أغسطس 1981، سلطت مجلة Byte الضوء على لغة Smalltalk والبرمجة الكائنية التوجه، مقدمةً هذه الأفكار لجمهور واسع. [ 18 ] تأثر نظام الكائنات LOOPS، الخاص بلغة Interlisp -D، بكلمتي Smalltalk وFlavors، ونُشرت ورقة بحثية عنه عام 1982. [ 19 ] في عام 1986، حضر المؤتمر الأول للبرمجة الكائنية التوجه والأنظمة واللغات والتطبيقات ( OOPSLA ) ألف شخص. شكل هذا المؤتمر بداية الجهود المبذولة لتوحيد أنظمة الكائنات في لغة Lisp، والتي أدت في النهاية إلى نظام Common Lisp Object System . في ثمانينيات القرن العشرين، بُذلت بعض المحاولات لتصميم بنى معالجات تتضمن دعمًا ماديًا للكائنات في الذاكرة ، لكنها لم تُكلل بالنجاح. تتضمن الأمثلة Intel iAPX 432 و Linn Smart Rekursiv .

في منتصف ثمانينيات القرن العشرين، ظهرت لغات برمجة كائنية التوجه جديدة مثل أوبجكتيف-سي ، وسي++ ، ولغة إيفل . طُوِّرت أوبجكتيف-سي على يد براد كوكس ، الذي كان يستخدم لغة سمول توك في شركة آي تي ​​تي. أما بيارن ستروستروب، فقد ابتكر لغة سي++ استنادًا إلى خبرته في استخدام لغة سيمولا في أطروحته للدكتوراه. [ 14 ] وفي عام 1985، وضع برتراند ماير التصميم الأول للغة إيفل، والذي ركز على جودة البرمجيات باستخدام منهجية التصميم التعاقدي . [ 20 ]

في تسعينيات القرن الماضي، أصبحت البرمجة الكائنية التوجه (OOP) الأسلوب الرئيسي للبرمجة، لا سيما مع ازدياد عدد اللغات التي تدعمها. ومن بين هذه اللغات: فيجوال فوكس برو 3.0، [ 21 ] [ 22 ] وسي++ ، [ 23 ] ودلفي . وازدادت شعبية البرمجة الكائنية التوجه مع ظهور واجهات المستخدم الرسومية ، التي استخدمت الكائنات للأزرار والقوائم وغيرها من العناصر. ومن الأمثلة المعروفة على ذلك إطار عمل كوكوا من آبل ، المستخدم في نظام ماك أو إس والمكتوب بلغة أوبجكتيف-سي . كما ساهمت أدوات البرمجة الكائنية التوجه في تعزيز شعبية البرمجة الموجهة بالأحداث .

في المعهد الفدرالي السويسري للتكنولوجيا في زيورخ ، ابتكر نيكلاوس ويرث وزملاؤه مناهج جديدة للبرمجة الكائنية التوجه. تضمنت منهجيتا Modula-2 (1978) و Oberon (1987) نهجًا مميزًا للبرمجة الكائنية التوجه، والفئات، والتحقق من الأنواع عبر حدود الوحدات. لا يُعدّ مفهوم الوراثة واضحًا في تصميم ويرث، إذ أن مصطلحاته تُشير إلى الاتجاه المعاكس: يُطلق عليه اسم "امتداد النوع"، وتكون وجهة النظر من الأصل إلى الوارث.

تم تعزيز العديد من لغات البرمجة التي تم تطويرها في البداية قبل أن تصبح البرمجة الكائنية شائعة بميزات كائنية التوجه، بما في ذلك Ada و BASIC و Fortran و Pascal و COBOL .

سمات

تختلف خصائص البرمجة الكائنية التي توفرها لغات البرمجة. فيما يلي بعض الخصائص الشائعة للغات البرمجة الكائنية. [ 24 ] [ 25 ] [ 26 ] [ 27 ] يصعب مقارنة البرمجة الكائنية بأنماط أخرى، مثل البرمجة العلائقية ، لعدم وجود تعريف واضح ومتفق عليه للبرمجة الكائنية. [ 28 ]

التغليف وإخفاء المعلومات

يمكن أن يشير إخفاء المعلومات وتغليفها إلى عدة مفاهيم ذات صلة:

Some programming languages, like Java, provide information hiding via visibility key words (private and public).[30] Some languages like Python don't provide a visibility feature, but developers might follow a convention such as starting a private member name with an underscore. Intermediate levels of access also exist, such as Java's protected keyword, (which allows access from the same class and its subclasses, but not objects of a different class), and the internal keyword in C#, Swift, and Kotlin, which restricts access to files within the same module.[31]

Supporters of information hiding and data abstraction say it makes code easier to reuse and intuitively represents real-world situations.[32][33] However, others argue that OOP does not enhance readability or modularity.[34][35]Eric S. Raymond has written that OOP languages tend to encourage thickly layered programs that destroy transparency.[36] Raymond compares this unfavourably to the approach taken with Unix and the C language.[36]

SOLID includes the open/closed principle, which says that classes and functions should be "open for extension, but closed for modification". Luca Cardelli has stated that OOP languages have "extremely poor modularity properties with respect to class extension and modification", and tend to be extremely complex.[34] The latter point is reiterated by Joe Armstrong, the principal inventor of Erlang, who is quoted as saying:[35]

The problem with object-oriented languages is they've got all this implicit environment that they carry around with them. You wanted a banana but what you got was a gorilla holding the banana and the entire jungle.

Leo Brodie says that information hiding can lead to duplicate code,[37] which goes against the don't repeat yourself rule of software development.[38]

Inheritance

Inheritance can be supported via the class or the prototype, which have differences but use similar terms like object and instance.

Class-based

في البرمجة القائمة على الأصناف ، وهي النوع الأكثر شيوعًا من البرمجة الكائنية التوجه، يُعد الكائن نسخةً من صنف. يُعرّف الصنف البيانات (المتغيرات) والأساليب (المنطق). يُنشأ الكائن عبر الدالة البانية . لكل نسخة من الصنف نفس مجموعة المتغيرات والأساليب. قد تتضمن العناصر ما يلي:

  • متغير الفئة – ينتمي إلى الفئة نفسها؛ جميع كائنات الفئة تشترك في نسخة واحدة
  • متغير النسخة – ينتمي إلى كائن؛ كل كائن لديه نسخته الخاصة من هذه المتغيرات
  • متغير العضو - يشير إلى كل من متغيرات الفئة ومتغيرات النسخة الخاصة بالفئة
  • طريقة الفئة - لا يمكن استخدام سوى متغيرات الفئة
  • طريقة الكائن - تنتمي إلى كائن؛ ويمكنها استخدام متغيرات الكائن ومتغيرات الفئة.

قد ترث الفئات من فئات أخرى، مما يُنشئ تسلسلًا هرميًا للفئات: حالة ترث فيها فئة فرعية من فئة أصلية. على سبيل المثال، Employeeقد ترث فئة من Personفئة أخرى تُزوّد ​​كائن الموظف (Employee) بالمتغيرات من Personالفئة الأصلية. يمكن للفئة الفرعية إضافة متغيرات وأساليب لا تؤثر على الفئة الأصلية. تسمح معظم لغات البرمجة أيضًا للفئة الفرعية بتجاوز أساليب الفئة الأصلية. تدعم بعض اللغات الوراثة المتعددة ، حيث يمكن للفئة أن ترث من أكثر من فئة، وتدعم لغات أخرى بالمثل المزيجات أو السمات . على سبيل المثال، قد يُضيف مزيج يُسمى UnicodeConversionMixin الأسلوب unicode_to_ascii() إلى كل من فئة قارئ الملفات (FileReader) وفئة كاسر صفحات الويب (WebPageScraper).

لا يمكن إنشاء كائن من فئة مجردة بشكل مباشر. فهي تُستخدم فقط كفئة أساسية.

أما الفئات الأخرى فهي فئات مساعدة تحتوي فقط على متغيرات وأساليب خاصة بالفئة، ولا يُقصد بها أن يتم إنشاء مثيلات منها أو اشتقاق فئات فرعية منها. [ 39 ]

قائم على النموذج الأولي

بدلاً من تقديم مفهوم الفئة، في البرمجة القائمة على النماذج الأولية ، يرتبط الكائن بكائن آخر يُسمى نموذجه الأولي أو أصله . في لغة Self، قد يكون للكائن عدة أصول أو لا أصول على الإطلاق، [ 40 ] ولكن في لغة جافا سكريبت ، وهي اللغة الأكثر شيوعًا في البرمجة القائمة على النماذج الأولية، يكون للكائن رابط نموذج أولي واحد فقط، يصل إلى الكائن الأساسي الذي يكون نموذجه الأولي فارغًا (null).

يعمل النموذج الأولي كنموذج للكائنات الجديدة. على سبيل المثال، إذا كان لديك كائن fruit، يمكنك إنشاء كائنين آخرين appleيشتركان orangeفي سمات fruitالنموذج الأولي. كما تسمح اللغات القائمة على النماذج الأولية للكائنات بامتلاك خصائصها الفريدة، لذا appleقد يمتلك الكائن سمة معينة sugar_content، بينما لا يمتلكها الكائنان orangeالآخران .fruit

لا يوجد ميراث

In all OOP languages, via object composition, an object can contain other objects. For example, an Employee object might contain an Address object, along with other information like name and position. Composition is a "has-a" relationships, like "an employee has an address". Some languages, like Go, don't support inheritance.[41] Instead, they encourage "composition over inheritance", where objects are built using smaller parts instead of parent-child relationships. For example, instead of inheriting from class Person, the Employee class could simply contain a Person object. This lets the Employee class control how much of Person it exposes to other parts of the program. Delegation is another language feature that can be used as an alternative to inheritance.

Programmers have different opinions on inheritance. Bjarne Stroustrup, author of C++, has stated that it is possible to do OOP without inheritance.[42]Rob Pike has criticized inheritance for creating complex hierarchies instead of simpler solutions.[43]

Inheritance and behavioral subtyping

People often think that if one class inherits from another, it means the subclass "is a" more specific version of the original class. This presumes the program semantics are that objects from the subclass can always replace objects from the original class without problems. This concept is known as behavioral subtyping, more specifically the Liskov substitution principle.

However, this is often not true, especially in programming languages that allow mutable objects, objects that change after they are created. In fact, subtype polymorphism as enforced by the type checker in OOP languages cannot guarantee behavioral subtyping in most if not all contexts. For example, the circle-ellipse problem is notoriously difficult to handle using OOP's concept of inheritance. Behavioral subtyping is undecidable in general, so it cannot be easily implemented by a compiler. Because of this, programmers must carefully design class hierarchies to avoid mistakes that the programming language itself cannot catch.

Dynamic dispatch

يمكن استدعاء دالة عبر الإرسال الديناميكي، بحيث يتم اختيارها أثناء التشغيل بدلاً من وقت الترجمة. إذا كان اختيار الدالة يعتمد على أكثر من نوع واحد من الكائنات (مثل الكائنات الأخرى التي يتم تمريرها كمعاملات)، يُسمى ذلك الإرسال المتعدد . في هذا السياق، يُعرف استدعاء الدالة أيضًا بتمرير الرسائل ، أي أن اسم الدالة ومدخلاتها بمثابة رسالة تُرسل إلى الكائن ليقوم بمعالجتها. [ 44 ]

يعمل الإرسال الديناميكي جنبًا إلى جنب مع الوراثة: إذا لم يكن لدى الكائن الطريقة المطلوبة، فإنه يبحث في فئته الأصلية ( التفويض )، ويستمر في الصعود في السلسلة للعثور على طريقة مطابقة.

تعدد الأشكال

يشير مصطلح تعدد الأشكال في البرمجة الكائنية التوجه إلى التنميط الفرعي أو تعدد الأشكال من النوع الفرعي، حيث يمكن للدالة أن تعمل مع واجهة محددة ، وبالتالي معالجة كيانات من فئات مختلفة بطريقة موحدة. [ 45 ]

على سبيل المثال، تخيل برنامجًا يحتوي على شكلين: دائرة ومربع. كلاهما ينتميان إلى فئة مشتركة تُسمى "الشكل". لكل شكل طريقة رسم خاصة به. مع تعدد الأشكال الفرعية، لا يحتاج البرنامج إلى معرفة نوع كل شكل، ويمكنه ببساطة استدعاء دالة "الرسم" لكل شكل. سيضمن وقت تشغيل لغة البرمجة تشغيل الإصدار الصحيح من دالة "الرسم" لكل شكل. ولأن تفاصيل كل شكل تُعالج داخل فئته الخاصة، فإن هذا يجعل الكود أبسط وأكثر تنظيمًا، مما يُتيح فصلًا قويًا للمهام .

التكرار المفتوح

يمكن لأساليب الكائن الوصول إلى بياناته. تستخدم العديد من لغات البرمجة كلمة خاصة، مثل `<اسم_الكائن>` thisأو `<اسم_الكائن self>`، للإشارة إلى الكائن الحالي. في اللغات التي تدعم الاستدعاء الذاتي المفتوح ، يمكن لأسلوب في كائن ما استدعاء أساليب أخرى في نفس الكائن، بما في ذلك الكائن نفسه، باستخدام هذه الكلمة الخاصة. يسمح هذا لأسلوب في فئة ما باستدعاء أسلوب آخر مُعرَّف لاحقًا في فئة فرعية، وهي ميزة تُعرف بالربط المتأخر .

أنماط التصميم

تُعدّ أنماط التصميم حلولاً شائعة لمشاكل تصميم البرمجيات. بعض أنماط التصميم مفيدة بشكل خاص للبرمجة الكائنية التوجه، وعادةً ما تُقدّم أنماط التصميم في سياق البرمجة الكائنية التوجه.

النمذجة والعلاقات في العالم الحقيقي

أحيانًا، تُمثّل الكائنات الأشياء والعمليات الواقعية في شكل رقمي. [ 46 ] على سبيل المثال، قد يحتوي برنامج رسومات على كائنات مثل circleو squareو و menu. وقد يحتوي نظام تسوق إلكتروني على كائنات مثل shopping cartو customerو و product. قال نيكلاوس ويرث : "يعكس هذا النموذج [البرمجة الكائنية] بنية الأنظمة في العالم الحقيقي بدقة، ولذلك فهو مناسب تمامًا لنمذجة الأنظمة المعقدة ذات السلوك المعقد". [ 47 ]

مع ذلك، في أغلب الأحيان، تمثل الكائنات كيانات مجردة، مثل ملف مفتوح أو محول وحدات. لا يتفق الجميع على أن البرمجة الكائنية التوجه تُسهّل نسخ العالم الحقيقي بدقة، أو حتى على ضرورة ذلك. يشير بوب مارتن إلى أنه نظرًا لأن الفئات عبارة عن برامج، فإن علاقاتها لا تتطابق مع علاقات العالم الحقيقي التي تمثلها. [ 48 ] يجادل برتراند ماير بأن البرنامج ليس نموذجًا للعالم، بل نموذجًا لجزء منه؛ "الواقع قريب بعيد". [ 49 ] لاحظ ستيف ييغي أن اللغات الطبيعية تفتقر إلى منهج البرمجة الكائنية التوجه المتمثل في تسمية الشيء (الكائن) قبل الفعل (الطريقة)، على عكس البرمجة الوظيفية التي تفعل العكس. [ 50 ] قد يجعل هذا حل البرمجة الكائنية التوجه أكثر تعقيدًا من الحل المكتوب باستخدام البرمجة الإجرائية . [ 51 ]

أنماط الكائنات

فيما يلي أنماط تصميم برمجية بارزة لكائنات البرمجة الكائنية التوجه. [ 52 ]

من الأنماط المضادة الشائعة هو الكائن الإلهي ، وهو كائن يعرف أو يفعل الكثير.

أنماط تصميم عصابة الأربعة

كتاب "أنماط التصميم: عناصر البرمجيات القابلة لإعادة الاستخدام والموجهة للكائنات" هو كتاب شهير نُشر عام ١٩٩٤ من تأليف أربعة مؤلفين: إريك غاما ، وريتشارد هيلم ، ورالف جونسون ، وجون فليسيدس . ويُطلق عليهم غالبًا اسم "عصابة الأربعة". يتناول الكتاب نقاط القوة والضعف في البرمجة الموجهة للكائنات، ويشرح ٢٣ طريقة شائعة لحل مشاكل البرمجة.

تُصنف هذه الحلول، التي تُسمى "أنماط التصميم"، إلى ثلاثة أنواع:

البرمجة الكائنية وقواعد البيانات

تُستخدم كل من البرمجة الكائنية وأنظمة إدارة قواعد البيانات العلائقية على نطاق واسع في البرمجيات اليوم. مع ذلك، لا تخزن قواعد البيانات العلائقية الكائنات مباشرةً، مما يُشكل تحديًا عند استخدامها معًا. تُعرف هذه المشكلة باسم عدم توافق المعاوقة بين الكائنات والعلاقات .

لحل هذه المشكلة، يستخدم المطورون طرقًا مختلفة، لكن لا يوجد حل مثالي. [ 53 ] أحد أكثر الحلول شيوعًا هو ربط الكائنات العلائقية (ORM)، الذي يساعد على ربط البرامج الموجهة للكائنات بقواعد البيانات العلائقية. من أمثلة أدوات ORM: Visual FoxPro و Java Data Objects و Ruby on Rails ActiveRecord.

بعض قواعد البيانات، التي تسمى قواعد بيانات الكائنات ، مصممة للعمل مع البرمجة الكائنية التوجه. ومع ذلك، لم تحظَ بشعبية أو نجاح قواعد البيانات العلائقية.

اقترح ديت وداروين أساسًا نظريًا يستخدم البرمجة الكائنية كنوع من نظام الأنواع القابل للتخصيص لدعم أنظمة إدارة قواعد البيانات العلائقية، ولكنه يمنع الكائنات التي تحتوي على مؤشرات إلى كائنات أخرى. [ 54 ]

التصميم القائم على المسؤولية مقابل التصميم القائم على البيانات

في التصميم القائم على المسؤولية ، تُبنى الفئات البرمجية بناءً على وظائفها والمعلومات التي تتشاركها، وذلك في شكل عقد. ويختلف هذا عن التصميم القائم على البيانات ، حيث تُبنى الفئات البرمجية بناءً على البيانات التي تحتاج إلى تخزينها. ووفقًا لـ Wirfs-Brock و Wilkerson، مؤسسي التصميم القائم على المسؤولية، فإن هذا النهج هو الأفضل. [ 55 ]

إرشادات SOLID و GRASP

SOLID هي مجموعة من خمس قواعد لتصميم برامج جيدة، وضعها مايكل فيذرز:

GRASP (أنماط البرمجيات العامة لتعيين المسؤولية) هي مجموعة أخرى من قواعد تصميم البرمجيات، أنشأها كريج لارمان ، والتي تساعد المطورين على تعيين المسؤوليات لأجزاء مختلفة من البرنامج: [ 56 ]

  • مبدأ المُنشئ: يسمح للفئات بإنشاء كائنات تستخدمها بشكل وثيق.
  • مبدأ خبير المعلومات: يقوم بتعيين المهام للفئات التي تمتلك المعلومات المطلوبة.
  • مبدأ الاقتران المنخفض: يقلل من تبعيات الفئات لتحسين المرونة وسهولة الصيانة.
  • مبدأ التماسك العالي: تصميم فصول دراسية ذات مسؤولية واحدة ومركزة.
  • مبدأ التحكم: يقوم بتعيين عمليات النظام إلى فئات منفصلة تدير التدفق والتفاعلات.
  • تعدد الأشكال: يسمح باستخدام فئات مختلفة من خلال واجهة مشتركة، مما يعزز المرونة وإعادة الاستخدام.
  • مبدأ التصنيع الخالص: إنشاء فئات مساعدة لتحسين التصميم، وتعزيز التماسك، وتقليل الترابط.

الدلالات الرسمية

حاول الباحثون تعريف دلالات البرمجة الكائنية التوجه تعريفًا رسميًا. يُشكّل التوريث تحديًا، لا سيما فيما يتعلق بالتفاعلات بين الاستدعاء الذاتي المفتوح والحالة المُغلّفة. استخدم الباحثون أنواعًا استدعائية وأنواع بيانات جبرية مشتركة لدمج السمات الأساسية للبرمجة الكائنية التوجه. [ 57 ] عرّف عبادي وكارديلي العديد من امتدادات النظام F <: التي تتعامل مع الكائنات القابلة للتغيير، مما يسمح بتعدد أشكال الأنواع الفرعية وتعدد الأشكال البارامتري (الأنواع العامة)، وتمكّنا من نمذجة العديد من مفاهيم وبنى البرمجة الكائنية التوجه تعريفًا رسميًا. [ 58 ] على الرغم من أن التحليل الثابت للغات البرمجة الكائنية التوجه مثل جافا ليس بالأمر البسيط، إلا أنه مجال ناضج، [ 59 ] مع وجود العديد من الأدوات التجارية. [ 60 ]

الشعبية والاستقبال

الرسم البياني لمؤشر شعبية لغات البرمجة TIOBE من عام 2002 إلى عام 2023. في العقد الأول من القرن الحادي والعشرين ، تنافست لغة جافا الكائنية التوجه (البرتقالية) ولغة سي الإجرائية (الأزرق الداكن) على المركز الأول.

تستخدم العديد من لغات البرمجة الشائعة، مثل C++ وجافا وبايثون، البرمجة الكائنية التوجه. في الماضي، كانت البرمجة الكائنية التوجه مقبولة على نطاق واسع، [ 61 ] ولكن في الآونة الأخيرة، انتقدها بعض المبرمجين وفضلوا البرمجة الوظيفية بدلاً منها. [ 62 ] وجدت دراسة أجراها بوتوك وآخرون أنه لا يوجد فرق كبير في الإنتاجية بين البرمجة الكائنية التوجه والبرمجة الإجرائية. [ 63 ]

يعتقد البعض أن البرمجة الكائنية التوجه (OOP) تركز بشكل مفرط على استخدام الكائنات بدلاً من الخوارزميات وهياكل البيانات . [ 64 ] [ 65 ] على سبيل المثال، أشار المبرمج روب بايك إلى أن البرمجة الكائنية التوجه قد تجعل المبرمجين يفكرون في التسلسل الهرمي للأنواع أكثر من التركيب. [ 66 ] وقد وصفها بأنها " الأرقام الرومانية للحوسبة". [ 67 ] ووصف ريتش هيكي ، مبتكر لغة كلوجر ، البرمجة الكائنية التوجه بأنها مبسطة للغاية، خاصة عندما يتعلق الأمر بتمثيل الأشياء الواقعية التي تتغير بمرور الوقت. [ 65 ] وقال ألكسندر ستيبانوف إن البرمجة الكائنية التوجه تحاول حصر كل شيء في نوع واحد، وهو ما قد يكون مقيدًا. وجادل بأننا نحتاج أحيانًا إلى جبر متعدد الأنواع: عائلات من الواجهات التي تشمل أنواعًا متعددة، كما هو الحال في البرمجة العامة . وقال ستيبانوف أيضًا إن تسمية كل شيء "كائنًا" لا يضيف الكثير من الفهم. [ 64 ]

تم ابتكار البرمجة الكائنية التوجه (OOP) لتسهيل إعادة استخدام التعليمات البرمجية وصيانتها . [ 68 ] مع ذلك، لم تُصمم هذه البرمجة لعرض مسار تعليمات البرنامج بوضوح، بل تُرك ذلك للمُترجم. ومع ازدياد استخدام الحواسيب للمعالجة المتوازية والخيوط المتعددة ، ازدادت أهمية فهم كيفية تدفق التعليمات والتحكم بها، وهو أمر يصعب تحقيقه باستخدام البرمجة الكائنية التوجه. [ 69 ] [ 70 ] [ 71 ] [ 72 ]

يعتقد بول غراهام أن الشركات الكبرى تُفضل البرمجة الكائنية التوجه (OOP) لأنها تُساعد في إدارة فرق كبيرة من المبرمجين ذوي الخبرة المتوسطة. ويُجادل بأن البرمجة الكائنية التوجه تُضيف بنيةً، مما يُقلل من احتمالية ارتكاب أخطاء جسيمة من قِبل شخص واحد، ولكنها في الوقت نفسه تُقيّد المبرمجين الأذكياء. [ 73 ] بينما يُجادل إريك س. ريموند ، مُبرمج أنظمة يونكس ومُدافع عن البرمجيات مفتوحة المصدر ، بأن البرمجة الكائنية التوجه ليست أفضل طريقة لكتابة البرامج. [ 36 ]

يقول ريتشارد فيلدمان إنه على الرغم من أن خصائص البرمجة الكائنية التوجه ساعدت بعض اللغات على الحفاظ على تنظيمها، إلا أن شعبيتها تنبع من أسباب أخرى. [ 74 ] ويجادل لورانس كروبنر بأن البرمجة الكائنية التوجه لا تقدم مزايا خاصة مقارنة بالأنماط الأخرى، مثل البرمجة الوظيفية، بل قد تُعقّد عملية كتابة الكود. [ 75 ] ويقول لوكا كارديلي إن البرمجة الكائنية التوجه أبطأ وتستغرق وقتًا أطول في الترجمة من البرمجة الإجرائية. [ 34 ]

انظر أيضاً

مراجع

  1. 1 2 3 4 كاي، د. آلان (23 يوليو 2003). "د. آلان كاي يتحدث عن معنى "البرمجة الكائنية التوجه"تمت أرشفة هذا النص من المصدر الأصلي في 4 مارس 2025. تم الاطلاع عليه في 11 فبراير 2010 .
  2. كيندلر، إي.؛ كريفي، آي. (2011). "محاكاة الأنظمة ذات التحكم المتطور باستخدام البرمجة الكائنية". المجلة الدولية للأنظمة العامة . 40 (3): 313-343 . doi : 10.1080/03081079.2010.539975 .
  3. لويس، جون؛ لوفوس، ويليام (2008). "1.6: البرمجة كائنية التوجه". حلول برمجيات جافا . أسس تصميم البرمجة ( الطبعة السادسة). بيرسون للتعليم. ISBN  978-0-321-53205-3.
  4. بلوخ 2018 ، الصفحات 11-12، مقدمة.
  5. مكارثي، ج .؛ برايتون، ر.؛ إدواردز، د.؛ فوكس، ب .؛ هودز، للوكهام، د .؛ مالينغ، ك.؛ بارك، دراسل، س. (مارس 1969). "دليل مبرمجي لغة ليسب 1" (ملف PDF) . مركز الحوسبة ومختبر أبحاث الإلكترونيات . بوسطن ، ماساتشوستس : مجموعة الذكاء الاصطناعي، مركز الحوسبة ومختبر الأبحاث التابع لمعهد ماساتشوستس للتكنولوجيا: 88 وما يليها. مؤرشف من النسخة الأصلية (ملف PDF) في 17 يوليو 2010. في لغة معهد ماساتشوستس للتكنولوجيا المحلية، تُعرف قوائم الارتباط [للرموز الذرية] أيضًا باسم "قوائم الخصائص"، وتُسمى الرموز الذرية أحيانًا "كائنات".
  6. مكارثي، جون ؛ أبراهامز، بول دبليو؛ إدواردز، دانيال جيه؛ هارت، سوابنيل دي؛ ليفين، مايكل آي. (1962). دليل مبرمج لغة ليسب 1.5 . مطبعة معهد ماساتشوستس للتكنولوجيا . ص 105. ISBN  978-0-262-13011-0. كائن – مرادف للرمز الذري{{cite book}}عدم توافق رقم ISBN / التاريخ ( مساعدة )
  7. إيفان إي. ساذرلاند (مايو 1963). سكتش باد: نظام اتصال رسومي بين الإنسان والآلة . مؤتمر AFIPS '63 (الربيع): وقائع مؤتمر الحاسوب المشترك الربيعي المنعقد في الفترة من 21 إلى 23 مايو 1963. مطبعة AFIPS. الصفحات 329-346 . doi : 10.1145/1461551.1461591 . 
  8. 1 2 نيغارد، كريستين ؛ دال، أولي-يوهان (1 أغسطس 1978). "تطوير لغات سيمولا" . إشعارات ACM SIGPLAN . 13 (8): 245-272 . doi : 10.1145/960118.808391 .
  9. روس، دوغ. "أول لغة لهندسة البرمجيات" . الجدول الزمني لمختبر علوم الحاسوب والذكاء الاصطناعي . مختبر علوم الحاسوب والذكاء الاصطناعي بمعهد ماساتشوستس للتكنولوجيا. مؤرشف من الأصل في 12 أبريل 2011. تم الاطلاع عليه في 13 مايو 2010 .
  10. 1 2 هولمفيك، جان رون (شتاء 1994). "تجميع المحاكاة: دراسة تاريخية للنشأة التكنولوجية" (ملف PDF) . حوليات IEEE لتاريخ الحوسبة . 16 (4): 25-37 . doi : 10.1109/85.329756 . S2CID 18148999. مؤرشف من الأصل (ملف PDF) في 30 أغسطس 2017. تم الاطلاع عليه في 3 مارس 2018 . 
  11. مادسن، أولي ليرمان. "كريستين نيغارد" . الحائزون على جائزة تورينغ . مؤرشف من الأصل في 1 فبراير 2025. تم الاطلاع عليه في 4 فبراير 2025 .
  12. بوتشر، بول (30 يونيو 2014). سبعة نماذج للتزامن في سبعة أسابيع: عندما تتفكك الخيوط . مكتبة براغماتيك. ص 204. ISBN  978-1-68050-466-8.
  13. جونز، أنيتا ك.؛ ليسكوف، باربرا هـ. (أبريل 1976). مرفق للتحكم في الوصول للغات البرمجة (ملف PDF) (تقرير فني). معهد ماساتشوستس للتكنولوجيا. مذكرة CSG رقم 137. مؤرشف من الأصل (ملف PDF) في 26 فبراير 2026.
  14. 1 2 ماير، برتراند (2009). لمسة من الرقي: تعلم البرمجة الجيدة باستخدام الكائنات والعقود . سبرينغر ساينس آند بيزنس ميديا. ص 329. رمز Bibcode : 2009tclp.book.....M . ISBN  978-3-540-92144-8.
  15. كاي، آلان (مارس 1993). "التاريخ المبكر لسمول توك" . إشعارات ACM SIGPLAN . 28 (3): 69-95 . doi : 10.1145/155360.155364 .
  16. بورنينج، آلان هاميلتون (1979). مختبر الأشياء: مختبر محاكاة موجه نحو القيود (ملف PDF) (تقرير). جامعة ستانفورد.
  17. مون، ديفيد أ. (يونيو 1986). "البرمجة الكائنية التوجه مع نكهات" (ملف PDF) . وقائع مؤتمر أنظمة ولغات وتطبيقات البرمجة الكائنية التوجه . OOPSLA '86. الصفحات 1-8 . doi : 10.1145/28697.28698 . ISBN  978-0-89791-204-4. S2CID 17150741 . تم الاسترجاع في 17 مارس 2022 . 
  18. هسو، هانسن (17 ديسمبر 2020). "تقديم حديقة حيوانات سمول توك" . CHM . تم الاسترجاع في 27 مايو 2021 .{{cite news}}: CS1 maint: url-status ( link )
  19. بوبرو، دي جي؛ ستيفيك، إم جي (1982). حلقات: برمجة البيانات والبرمجة الموجهة للكائنات لـ Interlisp (ملف PDF) . المؤتمر الأوروبي للذكاء الاصطناعي.
  20. ماير 1997 .
  21. يونيو 1995: إصدار Visual FoxPro 3.0، حيث تطورت لغة FoxPro من لغة إجرائية إلى لغة كائنية التوجه. يُقدم Visual FoxPro 3.0 حاوية قاعدة بيانات، وإمكانيات سلسة للعميل/الخادم، ودعمًا لتقنيات ActiveX، وأتمتة OLE، ودعمًا للقيم الفارغة. ملخص إصدارات Fox
  22. دليل المراجعين لعام 1995 لبرنامج Visual FoxPro 3.0: DFpug.de
  23. خورانا، روهيت (1 نوفمبر 2009). البرمجة الكائنية باستخدام لغة C++، الطبعة الأولى . دار فيكاس للنشر المحدودة. رقم ISBN 978-81-259-2532-3.
  24. ديبورا ج. أرمسترونج. كواركات تطوير البرمجة الكائنية . حددت دراسة استقصائية لما يقرب من 40 عامًا من أدبيات الحوسبة العديد من المفاهيم الأساسية الموجودة في الغالبية العظمى من تعريفات البرمجة الكائنية، بترتيب تنازلي حسب شيوعها: الوراثة، الكائن، الفئة، التغليف، الأسلوب، تمرير الرسائل، تعدد الأشكال، والتجريد.
  25. جون سي. ميتشل ، مفاهيم في لغات البرمجة ، مطبعة جامعة كامبريدج، 2003، رقم ISBN 0-521-78098-5، ص 278. القوائم: الإرسال الديناميكي، والتجريد، وتعدد الأشكال الفرعية، والوراثة.
  26. مايكل لي سكوت، براغماتية لغات البرمجة ، الطبعة الثانية، مورغان كوفمان، 2006، رقم ISBN 0-12-633951-1، ص 470. تغليف القوائم، والوراثة، والإرسال الديناميكي.
  27. بيرس، بنجامين (2002). أنواع ولغات البرمجة . مطبعة معهد ماساتشوستس للتكنولوجيا. ISBN 978-0-262-16209-8.، القسم 18.1 "ما هي البرمجة كائنية التوجه؟" القوائم: الإرسال الديناميكي، والتغليف أو الأساليب المتعددة (الإرسال المتعدد)، وتعدد أشكال الأنواع الفرعية، والوراثة أو التفويض، والاستدعاء الذاتي المفتوح ("this"/"self").
  28. سي جيه ديت، مقدمة في أنظمة قواعد البيانات، الطبعة السادسة، الصفحة 650
  29. ماكدونو، جيمس إي. (2017). "التغليف". التصميم الموجه للكائنات باستخدام ABAP: منهج عملي . Apress . doi : 10.1007/978-1-4842-2838-8 . ISBN 978-1-4842-2837-1 عبر أورايلي .
  30. بلوخ 2018 ، ص 73-77، الفصل §4 البند 15 تقليل إمكانية الوصول إلى الفصول والأعضاء.
  31. "ما هي البرمجة الكائنية التوجه (OOP) بكلمات بسيطة؟ - مقالات تقنية من عالم البرمجيات" . 5 يناير 2023. مؤرشف من الأصل في 17 يناير 2023. تم الاطلاع عليه في 17 يناير 2023 .
  32. كارديلي، لوكا؛ ويغنر، بيتر (10 ديسمبر 1985). "حول فهم الأنواع، وتجريد البيانات، وتعدد الأشكال" . مجلة ACM Computing Surveys . 17 (4): 471–523 . doi : 10.1145/6041.6042 . ISSN 0360-0300 . 
  33. ^ جاكوبسن، إيفار. ماغنوس كريسترسون؛ باتريك جونسون؛ غونار أوفرجارد (1992). هندسة البرمجيات الشيئية . مطبعة أديسون ويسلي ACM. ص 43-69 . رقم ISBN  978-0-201-54435-0.
  34. 1 2 3 كارديلي، لوكا (1996). "خصائص هندسية سيئة للغات البرمجة كائنية التوجه" . مجلة ACM للحوسبة ، 28 (4): 150–150. doi : 10.1145/242224.242415 . ISSN 0360-0300 . S2CID 12105785. مؤرشف من الأصل في 10 مايو 2010. تم الاطلاع عليه في 21 أبريل 2010 .  
  35. 1 2 أرمسترونغ، جو . سيبل، بيتر (محرر). المبرمجون في العمل: تأملات في فن البرمجة . Codersatwork.com. مؤرشف من الأصل في 5 مارس 2010. تم الاطلاع عليه في 13 نوفمبر 2009 .
  36. 1 2 3 ريموند، إريك س. (2003). "فن برمجة يونكس: يونكس ولغات البرمجة كائنية التوجه" . مؤرشف من الأصل في 15 سبتمبر 2014. تم الاطلاع عليه في 6 أغسطس 2014 .
  37. برودي، ليو (1984). التفكير المستقبلي (ملف PDF) . الصفحات 92-93 . تم الاطلاع عليه بتاريخ 4 مايو 2018 . 
  38. هانت، أندرو. "لا تكرر نفسك" . تصنيف: البرمجة المتطرفة . مؤرشف من الأصل في 5 مايو 2018. تم الاطلاع عليه في 4 مايو 2018 .
  39. بلوخ 2018 ، ص. 19، الفصل §2 البند 4 فرض عدم إمكانية الاستنساخ باستخدام منشئ خاص.
  40. دوني، سي؛ مالينفانت، جيه؛ باردون، دي (1999). "تصنيف لغات البرمجة القائمة على النماذج الأولية" (ملف PDF) . البرمجة القائمة على النماذج الأولية: المفاهيم واللغات والتطبيقات . سنغافورة - برلين - هايدلبرغ: سبرينغر. ISBN 9789814021258.
  41. "هل لغة Go لغة كائنية التوجه؟" . مؤرشف من الأصل في 13 أبريل 2019. تم الاسترجاع في 13 أبريل 2019. على الرغم من أن لغة Go تحتوي على أنواع وأساليب وتسمح بأسلوب برمجة كائني التوجه، إلا أنه لا يوجد تسلسل هرمي للأنواع.
  42. ستروستروب، بيارن (2015). البرمجة الكائنية التوجه بدون وراثة (محاضرة مدعوة) . المؤتمر الأوروبي التاسع والعشرون للبرمجة الكائنية التوجه (ECOOP 2015). 1:34. doi : 10.4230/LIPIcs.ECOOP.2015.1 .
  43. بايك، روب (14 نوفمبر 2012). "قبل بضع سنوات رأيت هذه الصفحة" . مؤرشف من الأصل في 14 أغسطس 2018. تم الاطلاع عليه في 1 أكتوبر 2016 .
  44. نايك، مايور؛ كومار، راجيف (مارس 2000). "إرسال الرسائل بكفاءة في الأنظمة الموجهة للكائنات". إشعارات ACM SIGPLAN . 35 (3): 49-58 . doi : 10.1145/351159.351174 .
  45. ستروستروب، بيارن (19 فبراير 2007). "مسرد بيارن ستروستروب للغة C++" . www.stroustrup.com . مؤرشف من الأصل في 20 يوليو 2012. تم الاطلاع عليه في 9 يونيو 2011. تعدد الأشكال - توفير واجهة واحدة لكيانات من أنواع مختلفة.
  46. بوتش، جرادي (1986). هندسة البرمجيات باستخدام لغة آدا . أديسون ويسلي. ص 220. ISBN  978-0-8053-0608-8لعل أعظم ميزة لنهج التطوير الموجه نحو الكائنات هي أنه يوفر آلية لالتقاط نموذج للعالم الحقيقي.
  47. ويرث، نيكلاوس (23 يناير 2006). "أفكار جيدة، من خلال المرآة" (ملف PDF) . مجلة IEEE Computer . مقال الغلاف. 39 (1): 28-39 . Bibcode : 2006Compr..39a..28W . doi : 10.1109/MC.2006.20 . S2CID 6582369. مؤرشف من النسخة الأصلية (ملف PDF) بتاريخ 12 أكتوبر 2016. 
  48. "مبادئ العم بوب الصلبة" . يوتيوب . 2 أغسطس 2018.
  49. ماير 1997 ، ص 230.
  50. ييغي، ستيف (30 مارس 2006). "الإعدام في مملكة الأسماء" . steve-yegge.blogspot.com . تم الاطلاع عليه في 3 يوليو 2010 .
  51. بورونتشيك، تيموثي (11 يونيو 2009). "ما الخطأ في البرمجة الكائنية التوجه؟" . zaemis.blogspot.com . تم الاطلاع عليه في 3 يوليو 2010 .
  52. مارتن، روبرت سي. "مبادئ التصميم وأنماط التصميم" (ملف PDF) . مؤرشف من الأصل (ملف PDF) في 6 سبتمبر 2015. تم الاطلاع عليه في 28 أبريل 2017 .
  53. نيوارد، تيد (26 يونيو 2006). "فيتنام علوم الحاسوب" . قابلية التشغيل البيني تحدث. مؤرشف من الأصل في 4 يوليو 2006. تم الاسترجاع في 2 يونيو 2010 .
  54. سي جيه ديت، هيو داروين. مؤسسة أنظمة قواعد البيانات المستقبلية: البيان الثالث (الطبعة الثانية)
  55. ويرفس-بروك، ريبيكا؛ ويلكرسون، برايان (1989). "التصميم الموجه للكائنات: منهج قائم على المسؤولية" . إشعارات ACM SIGPLAN . 24 (10): 74. doi : 10.1145/74878.74885 .
  56. كارش، باتريك (19 يوليو 2023). "مبادئ GRASP: أنماط التصميم الموجهة للكائنات" . ميديوم . تم الاطلاع عليه في 30 مارس 2025 .
  57. بول، إريك. "التصنيف الفرعي والوراثة لأنواع البيانات الفئوية" (ملف PDF) . تم الاطلاع عليه في 5 يونيو 2011 .
  58. ^ العبادي، مارتن ؛ كارديلي، لوكا (1996). نظرية الكائنات . Springer-Verlag New York, Inc. ISBN 978-0-387-94775-4تم الاطلاع عليه بتاريخ 21 أبريل 2010 .
  59. تان، تيان؛ لي، يو (12 يوليو 2023). تاي-إي: إطار عمل تحليل ثابت سهل الاستخدام للمطورين للغة جافا، يستفيد من التصاميم الجيدة للأساليب الكلاسيكية . المؤتمر الدولي لتحليل البرامج الثابتة 2023. الصفحات 1093-1105 . doi : 10.1145/3597926.3598120 . 
  60. بوتاني، فيكرام؛ توسي، فرشاد قاسمي؛ باكلي، جيم (1 يونيو 2024). "تحليل أدوات التحليل: دراسة لأدوات تحليل شفرة المصدر". أنظمة الحاسوب التطبيقية . 29 (1): 98-111 . doi : 10.2478/acss-2024-0013 .
  61. بروكر، آخيم د.؛ وولف، بوركهارت (2008). "أكوان قابلة للتوسيع لنماذج البيانات الموجهة للكائنات". ECOOP 2008 - البرمجة الموجهة للكائنات . سلسلة محاضرات في علوم الحاسوب. المجلد 5142. الصفحات 438-462 . doi : 10.1007/978-3-540-70592-5_19 . ISBN   978-3-540-70591-8البرمجة الكائنية التوجه هي نموذج برمجة مقبول على نطاق واسع .
  62. كاسيل، ديفيد (21 أغسطس 2019). "لماذا يكره الكثير من المطورين البرمجة الكائنية التوجه؟" . ذا نيو ستاك .
  63. بوتوك، توماس؛ فوك، ملادن؛ ريندوس، آندي (1999). "تحليل إنتاجية البرمجيات الموجهة للكائنات المطورة في بيئة تجارية" (ملف PDF) . البرمجيات: الممارسة والخبرة . 29 (10): 833-847 . doi : 10.1002/(SICI)1097-024X(199908)29:10 < 833::AID-SPE258 > 3.0.CO ; 2-P . S2CID 57865731. تاريخ الاسترجاع: 21 أبريل 2010 . 
  64. 1 2 ستيبانوف، ألكسندر (2001-2008). "STLport: مقابلة مع أ. ستيبانوف" . تم الاطلاع عليه بتاريخ 21 أبريل 2010 .
  65. 1 2 هيكي، ريتش (نوفمبر 2009). هل وصلنا بعد؟ (كلمة رئيسية) . قمة لغات JVM.
  66. بايك، روب (25 يونيو 2012). "الأقل هو أكثر بكثير" . تم الاطلاع عليه في 1 أكتوبر 2016 .
  67. Pike, Rob (2 March 2004). "[9fans] Re: Threads: Sewing badges of honor onto a Kernel". comp.os.plan9 (Mailing list). Retrieved 17 November 2016.
  68. Ambler, Scott (1 January 1998). "A Realistic Look at Object-Oriented Reuse". drdobbs.com. Retrieved 5 August 2025.
  69. Shelly, Asaf (22 August 2008). "Flaws of Object Oriented Modeling". Intel Software Network. Retrieved 4 July 2010.
  70. James, Justin (1 October 2007). "Multithreading is a verb not a noun". techrepublic.com. Archived from the original on 10 October 2007. Retrieved 4 July 2010.
  71. Shelly, Asaf (22 August 2008). "HOW TO: Multicore Programming (Multiprocessing) Visual C++ Class Design Guidelines, Member Functions". support.microsoft.com. Retrieved 4 July 2010.
  72. Harper, Robert (17 April 2011). "Some thoughts on teaching FP". Existential Type Blog. Archived from the original on 6 November 2011. Retrieved 5 December 2011.
  73. Graham, Paul. "Why ARC isn't especially Object-Oriented". PaulGraham.com. Archived from the original on 24 November 2009. Retrieved 13 November 2009.
  74. Feldman, Richard (30 September 2019). "Why Isn't Functional Programming the Norm?". YouTube. Archived from the original on 22 August 2022.
  75. Krubner, Lawrence. "Object Oriented Programming is an expensive disaster which must end". smashcompany.com. Archived from the original on 14 October 2014. Retrieved 14 October 2014.

Further reading