Object-oriented programming
Object-oriented programming (OOP) is a
Many of the most widely used programming languages (such as
Significant object-oriented languages include
History
Terminology invoking "objects" in the modern sense of object-oriented programming made its first appearance at the
Independently of later MIT work such as AED,
I thought of objects being like biological cells and/or individual computers on a network, only able to communicate with messages (so messaging came at the very beginning – it took a while to see how to do messaging in a programming language efficiently enough to be useful).
Alan Kay, [1]
Influenced by the work at MIT and the Simula language, in November 1966
In the 1970s, the first version of the
During the late 1970s and 1980s, object-oriented programming rose to prominence. The
In the mid-1980s
In the early and mid-1990s object-oriented programming developed as the dominant programming
At
Object-oriented features have been added to many previously existing languages, including Ada, BASIC, Fortran, Pascal, and COBOL. Adding these features to languages that were not initially designed for them often led to problems with compatibility and maintainability of code.
More recently, some languages have emerged that are primarily object-oriented, but that are also compatible with procedural methodology. Two such languages are
Features
Object-oriented programming uses objects, but not all of the associated techniques and structures are supported directly in languages that claim to support OOP. The features listed below are common among languages considered to be strongly class- and object-oriented (or
- data structures like strings, lists, and hash tables that are either built-in or result from combining variables using memory pointers.
- Procedures – also known as functions, methods, routines, or loops and conditionals.
Modular programming support provides the ability to group procedures into files and modules for organizational purposes. Modules are namespaced so identifiers in one module will not conflict with a procedure or variable sharing the same name in another file or module.
Objects
An object is a
Objects sometimes correspond to things found in the real world.[27] For example, a graphics program may have objects such as "circle", "square", and "menu". An online shopping system might have objects such as "shopping cart", "customer", and "product". Sometimes objects represent more abstract entities, like an object that represents an open file, or an object that provides the service of translating measurements from U.S. customary to metric.
Objects can contain other objects in their instance variables; this is known as
The OOP paradigm has been criticized for overemphasizing the use of objects for software design and modeling at the expense of other important aspects (computation/algorithms).[29][30] For example, Rob Pike has said that OOP languages frequently shift the focus from data structures and algorithms to types.[31] Steve Yegge noted that, as opposed to functional programming:[32]
Object Oriented Programming puts the nouns first and foremost. Why would you go to such lengths to put one part of speech on a pedestal? Why should one kind of concept take precedence over another? It's not as if OOP has suddenly made verbs less important in the way we actually think. It's a strangely skewed perspective.
Rich Hickey, creator of Clojure, described object systems as overly simplistic models of the real world. He emphasized the inability of OOP to model time properly, which is getting increasingly problematic as software systems become more concurrent.[30]
Alexander Stepanov compares object orientation unfavourably to generic programming:[29]
I find OOP technically unsound. It attempts to decompose the world in terms of interfaces that vary on a single type. To deal with the real problems you need multisorted algebras — families of interfaces that span multiple types. I find OOP philosophically unsound. It claims that everything is an object. Even if it is true it is not very interesting — saying that everything is an object is saying nothing at all.
Inheritance
OOP languages are diverse, but typically OOP languages allow
In class-based programming, the most popular style, each object is required to be an instance of a particular class. The class defines the data format or type (including member variables and their types) and available procedures (class methods or member functions) for a given type or class of object. Objects are created by calling a special type of method in the class known as a constructor. Classes may inherit from other classes, so they are arranged in a hierarchy that represents "is-a-type-of" relationships. For example, class Employee might inherit from class Person. All the data and methods available to the parent class also appear in the child class with the same names. For example, class Person might define variables "first_name" and "last_name" with method "make_full_name()". These will also be available in class Employee, which might add the variables "position" and "salary". It is guaranteed that all instances of class Employee will have the same attributes, such as the name, position, and salary. Procedures and variables can be specific to either the class or the instance; this leads to the following terms:
- Class variables – belong to the class as a whole; there is only one copy of each variable, shared across all instances of the class
- Instance variables or attributes – data that belongs to individual objects; every object has its own copy of each one
- Member variables – refers to both the class and instance variables that are defined by a particular class
- Class methods – belong to the class as a whole and have access to only class variables and inputs from the procedure call
- Instance methods – belong to individual objects, and have access to instance variables for the specific object they are called on, inputs, and class variables
Depending on the definition of the language, subclasses may or may not be able to override the methods defined by superclasses. Multiple inheritance is allowed in some languages, though this can make resolving overrides complicated. Some languages have special support for other concepts like traits and mixins, though, in any language with multiple inheritance, a mixin is simply a class that does not represent an is-a-type-of relationship. Mixins are typically used to add the same methods to multiple classes. For example, class UnicodeConversionMixin might provide a method unicode_to_ascii() when included in class FileReader and class WebPageScraper, which do not share a common parent.
final
keyword can be used to prevent a class from being subclassed.[33]In contrast, in prototype-based programming, objects are the primary entities. Generally, the concept of a "class" does not even exist. Rather, the prototype or parent of an object is just another object to which the object is linked. In Self, an object may have multiple or no parents,[34] but in the most popular prototype-based language, Javascript, every object has one prototype link (and only one). New objects can be created based on already existing objects chosen as their prototype. You may call two different objects apple and orange a fruit if the object fruit exists, and both apple and orange have fruit as their prototype. The idea of the fruit class does not exist explicitly, but can be modeled as the equivalence class of the objects sharing the same prototype, or as the set of objects satisfying a certain interface (duck typing). Unlike class-based programming, it is typically possible in prototype-based languages to define attributes and methods not shared with other objects; for example, the attribute sugar_content may be defined in apple but not orange.
The doctrine of composition over inheritance advocates implementing has-a relationships using composition instead of inheritance. For example, instead of inheriting from class Person, class Employee could give each Employee object an internal Person object, which it then has the opportunity to hide from external code even if class Person has many public attributes or methods. Some languages like Go do not support inheritance at all. Go states that it is object-oriented,[35] and Bjarne Stroustrup, author of C++, has stated that it is possible to do OOP without inheritance.[36] Delegation is another language feature that can be used as an alternative to inheritance. Rob Pike has called object-oriented programming "the Roman numerals of computing"[37] and cites an instance of a Java professor whose "idiomatic" solution to a problem was to create six new classes, rather than to simply use a lookup table.[38]
Bob Martin states that because they are software, related classes do not necessarily share the relationships of the things they represent.[39]
Dynamic dispatch/message passing
It is the responsibility of the object, not any external code, to select the procedural code to execute in response to a method call, typically by looking up the method at run time in a table associated with the object. This feature is known as dynamic dispatch. If the call variability relies on more than the single type of the object on which it is called (i.e. at least one other parameter object is involved in the method choice), one speaks of multiple dispatch. A method call is also known as message passing. It is conceptualized as a message (the name of the method and its input parameters) being passed to the object for dispatch.
Dispatch interacts with inheritance; if a method is not present in a given object or class, the dispatch is delegated to its parent object or class, and so on, going up the chain of inheritance.
Data abstraction and encapsulation
Data abstraction is a design pattern in which data are visible only to semantically related functions, to prevent misuse. The success of data abstraction leads to frequent incorporation of data hiding as a design principle in object-oriented and pure functional programming. Similarly, encapsulation prevents external code from being concerned with the internal workings of an object. This facilitates code refactoring, for example allowing the author of the class to change how objects of that class represent their data internally without changing any external code (as long as "public" method calls work the same way). It also encourages programmers to put all the code that is concerned with a certain set of data in the same class, which organizes it for easy comprehension by other programmers. Encapsulation is a technique that encourages decoupling.
In object oriented programming, objects provide a layer which can be used to separate internal from external code and implement abstraction and encapsulation. External code can only use an object by calling a specific instance method with a certain set of input parameters, reading an instance variable, or writing to an instance variable. A program may create many instances of objects as it runs, which operate independently. This technique, it is claimed, allows easy re-use of the same procedures and data definitions for different sets of data, in addition to potentially mirroring real-world relationships intuitively. Rather than utilizing database tables and programming subroutines, the developer utilizes objects the user may be more familiar with: objects from their application domain.[40] These claims that the OOP paradigm enhances reusability and modularity have been criticized.[41][42]
If a class does not allow calling code to access internal object data and permits access through methods only, this is also a form of information hiding. Some languages (Java, for example) let classes enforce access restrictions explicitly, for example, denoting internal data with the private
keyword and designating methods intended for use by code outside the class with the public
keyword.[43] Methods may also be designed public, private, or intermediate levels such as protected
(which allows access from the same class and its subclasses, but not objects of a different class).[43] In other languages (like Python) this is enforced only by convention (for example, private
methods may have names that start with an underscore). In C#, Swift & Kotlin languages, internal
keyword permits access only to files present in the same assembly, package, or module as that of the class.[44]
In programming languages, particularly object-oriented ones, the emphasis on abstraction is vital. Object-oriented languages extend the notion of type to incorporate data abstraction, highlighting the significance of restricting access to internal data through methods.[45] Eric S. Raymond has written that object-oriented programming languages tend to encourage thickly layered programs that destroy transparency.[46] Raymond compares this unfavourably to the approach taken with Unix and the C programming language.[46]
The "
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 has suggested a connection between the standalone nature of objects and a tendency to duplicate code[47] in violation of the don't repeat yourself principle[48] of software development.
Polymorphism
Subtyping – a form of polymorphism – is when calling code can be independent of which class in the supported hierarchy it is operating on – the parent class or one of its descendants. Meanwhile, the same operation name among objects in an inheritance hierarchy may behave differently.
For example, objects of the type Circle and Square are derived from a common class called Shape. The Draw function for each type of Shape implements what is necessary to draw itself while calling code can remain indifferent to the particular type of Shape being drawn.
This is another type of abstraction that simplifies code external to the class hierarchy and enables strong separation of concerns.
Open recursion
A common feature of objects is that methods are attached to them and can access and modify the object's data fields. In this brand of OOP, there is usually a special name such as
OOP languages
Simula (1967) is generally accepted as being the first language with the primary features of an object-oriented language. It was created for making simulation programs, in which what came to be called objects were the most important information representation. Smalltalk (1972 to 1980) is another early example and the one with which much of the theory of OOP was developed. Concerning the degree of object orientation, the following distinctions can be made:
- Languages called "pure" OO languages, because everything in them is treated consistently as an object, from primitives such as characters and punctuation, all the way up to whole classes, prototypes, blocks, modules, etc. They were designed specifically to facilitate, even enforce, OO methods. Examples: Ruby, Scala, Smalltalk, Eiffel, Emerald,[49] JADE, Self, Raku.
- Languages designed mainly for OO programming, but with some procedural elements. Examples: VB.NET.
- Languages that are historically .
- Languages with most of the features of objects (classes, methods, inheritance), but in a distinctly original form. Examples: Oberon (Oberon-1 or Oberon-2).
- Languages with .
- Chameleon languages that support multiple paradigms, including OO. Tcl stands out among these for TclOO, a hybrid object system that supports both prototype-based programming and class-based OO.
Popularity and reception
Many widely used languages, such as C++, Java, and Python, provide object-oriented features. Although in the past object-oriented programming was widely accepted,
Richard Feldman argues that these languages may have improved their modularity by adding OO features, but they became popular for reasons other than being object-oriented.[53] In an article, Lawrence Krubner claimed that compared to other languages (LISP dialects, functional languages, etc.) OOP languages have no unique strengths, and inflict a heavy burden of unneeded complexity.[54] A study by Potok et al. has shown no significant difference in productivity between OOP and procedural approaches.[55] Luca Cardelli has claimed that OOP code is "intrinsically less efficient" than procedural code and that OOP can take longer to compile.[41]
OOP in dynamic languages
In recent years, object-oriented programming has become especially popular in
The Document Object Model of HTML, XHTML, and XML documents on the Internet has bindings to the popular JavaScript/ECMAScript language. JavaScript is perhaps the best known prototype-based programming language, which employs cloning from prototypes rather than inheriting from a class (contrast to class-based programming). Another scripting language that takes this approach is Lua.
OOP in a network protocol
The messages that flow between computers to request services in a client-server environment can be designed as the linearizations of objects defined by class objects known to both the client and the server. For example, a simple linearized object would consist of a length field, a code point identifying the class, and a data value. A more complex example would be a command consisting of the length and code point of the command and values consisting of linearized objects representing the command's parameters. Each such command must be directed by the server to an object whose class (or superclass) recognizes the command and can provide the requested service. Clients and servers are best modeled as complex object-oriented structures. Distributed Data Management Architecture (DDM) took this approach and used class objects to define objects at four levels of a formal hierarchy:
- Fields defining the data values that form messages, such as their length, code point and data values.
- Objects and collections of objects similar to what would be found in a Smalltalk program for messages and parameters.
- Managers similar to IBM i Objects, such as a directory to files and files consisting of metadata and records. Managers conceptually provide memory and processing resources for their contained objects.
- A client or server consisting of all the managers necessary to implement a full processing environment, supporting such aspects as directory services, security, and concurrency control.
The initial version of DDM defined distributed file services. It was later extended to be the foundation of Distributed Relational Database Architecture (DRDA).
Design patterns
Challenges of object-oriented design are addressed by several approaches. The most common is known as the
Inheritance and behavioral subtyping
It is intuitive to assume that inheritance creates a
Gang of Four design patterns
The book describes the following patterns:
- Creational patterns (5): Factory method pattern, Abstract factory pattern, Singleton pattern, Builder pattern, Prototype pattern
- Structural patterns (7): Adapter pattern, Bridge pattern, Composite pattern, Decorator pattern, Facade pattern, Flyweight pattern, Proxy pattern
- Behavioral patterns (11): Chain-of-responsibility pattern, Command pattern, Interpreter pattern, Iterator pattern, Mediator pattern, Memento pattern, Observer pattern, State pattern, Strategy pattern, Template method pattern, Visitor pattern
Object-orientation and databases
Both object-oriented programming and
There are also object databases that can be used to replace RDBMSs, but these have not been as technically and commercially successful as RDBMSs.
Real-world modeling and relationships
OOP can be used to associate real-world objects and processes with digital counterparts. However, not everyone agrees that OOP facilitates direct real-world mapping (see Criticism section) or that real-world mapping is even a worthy goal; Bertrand Meyer argues in Object-Oriented Software Construction[57] 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". At the same time, some principal limitations of OOP have been noted.[58] For example, the
However, Niklaus Wirth (who popularized the adage now known as Wirth's law: "Software is getting slower more rapidly than hardware becomes faster") said of OOP in his paper, "Good Ideas through the Looking Glass", "This paradigm closely reflects the structure of systems 'in the real world', and it is therefore well suited to model complex systems with complex behaviors"[59] (contrast KISS principle).
Steve Yegge and others noted that natural languages lack the OOP approach of strictly prioritizing things (objects/nouns) before actions (methods/verbs).[60] This problem may cause OOP to suffer more convoluted solutions than procedural programming.[61]
OOP and control flow
OOP was developed to increase the
Responsibility- vs. data-driven design
Responsibility-driven design defines classes in terms of a contract, that is, a class should be defined around a responsibility and the information that it shares. This is contrasted by Wirfs-Brock and Wilkerson with data-driven design, where classes are defined around the data-structures that must be held. The authors hold that responsibility-driven design is preferable.
SOLID and GRASP guidelines
- Single responsibility principle
- Open/closed principle
- Liskov substitution principle
- Interface segregation principle
- Dependency inversion principle
GRASP (General Responsibility Assignment Software Patterns) is another set of guidelines advocated by Craig Larman.
Formal semantics
Objects are the run-time entities in an object-oriented system. They may represent a person, a place, a bank account, a table of data, or any item that the program has to handle.
There have been several attempts at formalizing the concepts used in object-oriented programming. The following concepts and constructs have been used as interpretations of OOP concepts:
- co algebraic data types[67]
- recursive types
- encapsulated state
- inheritance
- subtype polymorphism and parametric polymorphism(generics)
Attempts to find a consensus definition or theory behind objects have not proven very successful (however, see Abadi & Cardelli, A Theory of Objects[68] for formal definitions of many OOP concepts and constructs), and often diverge widely. For example, some definitions focus on mental activities, and some on program structuring. One of the simpler definitions is that OOP is the act of using "map" data structures or arrays that can contain functions and pointers to other maps, all with some syntactic and scoping sugar on top. Inheritance can be performed by cloning the maps (sometimes called "prototyping").
See also
- Comparison of programming languages (object-oriented programming)
- Comparison of programming paradigms
- Component-based software engineering
- Design by contract
- Object association
- Object database
- Object model reference
- Object modeling language
- Object-oriented analysis and design
- Object-oriented ontology
- Object-relational impedance mismatch(and The Third Manifesto)
- Object-relational mapping
Systems
- CADES
- Common Object Request Broker Architecture (CORBA)
- Distributed Component Object Model
- Distributed Data Management Architecture
- Jeroo
Modeling languages
References
- ^ a b c d "Dr. Alan Kay on the Meaning of "Object-Oriented Programming"". 2003. Retrieved 11 February 2010.
- ^ Kindler, E.; Krivy, I. (2011). "Object-Oriented Simulation of systems with sophisticated control". International Journal of General Systems: 313–343.
- ISBN 978-0-321-53205-3., section 1.6 "Object-Oriented Programming"
- ^ a b Bloch 2018, pp. xi–xii, Foreword.
- M.I.T. Computation Center and Research Laboratory: 88f. Archived from the original(PDF) on 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".
- ISBN 978-0-262-13011-0.
Object — a synonym for atomic symbol
- ^ Sutherland, I. E. (30 January 1963). "Sketchpad: A Man-Machine Graphical Communication System". Technical Report No. 296, Lincoln Laboratory, Massachusetts Institute of Technology via Defense Technical Information Center (stinet.dtic.mil). Archived from the original on 8 April 2013. Retrieved 17 July 2019.
- ^ a b The Development of the Simula Languages, Kristen Nygaard, Ole-Johan Dahl, p.254 Uni-kl.ac.at Archived 28 August 2006 at the Wayback Machine
- ^ Ross, Doug. "The first software engineering language". LCS/AI Lab Timeline. MIT Computer Science and Artificial Intelligence Laboratory. Retrieved 13 May 2010.
- ^ S2CID 18148999. Archived from the original(PDF) on 30 August 2017. Retrieved 3 March 2018.
- ISBN 978-1-68050-466-8.
- ^ Jones, Anita K.; Liskov, Barbara H. (April 1976). An Access Control Facility for Programming Languages (PDF) (Technical report). MIT. CSG Memo 137.
- ^ ISBN 978-3-540-92144-8.
- ^ Kay, Alan. "The Early History of Smalltalk". Archived from the original on 10 July 2008. Retrieved 13 September 2007.
- S2CID 17150741. Retrieved 17 March 2022.
- ^ "Introducing the Smalltalk Zoo". CHM. 17 December 2020.
- ^ Bobrow, D. G.; Stefik, M. J (1982). LOOPS: data and object oriented Programming for Interlisp (PDF). European AI Conference.
- ^ 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
- ^ FoxPro History web site: Foxprohistory.org
- ^ 1995 Reviewers Guide to Visual FoxPro 3.0: DFpug.de
- ISBN 978-81-259-2532-3.
- ^ 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.
- ISBN 0-521-78098-5, p.278. Lists: Dynamic dispatch, abstraction, subtype polymorphism, and inheritance.
- ISBN 0-12-633951-1, p. 470. Lists encapsulation, inheritance, and dynamic dispatch.
- ISBN 978-0-262-16209-8., 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")
- ^ C. J. Date, Introduction to Database Systems, 6th-ed., Page 650
- ISBN 978-0-8053-0608-8.
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.
- ^ C. J. Date, Hugh Darwen. Foundation for Future Database Systems: The Third Manifesto (2nd Edition)
- ^ a b Stepanov, Alexander. "STLport: An Interview with A. Stepanov". Retrieved 21 April 2010.
- ^ a b Rich Hickey, JVM Languages Summit 2009 keynote, Are We There Yet? November 2009.
- ^ Pike, Rob (25 June 2012). "Less is exponentially more". Retrieved 1 October 2016.
- ^ "Stevey's Blog Rants: Execution in the Kingdom of Nouns". Retrieved 20 May 2020.
- ^ Bloch 2018, p. 19, Chapter §2 Item 4 Enforce noninstantiability with a private constructor.
- ISBN 9789814021258.
- ^ "Is Go an object-oriented language?". Retrieved 13 April 2019.
Although Go has types and methods and allows an object-oriented style of programming, there is no type hierarchy.
- .
- ^ Pike, Rob (2 March 2004). "[9fans] Re: Threads: Sewing badges of honor onto a Kernel". comp.os.plan9 (Mailing list). Retrieved 17 November 2016.
- ^ Pike, Rob (14 November 2012). "A few years ago I saw this page". Archived from the original on 14 August 2018. Retrieved 1 October 2016.
- ^ "Uncle Bob SOLID principles". YouTube.
- ISBN 978-0-201-54435-0.
- ^ S2CID 12105785. Retrieved 21 April 2010.
- ^ a b Armstrong, Joe. In Coders at Work: Reflections on the Craft of Programming. Peter Seibel, ed. Codersatwork.com Archived 5 March 2010 at the Wayback Machine, Accessed 13 November 2009.
- ^ a b Bloch 2018, pp. 73–77, Chapter §4 Item15 Minimize the accessibility of classes and members.
- ^ "What is Object Oriented Programming (OOP) In Simple Words? – Software Geek Bytes". 5 January 2023. Retrieved 17 January 2023.
- ISSN 0360-0300.
- ^ a b c Eric S. Raymond (2003). "The Art of Unix Programming: Unix and Object-Oriented Languages". Retrieved 6 August 2014.
- ^ Brodie, Leo (1984). Thinking Forth (PDF). pp. 92–93. Retrieved 4 May 2018.
- ^ Hunt, Andrew. "Don't Repeat Yourself". Category Extreme Programming. Retrieved 4 May 2018.
- ^ "The Emerald Programming Language". 26 February 2011.
- ISBN 978-3-540-70591-8.
object-oriented programming is a widely accepted programming paradigm
- ^ Cassel, David (21 August 2019). "Why Are So Many Developers Hating on Object-Oriented Programming?". The New Stack.
- Graham, Paul. "Why ARC isn't especially Object-Oriented". PaulGraham.com. Retrieved 13 November 2009.
- ^ Feldman, Richard. "Why Isn't Functional Programming the Norm?". YouTube.
- ^ 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.
- S2CID 57865731. Retrieved 21 April 2010.
- ^ Neward, Ted (26 June 2006). "The Vietnam of Computer Science". Interoperability Happens. Archived from the original on 4 July 2006. Retrieved 2 June 2010.
- ^ Meyer, Second Edition, p. 230
- ^ M.Trofimov, OOOP – The Third "O" Solution: Open OOP. First Class, OMG, 1993, Vol. 3, issue 3, p.14.
- S2CID 6582369. Archived from the original(PDF) on 12 October 2016. Retrieved 2 October 2016.
- ^ Yegge, Steve (30 March 2006). "Execution in the Kingdom of Nouns". steve-yegge.blogspot.com. Retrieved 3 July 2010.
- ^ Boronczyk, Timothy (11 June 2009). "What's Wrong with OOP". zaemis.blogspot.com. Retrieved 3 July 2010.
- ^ Ambler, Scott (1 January 1998). "A Realistic Look at Object-Oriented Reuse". drdobbs.com. Retrieved 4 July 2010.
- ^ Shelly, Asaf (22 August 2008). "Flaws of Object Oriented Modeling". Intel Software Network. Retrieved 4 July 2010.
- ^ 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.
- ^ Shelly, Asaf (22 August 2008). "HOW TO: Multicore Programming (Multiprocessing) Visual C++ Class Design Guidelines, Member Functions". support.microsoft.com. Retrieved 4 July 2010.
- ^ Robert Harper (17 April 2011). "Some thoughts on teaching FP". Existential Type Blog. Retrieved 5 December 2011.
- ^ Poll, Erik. "Subtyping and Inheritance for Categorical Datatypes" (PDF). Retrieved 5 June 2011.
- ^ ISBN 978-0-387-94775-4. Retrieved 21 April 2010.
Further reading
- ISBN 978-0-387-94775-4.
- ISBN 978-0-262-01153-2. Archived from the originalon 26 December 2017. Retrieved 22 January 2006.
- Armstrong, Deborah J. (February 2006). "The Quarks of Object-Oriented Development". Communications of the ACM. 49 (2): 123–128. S2CID 11485502.
- Bloch, Joshua (2018). "Effective Java: Programming Language Guide" (third ed.). Addison-Wesley. ISBN 978-0134685991.
- ISBN 978-0-8053-5340-2.
- Eeles, Peter; ISBN 978-0-471-19176-6.
- ISBN 978-0-201-63361-0.
- ISBN 978-0-471-14717-6.
- ISBN 978-0-201-54435-0.
- Kay, Alan. The Early History of Smalltalk. Archived from the original on 4 April 2005. Retrieved 18 April 2005.
- ISBN 978-0-13-629155-8.
- Pecinovsky, Rudolf (2013). OOP – Learn Object Oriented Thinking & Programming. Bruckner Publishing. ISBN 978-80-904661-8-0.
- ISBN 978-0-13-629841-0.
- Schach, Stephen (2006). Object-Oriented and Classical Software Engineering, Seventh Edition. ISBN 978-0-07-319126-3.
- Schreiner, Axel-Tobias (1993). Object oriented programming with ANSI-C. Hanser. ISBN 978-3-446-17426-9.
- Taylor, David A. (1992). Object-Oriented Information Systems – Planning and Implementation. John Wiley & Sons. ISBN 978-0-471-54364-0.
- Weisfeld, Matt (2009). The Object-Oriented Thought Process, Third Edition. ISBN 978-0-672-33016-2.
- West, David (2004). Object Thinking (Developer Reference). ISBN 978-0-7356-1965-4.