Object-oriented programming explained

Object-oriented programming (OOP) is a programming paradigm based on objects – software entities that encapsulate data and function(s). An OOP computer program consists of objects that interact with one another.[1] [2] 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, 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

The idea of "objects" in programming began with the artificial intelligence group at Massachusetts Institute of Technology (MIT) in the late 1950s and early 1960s. Here, "object" referred to LISP atoms with identified properties (attributes).[3] [4] Another early example was Sketchpad created by Ivan Sutherland at MIT in 1960–1961. In the glossary of his technical report, Sutherland defined terms like "object" and "instance" (with the class concept covered by "master" or "definition"), albeit specialized to graphical interaction.[5] Later, in 1968, AED-0, MIT's version of the ALGOL programming language, connected data structures ("plexes") and procedures, prefiguring what were later termed "messages", "methods", and "member functions".[6] [7] Topics such as data abstraction and modular programming were common points of discussion at this time.

Meanwhile, in Norway, Simula was developed during the years 1961–1967.[6] Simula introduced essential object-oriented ideas, such as classes, inheritance, and dynamic binding.[8] Simula was used mainly by researchers involved with physical modelling, like the movement of ships and their content through cargo ports.[8] Simula is generally accepted as being the first language with the primary features and framework of an object-oriented language.[9]

Influenced by both MIT and Simula, Alan Kay began developing his own ideas in November 1966. He would go on to create Smalltalk, an influential OOP language. By 1967, Kay was already using the term "object-oriented programming" in conversation. Although sometimes called the "father" of OOP,[10] Kay has said his ideas differ from how OOP is commonly understood, and has implied that the computer science establishment did not adopt his notion.[11] A 1976 MIT memo co-authored by Barbara Liskov lists Simula 67, CLU, and Alphard as object-oriented languages, but does not mention Smalltalk.[12]

In the 1970s, the first version of the Smalltalk programming language was developed at Xerox PARC by Alan Kay, Dan Ingalls and Adele Goldberg. Smalltalk-72 was notable for use of objects at the language level and its graphical development environment.[13] Smalltalk was a fully dynamic system, allowing users to create and modify classes as they worked.[14] Much of the theory of OOP was developed in the context of Smalltalk, for example multiple inheritance.[15]

In the late 1970s and 1980s, OOP rose to prominence. The Flavors object-oriented Lisp was developed starting 1979, introducing multiple inheritance and mixins.[16] In August 1981, Byte Magazine highlighted Smalltalk and OOP, introducing these ideas to a wide audience.[17] LOOPS, the object system for Interlisp-D, was influenced by Smalltalk and Flavors, and a paper about it was published in 1982.[18] In 1986, the first Conference on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA) was attended by 1,000 people. This conference marked the start of efforts to consolidate Lisp object systems, eventually resulting in the Common Lisp Object System. In the 1980s, there were a few attempts to design processor architectures that included hardware support for objects in memory, but these were not successful. Examples include the Intel iAPX 432 and the Linn Smart Rekursiv.

In the mid-1980s, new object-oriented languages like Objective-C, C++, and Eiffel emerged. Objective-C was developed by Brad Cox, who had used Smalltalk at ITT Inc. Bjarne Stroustrup created C++ based on his experience using Simula for his PhD thesis.[13] Bertrand Meyer produced the first design of the Eiffel language in 1985, which focused on software quality using a design by contract approach.

In the 1990s, OOP became the main way of programming, especially as more languages supported it. These included Visual FoxPro 3.0,[19] [20] C++,[21] and Delphi. OOP became even more popular with the rise of graphical user interfaces, which used objects for buttons, menus and other elements. One well-known example is Apple's Cocoa framework, used on macOS and written in Objective-C. OOP toolkits also enhanced the popularity of event-driven programming.

At ETH Zürich, Niklaus Wirth and his colleagues created new approaches to OOP. Modula-2 (1978) and Oberon (1987), included a distinctive approach to object orientation, classes, and type checking across module boundaries. Inheritance is not obvious in Wirth's design since his nomenclature looks in the opposite direction: It is called type extension and the viewpoint is from the parent down to the inheritor.

Many programming languages that were initially developed before OOP was popular have been augmented with object-oriented features, including Ada, BASIC, Fortran, Pascal, and COBOL.

Features

See also: List of object-oriented programming terms. The OOP features provided by languages varies. Below are some common features of OOP languages.[22] [23] [24] [25] Comparing OOP with other styles, like relational programming, is difficult because there isn't a clear, agreed-upon definition of OOP.[26]

Encapsulation and information hiding

Information hiding and encapsulation can refer to several related concepts:

Some programming languages, like Java, provide information hiding via visibility key words (and). 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 keyword, (which allows access from the same class and its subclasses, but not objects of a different class), and the keyword in C#, Swift, and Kotlin, which restricts access to files within the same module.[28]

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

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. The latter point is reiterated by Joe Armstrong, the principal inventor of Erlang, who is quoted as saying:[32]

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

Inheritance

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

Class-based

In class-based programming, the most common type of OOP, an object is an instance of a class. The class defines the data (variables) and methods (logic). An object is created via the constructor. Every instance of the class has the same set of variables and methods. Elements may include:

Classes may inherit from other classes, creating a hierarchy of classes: a case of a subclass inheriting from a super-class. For example, an class might inherit from a class which endows the Employee object with the variables from . The subclass may add variables and methods that do not affect the super-class. Most languages also allow the subclass to override super-class methods. Some languages support multiple inheritance, where a class can inherit from more than one class, and other languages similarly support mixins or traits. For example, a mixin called UnicodeConversionMixin might add a method unicode_to_ascii to both a FileReader and a WebPageScraper class.

An abstract class cannot be directly instantiated as an object. It is only used as a super-class.

Other classes are utility classes which contain only class variables and methods and are not meant to be instantiated or subclassed.

Prototype-based

Instead of providing a class concept, in prototype-based programming, an object is linked to another object, called its prototype or parent. In Self, an object may have multiple or no parents,[35] but in the most popular prototype-based language, JavaScript, an object has exactly one prototype link, up to the base object whose prototype is null.

A prototype acts as a model for new objects. For example, if you have an object, you can make two objects and that share traits of the prototype. Prototype-based languages also allow objects to have their own unique properties, so the object might have an attribute, while the or objects do not.

No inheritance

In all OOP languages, via object composition, an object can contain other objects. For example, an object might contain an object, along with other information like and . Composition is a "has-a" relationships, like "an employee has an address". Some languages, like Go, don't support inheritance.[36] 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.[37] Rob Pike has criticized inheritance for creating complex hierarchies instead of simpler solutions.[38]

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

A method may be invoked via dynamic dispatch such that the method is selected at runtime instead of compile time. If the method choice depends on more than one type of object (such as other objects passed as parameters), it's called multiple dispatch. In this context, a method call is also known as message passing, meaning the method name and its inputs are like a message sent to the object for it to act on.[39]

Dynamic dispatch works together with inheritance: if an object doesn't have the requested method, it looks up to its parent class (delegation), and continues up the chain to find a matching method.

Polymorphism

Polymorphism in OOP refers to subtyping or subtype polymorphism, where a function can work with a specific interface and thus manipulate entities of different classes in a uniform manner.[40]

For example, imagine a program has two shapes: a circle and a square. Both come from a common class called "Shape." Each shape has its own way of drawing itself. With subtype polymorphism, the program doesn't need to know the type of each shape, and can simply call the "Draw" method for each shape. The programming language runtime will ensure the correct version of the "Draw" method runs for each shape. Because the details of each shape are handled inside their own classes, this makes the code simpler and more organized, enabling strong separation of concerns.

Open recursion

An object's methods can access the object's data. Many programming languages use a special word, like or, to refer to the current object. In languages that support open recursion, a method in an object can call other methods in the same object, including itself, using this special word. This allows a method in one class to call another method defined later in a subclass, a feature known as late binding.

Design patterns

Design patterns are common solutions to problems in software design. Some design patterns are especially useful for OOP, and design patterns are typically introduced in an OOP context.

Real-world modeling and relationships

Sometimes, objects represent real-world things and processes in digital form.[41] For example, a graphics program may have objects such as,, and . An online shopping system might have objects such as,, and . Niklaus Wirth said, "This paradigm [OOP] closely reflects the structure of systems in the real world and is therefore well suited to model complex systems with complex behavior".[42]

However, more often, objects represent abstract entities, like an open file or a unit converter. Not everyone agrees that OOP makes it easy to copy the real world exactly or that doing so is even necessary. Bob Martin suggests that because classes are software, their relationships don't match the real-world relationships they represent.[43] Bertrand Meyer argues that a program is not a model of the world but a model of some part of the world; "Reality is a cousin twice removed". Steve Yegge noted that natural languages lack the OOP approach of naming a thing (object) before an action (method), as opposed to functional programming which does the reverse.[44] This can make an OOP solution more complex than one written via procedural programming.[45]

Object patterns

The following are notable software design patterns for OOP objects.[46]

Class with one main method that acts like an anonymous function (in C++, the function operator,)

does not change state after creation

can be used without restriction

contains other objects

creates other objects

Used to create other objects (similar to a class, but an object)

a specialized metaobject that creates new objects by copying itself

only instance of its class for the lifetime of the program

receives a stream of data as its input and transforms it into the object's output

A common anti-pattern is the God object, an object that knows or does too much.

Gang of Four design patterns

See main article: Design pattern (computer science).

is a famous book published in 1994 by four authors: Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides. People often call them the "Gang of Four". The book talks about the strengths and weaknesses of OOP and explains 23 common ways to solve programming problems.

These solutions, called "design patterns," are grouped into three types:

Object-orientation and databases

See main article: Object-relational impedance mismatch, Object-relational mapping and Object database.

Both OOP and relational database management systems (RDBMSs) are widely used in software today. However, relational databases don't store objects directly, which creates a challenge when using them together. This issue is called object-relational impedance mismatch.

To solve this problem, developers use different methods, but none of them are perfect.[47] One of the most common solutions is object-relational mapping (ORM), which helps connect object-oriented programs to relational databases. Examples of ORM tools include Visual FoxPro, Java Data Objects, and Ruby on Rails ActiveRecord.

Some databases, called object databases, are designed to work with OOP. However, they have not been as popular or successful as relational databases.

Date and Darwen have proposed a theoretical foundation that uses OOP as a kind of customizable type system to support RDBMSs, but it forbids objects containing pointers to other objects.[48]

Responsibility- vs. data-driven design

In responsibility-driven design, classes are built around what they need to do and the information they share, in the form of a contract. This is different from data-driven design, where classes are built based on the data they need to store. According to Wirfs-Brock and Wilkerson, the originators of responsibility-driven design, responsibility-driven design is the better approach.[49]

SOLID and GRASP guidelines

SOLID is a set of five rules for designing good software, created by Michael Feathers:

GRASP (General Responsibility Assignment Software Patterns) is another set of software design rules, created by Craig Larman, that helps developers assign responsibilities to different parts of a program:[50]

Formal semantics

Researchers have tried to formally define the semantics of OOP. Inheritance presents difficulties, particularly with the interactions between open recursion and encapsulated state. Researchers have used recursive types and co-algebraic data types to incorporate essential features of OOP.[51] Abadi and Cardelli defined several extensions of System F<: that deal with mutable objects, allowing both subtype polymorphism and parametric polymorphism (generics), and were able to formally model many OOP concepts and constructs.[52] Although far from trivial, static analysis of object-oriented programming languages such as Java is a mature field,[53] with several commercial tools.[54]

Popularity and reception

Many popular programming languages, like C++, Java, and Python, use OOP. In the past, OOP was widely accepted,[55] but recently, some programmers have criticized it and prefer functional programming instead.[56] A study by Potok et al. found no major difference in productivity between OOP and procedural programming.[57]

Some believe that OOP places too much focus on using objects rather than on algorithms and data structures. For example, programmer Rob Pike pointed out that OOP can make programmers think more about type hierarchy than composition.[58] He has called OOP "the Roman numerals of computing".[59] Rich Hickey, creator of Clojure, described OOP as overly simplistic, especially when it comes to representing real-world things that change over time.[60] Alexander Stepanov said that OOP tries to fit everything into a single type, which can be limiting. He argued that sometimes we need multisorted algebras: families of interfaces that span multiple types, such as in generic programming. Stepanov also said that calling everything an "object" doesn't add much understanding.[61]

OOP was created to make code easier to reuse and maintain.[62] However, it was not designed to clearly show the flow of a program's instructions. That was left to the compiler. As computers began using more parallel processing and multiple threads, it became more important to understand and control how instructions flow. This is difficult to do with OOP.[63] [64] [65] [66]

Paul Graham believes big companies like OOP because it helps manage large teams of average programmers. He argues that OOP adds structure, making it harder for one person to make serious mistakes, but at the same time restrains smart programmers.[67] Eric S. Raymond, a Unix programmer and open-source software advocate, argues that OOP is not the best way to write programs.[31]

Richard Feldman says that, while OOP features helped some languages stay organized, their popularity comes from other reasons.[68] Lawrence Krubner argues that OOP doesn't offer special advantages compared to other styles, like functional programming, and can complicate coding.[69] Luca Cardelli says that OOP is slower and takes longer to compile than procedural programming.[70]

See also

Further reading

External links

Notes and References

  1. Kindler . E. . Krivy . I. . 2011 . Object-Oriented Simulation of systems with sophisticated control . International Journal of General Systems . 40 . 3 . 313–343 . 10.1080/03081079.2010.539975.
  2. Book: Lewis . John . Loftus . William . 2008 . 1.6: Object-Oriented Programming . Java Software Solutions . Foundations of Programming Design . 6th . Pearson Education Inc. . 978-0-321-53205-3.
  3. McCarthy . J. . John McCarthy (computer scientist) . Brayton . R. . Edwards . D. . Fox . P. . Phyllis Fox . Hodes . L. . Louis Hodes . Luckham . D. . David Luckham . Maling . K. . Park . D. . David Park (computer scientist) . Russell . S. . Steve Russell (computer scientist) . March 1969 . LISP I Programmers Manual . dead . Computation Center and Research Laboratory of Electronics . Artificial Intelligence Group, M.I.T. Computation Center and Research Laboratory . 88f . https://web.archive.org/web/20100717111134/http://history.siam.org/sup/Fox_1960_LISP.pdf . 17 July 2010 . In the local M.I.T. patois, association lists [of atomic symbols] are also referred to as "property lists", and atomic symbols are sometimes called "objects". . Boston, Massachusetts.
  4. Book: McCarthy . John . John McCarthy (computer scientist) . Abrahams . Paul W. . Edwards . Daniel J. . Hart . Swapnil D. . Levin . Michael I. . 1962 . LISP 1.5 Programmer's Manual . . 105 . 978-0-262-13011-0 . Object – a synonym for atomic symbol . dmy-all.
  5. Ivan E. Sutherland. Sketchpad: a man-machine graphical communication system. AFIPS '63 (Spring): Proceedings of the May 21–23, 1963 Spring Joint Computer Conference. AFIPS Press. May 1963. 329–346. 10.1145/1461551.1461591. free.
  6. Nygaard . Kristen . Kristen Nygaard. Dahl . Ole-Johan . Ole-Johan Dahl. August 1, 1978. The development of the SIMULA languages. ACM SIGPLAN Notices. 13. 8. 245–272. 10.1145/960118.808391. free.
  7. Web site: Ross . Doug . The first software engineering language . live . 13 May 2010 . LCS/AI Lab Timeline . MIT Computer Science and Artificial Intelligence Laboratory . en-US.
  8. Holmevik. Jan Rune. Compiling Simula: A historical study of technological genesis. IEEE Annals of the History of Computing. 16. 4. 25–37. Winter 1994. 10.1109/85.329756 . 18148999 . 3 March 2018 . 30 August 2017 . https://web.archive.org/web/20170830065454/http://www.idi.ntnu.no/grupper/su/publ/simula/holmevik-simula-ieeeannals94.pdf . dead.
  9. Madsen . Ole Lehrman . Kristen Nygaard . A.M. Turing Award Laureates . 4 February 2025.
  10. Book: Butcher . Paul . Seven Concurrency Models in Seven Weeks: When Threads Unravel . 30 June 2014 . Pragmatic Bookshelf . 978-1-68050-466-8 . 204 . en.
  11. Web site: Kay . Dr. Alan . 23 July 2003 . Dr. Alan Kay on the Meaning of "Object-Oriented Programming" . live . https://web.archive.org/web/20250304003920/http://userpage.fu-berlin.de/~ram/pub/pub_jf47ht81Ht/doc_kay_oop_en . 4 Mar 2025 . 11 February 2010 . en-US.
  12. Jones . Anita K. . Liskov. Barbara H. . April 1976 . An Access Control Facility for Programming Languages . MIT . CSG Memo 137.
  13. Book: Touch of Class: Learning to Program Well with Objects and Contracts. Bertrand Meyer. Springer Science & Business Media. 2009. 978-3-540-92144-8. 329. 2009tclp.book.....M.
  14. . March 1993 . The early history of Smalltalk . . en-US . 28 . 3 . 69–95 . 10.1145/155360.155364 . free.
  15. Borning . Alan Hamilton . 1979 . Thinglab: a constraint-oriented simulation laboratory . Stanford University.
  16. Moon . David A. . David A. Moon . June 1986 . Object-Oriented Programming with Flavors . Conference proceedings on Object-oriented Programming Systems Languages and Applications . 1–8 . 978-0-89791-204-4 . OOPSLA '86 . 10.1145/28697.28698 . 17150741 . 2022-03-17.
  17. News: Hsu . Hansen . 17 December 2020 . Introducing the Smalltalk Zoo . live . 27 May 2021 . CHM . en-US.
  18. LOOPS: data and object oriented Programming for Interlisp. 1982. European AI Conference. Bobrow. D. G.. Stefik. M. J.
  19. 1995 (June) Visual FoxPro 3.0, FoxPro evolves from a procedural language to an object-oriented language. Visual FoxPro 3.0 introduces a database container, seamless client/server capabilities, support for ActiveX technologies, and OLE Automation and null support. Summary of Fox releases
  20. 1995 Reviewers Guide to Visual FoxPro 3.0: DFpug.de
  21. Book: Object Oriented Programming with C++, 1E. 978-81-259-2532-3. Khurana. Rohit. 1 November 2009. Vikas Publishing House Pvt Limited.
  22. Deborah J. Armstrong. The Quarks of Object-Oriented Development. A survey of nearly 40 years of computing literature identified several fundamental concepts found in the large majority of definitions of OOP, in descending order of popularity: Inheritance, Object, Class, Encapsulation, Method, Message Passing, Polymorphism, and Abstraction.
  23. [John C. Mitchell]
  24. Michael Lee Scott, Programming language pragmatics, Edition 2, Morgan Kaufmann, 2006,, p. 470. Lists encapsulation, inheritance, and dynamic dispatch.
  25. Book: Pierce. Benjamin. Types and Programming Languages. MIT Press. 2002. 978-0-262-16209-8. Types and Programming Languages., section 18.1 "What is Object-Oriented Programming?" Lists: Dynamic dispatch, encapsulation or multi-methods (multiple dispatch), subtype polymorphism, inheritance or delegation, open recursion ("this"/"self")
  26. C. J. Date, Introduction to Database Systems, 6th-ed., Page 650
  27. Book: McDonough . James E. . Object-Oriented Design with ABAP: A Practical Approach . 2017 . . 978-1-4842-2837-1 . en-US . Encapsulation . 10.1007/978-1-4842-2838-8 . O'Reilly.
  28. Web site: 2023-01-05 . What is Object Oriented Programming (OOP) In Simple Words? – Software Geek Bytes . 2023-01-17 . en-US . 17 January 2023 . https://web.archive.org/web/20230117082128/https://softwaregeekbytes.com/object-oriented-programming-simple-words/ . dead .
  29. Cardelli . Luca . Wegner . Peter . 1985-12-10 . On understanding types, data abstraction, and polymorphism . ACM Computing Surveys . en-US . 17 . 4 . 471–523 . 10.1145/6041.6042 . 0360-0300 . free.
  30. Book: Jacobsen. Ivar. Object Oriented Software Engineering. 1992. Addison-Wesley ACM Press. 978-0-201-54435-0. 43–69. Magnus Christerson. Patrik Jonsson. Gunnar Overgaard.
  31. Web site: The Art of Unix Programming: Unix and Object-Oriented Languages. Raymond. Eric S.. 2003. 6 August 2014.
  32. Book: Armstrong . Joe . Joe Armstrong (programmer) . Coders at Work: Reflections on the Craft of Programming . Codersatwork.com . Seibel . Peter . en-US . 13 November 2009 . https://web.archive.org/web/20100305165150/http://www.codersatwork.com/ . 5 March 2010.
  33. Book: Brodie . Leo . 1984 . Thinking Forth . 92–93 . 4 May 2018.
  34. Web site: Category Extreme Programming . Hunt . Andrew . Don't Repeat Yourself . 4 May 2018.
  35. Book: Dony . C . Prototype-based programming: concepts, languages and applications . Malenfant . J . Bardon . D . 1999 . Springer . 9789814021258 . Singapore Berlin Heidelberg . en-US . Classifying prototype-based programming languages . https://www.lirmm.fr/~dony/postscript/proto-book.pdf.
  36. Web site: Is Go an object-oriented language? . live . April 13, 2019 . en-US . Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy..
  37. Stroustrup . Bjarne . Bjarne Stroustrup . Object-Oriented Programming without Inheritance (Invited Talk) . 2015 . 10.4230/LIPIcs.ECOOP.2015.1 . free . 29th European Conference on Object-Oriented Programming (ECOOP 2015) . 1:34.
  38. Web site: A few years ago I saw this page . Pike . Rob . 1 October 2016 . 14 November 2012. https://web.archive.org/web/20180814173134/http://plus.google.com/+RobPikeTheHuman/posts/hoJdanihKwb . 14 August 2018.
  39. Naik . Mayur . Kumar . Rajeev . March 2000 . Efficient message dispatch in object-oriented systems . ACM SIGPLAN Notices . en-uS . 35 . 3 . 49–58 . 10.1145/351159.351174.
  40. Web site: Stroustrup . Bjarne . Bjarne Stroustrup . February 19, 2007 . Bjarne Stroustrup's C++ Glossary . live . June 9, 2011 . en-US . polymorphism – providing a single interface to entities of different types..
  41. Book: Booch . Grady . Grady Booch . 1986 . Software Engineering with Ada . Addison Wesley . 978-0-8053-0608-8 . 220 . Perhaps the greatest strength of an object-oriented approach to development is that it offers a mechanism that captures a model of the real world..
  42. Wirth . Niklaus . Niklaus Wirth. IEEE Computer. 39. 1. January 23, 2006. 28–39. Good ideas, through the looking glass. Cover Feature. 10.1109/MC.2006.20. 2006Compr..39a..28W . 6582369. https://web.archive.org/web/20161012215755/https://pdfs.semanticscholar.org/10bd/dc49b85196aaa6715dd46843d9dcffa38358.pdf . dead . 12 October 2016.
  43. Web site: Uncle Bob SOLID principles . . 2 August 2018.
  44. Web site: Yegge . Steve . 30 March 2006 . Execution in the Kingdom of Nouns . 3 July 2010 . steve-yegge.blogspot.com .
  45. Web site: Boronczyk . Timothy . 11 June 2009 . What's Wrong with OOP . zaemis.blogspot.com . 3 July 2010.
  46. Web site: Design Principles and Design Patterns . Martin . Robert C. . Robert Cecil Martin . 28 April 2017 . dead . https://web.archive.org/web/20150906155800/http://www.objectmentor.com/resources/articles/Principles_and_Patterns.pdf . September 6, 2015.
  47. Web site: Neward . Ted . 26 June 2006 . The Vietnam of Computer Science . 2 June 2010 . Interoperability Happens . https://web.archive.org/web/20060704030226/http://blogs.tedneward.com/2006/06/26/The+Vietnam+Of+Computer+Science.aspx . 4 July 2006 . dead . dmy-all.
  48. C. J. Date, Hugh Darwen. Foundation for Future Database Systems: The Third Manifesto (2nd Edition)
  49. Wirfs-Brock. Rebecca. Wilkerson. Brian. Object-Oriented Design: A Responsibility-Driven Approach. ACM SIGPLAN Notices. 1989. 24. 10. 74. 10.1145/74878.74885. free.
  50. Web site: Karsh . Patrick . Jul 19, 2023 . GRASP Principles: Object-Oriented Design Patterns . Mar 30, 2025 . Medium.
  51. Web site: Poll. Erik. Subtyping and Inheritance for Categorical Datatypes. 5 June 2011.
  52. Book: Martin . Abadi . A Theory of Objects . 1996 . 21 April 2010 . 978-0-387-94775-4 . Springer-Verlag New York, Inc. . Martin Abadi. Cardelli, Luca.
  53. Tan . Tian . Li . Yue . 12 July 2023 . Tai-e: A Developer-Friendly Static Analysis Framework for Java by Harnessing the Good Designs of Classics. ISSTA 2023 . 1093–1105 . 10.1145/3597926.3598120.
  54. Bhutani . Vikram . Toosi . Farshad Ghassemi . Buckley . Jim . 1 June 2024 . Analysing the Analysers: An Investigation of Source Code Analysis Tools . Applied Computer Systems . 29 . 1 . 98–111 . 10.2478/acss-2024-0013.
  55. Book: Brucker . Achim D. . Wolff . Burkhart . ECOOP 2008 – Object-Oriented Programming . Extensible Universes for Object-Oriented Data Models . Lecture Notes in Computer Science . 2008 . 5142 . 438–462 . 10.1007/978-3-540-70592-5_19. 978-3-540-70591-8 . object-oriented programming is a widely accepted programming paradigm.
  56. News: Cassel . David . Why Are So Many Developers Hating on Object-Oriented Programming? . The New Stack . 21 August 2019.
  57. Productivity Analysis of Object-Oriented Software Developed in a Commercial Environment . Potok . Thomas . Vouk . Mladen . Rindos . Andy . Software: Practice and Experience . 29. 10. 833–847 . 1999 . 21 April 2010 . 10.1002/(SICI)1097-024X(199908)29:10<833::AID-SPE258>3.0.CO;2-P . 57865731.
  58. Web site: Less is exponentially more . Pike . Rob . 25 June 2012 . 1 October 2016.
  59. Pike . Rob . Rob Pike . 2 March 2004 . [9fans] Re: Threads: Sewing badges of honor onto a Kernel ]. 17 November 2016 . comp.os.plan9.
  60. Hickey . Rich . November 2009 . Are We There Yet? (keynote) . JVM Languages Summit.
  61. Web site: Stepanov . Alexander . Alexander Stepanov . 2001–2008 . STLport: An Interview with A. Stepanov . 21 April 2010.
  62. Web site: Ambler . Scott . 1 January 1998 . A Realistic Look at Object-Oriented Reuse . 5 August 2025 . drdobbs.com .
  63. Web site: Asaf . Shelly . Flaws of Object Oriented Modeling . 22 August 2008. 4 July 2010 . Intel Software Network .
  64. Web site: Justin . James . Multithreading is a verb not a noun . 1 October 2007 . 4 July 2010 . techrepublic.com . https://web.archive.org/web/20071010105117/http://blogs.techrepublic.com.com/programming-and-development/?p=518 . 10 October 2007 . dead . dmy-all.
  65. Web site: Asaf . Shelly . HOW TO: Multicore Programming (Multiprocessing) Visual C++ Class Design Guidelines, Member Functions . 22 August 2008 . 4 July 2010 . support.microsoft.com .
  66. Web site: Some thoughts on teaching FP. Robert Harper . Existential Type Blog. 5 December 2011. 17 April 2011. Robert Harper (computer scientist).
  67. Web site: Graham . Paul . Why ARC isn't especially Object-Oriented. . PaulGraham.com . 13 November 2009 . Paul Graham (computer programmer).
  68. Web site: Feldman . Richard . Why Isn't Functional Programming the Norm? . . 30 September 2019 . en.
  69. Web site: Krubner . Lawrence . Object Oriented Programming is an expensive disaster which must end . smashcompany.com . 14 October 2014 . https://web.archive.org/web/20141014233854/http://www.smashcompany.com/technology/object-oriented-programming-is-an-expensive-disaster-which-must-end . 14 October 2014 . dead.
  70. Cardelli . Luca . Luca Cardelli . 1996 . Bad Engineering Properties of Object-Oriented Languages . ACM Comput. Surv. . en-US . 28 . 4es . 150–es . 10.1145/242224.242415 . 0360-0300 . 12105785 . subscription . 21 April 2010.