Object-Oriented Programming: Features

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 10

Object-oriented programming

From Wikipedia, the free encyclopedia

"Object-oriented" redirects here. For other meanings of object-oriented, see Object-orientation.


"Object-oriented programming language" redirects here. For a list of object-oriented programming
languages, see List of object-oriented programming languages.
Object-oriented programming (OOP) is a programming paradigm based on the concept of
"objects", which are data structures that contain data, in the form of fields, often known
as attributes; and code, in the form of procedures, often known as methods. A distinguishing feature
of objects is that an object's procedures can access and often modify the data fields of the object
with which they are associated (objects have a notion of "this" or "self"). In OO programming,
computer programs are designed by making them out of objects that interact with one another.[1]
[2]
There is significant diversity in object-oriented programming, but most popular languages
are class-based, meaning that objects are instances of classes, which typically also determines
their type.
Many of the most widely used programming languages are multi-paradigm programming
languages that support object-oriented programming to a greater or lesser degree, typically in
combination with imperative, procedural programming. Significant object-oriented languages
include Python, C++, Objective-C, Smalltalk, Delphi, Java, Swift, C#, Perl, Ruby and PHP.

Features[edit]
Object-oriented programming by definition uses objects, but not all of the associated techniques and
structures are supported directly in languages which claim to support OOP. The features listed below
are, however, common among languages considered strongly class and object-oriented (or multiparadigm with OOP support), with notable exceptions mentioned. [3][4][5][6]
See also: Comparison of programming languages (object-oriented programming) and List of objectoriented programming terms

Shared with non-OOP predecessor languages[edit]


Object-oriented programming languages typically share low-level features with high-level procedural
programming languages (which were invented first). The fundamental tools that can be used to
construct a program include:

Variables which can store information formatted in a small number of built-in data
types like integers and alphanumericcharacters. This may include 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 subroutines - that take input,
generate output, and manipulate data. Modern languages include structured
programming constructs like loops and conditionals.

Modular programming support provides the ability to group procedures into files and modules for
organizational purposes. Modules are namespaced so code in one module will not be accidentally
confused with the same procedure or variable name in another file or module.

Objects and classes[edit]

Languages that support object-oriented programming typically use inheritance for code reuse and
extensibility in the form of eitherclasses or prototypes. Those that use classes support two main
concepts:

Objects - structures that contain both data and procedures


Classes - definitions for the data format and available procedures for a given type or class of
object; may also contain data and procedures (known as class methods) themselves

Objects sometimes correspond to things found in the real world. For example, a graphics program
may have objects such as "circle," "square," "menu." An online shopping system might have objects
such as "shopping cart," "customer," and "product."[7] Sometimes objects represent more abstract
entities, like an object that represents an open file, or an object which provides the service of
translating measurements from U.S. customary to metric.
Each object is said to be an instance of a particular class (for example, an object with its name field
set to "Mary" might be an instance of class Employee). Procedures in object-oriented programming
are known as methods; variables are also known as fields, members, attributes, or properties. This
leads to the following terms:

Class variables - belong to the class as a whole; there is only one copy of each one

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 only to 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

Objects are accessed somewhat like variables with complex internal structure, and in many
languages are effectively pointers, serving as actual references to an single instance of said object in
memory within a heap or stack. They provide a layer of abstraction which can be used to separate
internal from external code. External code can use an object by calling a specific instance method
with a certain set of input parameters, read an instance variable, or write to an instance variable.
Objects are created by calling a special type of method in the class known as a constructor. A
program may create many instances of the same class as it runs, which operate independently. This
is an easy way for the same procedures to be used on different sets of data.
Object-oriented programming that uses classes is sometimes called class-based programming,
while prototype-based programming does not typically use classes. As a result, a significantly
different yet analogous terminology is used to define the concepts of object and instance.
In some languages classes and objects can be composed using other concepts
like traits and mixins.

Dynamic dispatch/message passing[edit]


By definition, it is the responsibility of the object, not the external code, to 'on-demand' select the
procedural code to run/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, and
distinguishes an object from an abstract data type (or module), which has a fixed (static)
implementation of the operations for all instances. If there are multiple methods that might be run for
a given name (which may require some language support), it is known as 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.

Encapsulation[edit]
If a class disallows calling code from accessing internal object data and forces access through
methods only, this is a strong form of abstraction or information hiding known asencapsulation.
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. Methods may also be designed public, private, or
intermediate levels such asprotected (which typically allows access from other objects of the same
class, but not objects of a different class). In other languages (like Python) this is enforced only by
convention (for example, naming "private" methods starting with an underscore). This is useful
because it prevents the 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 often used as a technique for encouraging decoupling.

Composition, inheritance, and delegation[edit]


Objects can contain other objects in their instance variables; this is known as object composition.
For example, an object in the Employee class might contain (point to) an object in the Address class,
in addition to its own instance variables like "first_name" and "position". Object composition is used
to represent "has-a" relationships: every employee has an address, so every Employee object has a
place to store an Address object.
Languages that support classes almost always support inheritance. This allows classes to be
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". This technique allows easy re-use of the same
procedures and data definitions, in addition to potentially mirroring real-world relationships in an
intuitive way. These classes and subclasses correspond to sets and subsets in mathematical logic.
Rather than utilizing database tables and programming subroutines, the developer utilizes objects
the user may be more familiar with: objects from their application domain. [8]
Subclasses can 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 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 don't share
a common parent.
Abstract classes cannot be instantiated into objects; they exist only for the purpose of inheritance
into other "concrete" classes which can be instantiated. In Java, the finalkeyword can be used to
prevent a class from being subclassed.

The doctrine of composition over inheritance advocates implementing is-a-type-of 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.
The "open/closed principle" advocates that classes and functions "should be open for extension, but
closed for modification".
Delegation is another language feature that can be used as an alternative to inheritance.

Polymorphism[edit]
Subtyping, a form of polymorphism, is when calling code can be agnostic as to whether an object
belongs to a parent class or one of its descendants. For example, a function might call
"make_full_name()" on an object, which will work whether the object is of class Person or class
Employee. This is another type of abstraction which simplifies code external to the class hierarchy
and enables strong separation of concerns.

Open recursion[edit]
In languages that support open recursion, object methods can call other methods on the same
object (including themselves), typically using a special variable or keyword called this or self. This
variable is late-bound; it allows a method defined in one class to invoke another method that is
defined later, in some subclass thereof.

OOP languages[edit]
This section does not cite any references or sources. Please help improve this section
by adding citations to reliable sources. Unsourced material may be challenged
and removed. (August 2009)
See also: List of object-oriented programming languages
Simula (1967) is generally accepted as 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 arguably the canonical example, and the
one with which much of the theory of object-oriented programming 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: Eiffel, Emerald,[22] JADE, Obix, Ruby,Scala, Smalltalk, Self.

Languages designed mainly for OO programming, but with some procedural elements.
Examples: Delphi/Object Pascal, C++, Java, C#, VB.NET.

Languages that are historically procedural languages, but have been extended with some OO
features. Examples: Pascal, Visual Basic (derived from
BASIC), MATLAB,Fortran, Perl, COBOL 2002, PHP, ABAP, Ada 95.

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 abstract data type support which may be used to resemble OO programming, but
without all features of object-orientation. This includes object-based andprototype-based languages.
Examples: Modula-2, Pliant, CLU, JavaScript, Lua.

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.

OOP in dynamic languages[edit]


In recent years, object-oriented programming has become especially popular in dynamic programming
languages. Python, Ruby and Groovy are dynamic languages built on OOP principles,
while Perl and PHP have been adding object-oriented features since Perl 5 and PHP 4, and ColdFusion since
version 6.
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). BeforeECMAScript 6, only a prototype-based object model was supported.
Another scripting language that takes this approach is Lua.

OOP in a network protocol[edit]


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 is able to 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 their length, codepoint 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 AS/400 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[edit]
Challenges of object-oriented design are addressed by several methodologies. Most common is known as
the design patterns codified by Gamma et al.. More broadly, the term "design patterns" can be used to refer to
any general, repeatable solution to a commonly occurring problem in software design. Some of these
commonly occurring problems have implications and solutions particular to object-oriented development.

Inheritance and behavioral subtyping[edit]


See also: Object-oriented design
It is intuitive to assume that inheritance creates a semantic "is a" relationship, and thus to infer that objects
instantiated from subclasses can always be safely used instead of those instantiated from the superclass. This
intuition is unfortunately false in most OOP languages, in particular in all those that
allow mutable objects. Subtype polymorphism as enforced by the type checker in OOP languages (with
mutable objects) cannot guarantee behavioral subtyping in any context. Behavioral subtyping is undecidable in
general, so it cannot be implemented by a program (compiler). Class or object hierarchies must be carefully
designed, considering possible incorrect uses that cannot be detected syntactically. This issue is known as
the Liskov substitution principle.

Gang of Four design patterns[edit]


Main article: Design pattern (computer science)
Design Patterns: Elements of Reusable Object-Oriented Software is an influential book published in 1995
by Erich Gamma, Richard Helm, Ralph Johnson, and John Vlissides, often referred to humorously as the
"Gang of Four". Along with exploring the capabilities and pitfalls of object-oriented programming, it describes 23
common programming problems and patterns for solving them. As of April 2007, the book was in its 36th
printing.
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[edit]


Main articles: Object-relational impedance mismatch, Object-relational mapping and Object database

Both object-oriented programming and relational database management systems (RDBMSs) are extremely
common in software today. Since relational databases don't store objects directly (though some RDBMSs have
object-oriented features to approximate this), there is a general need to bridge the two worlds. The problem of
bridging object-oriented programming accesses and data patterns with relational databases is known as objectrelational impedance mismatch. There are a number of approaches to cope with this problem, but no general
solution without downsides.[23] One of the most common approaches is object-relational mapping, as found
in IDE languages such as Visual FoxProand libraries such as Java Data Objects and Ruby on Rails'
ActiveRecord.
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[edit]


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 (seeCriticism section) or that real-world
mapping is even a worthy goal; Bertrand Meyer argues in Object-Oriented Software Construction[24] 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 had been noted. [25] For example, the circle-ellipse
problem is difficult to handle using OOP's concept of inheritance.
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 behaviours" (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).[26] This problem may cause OOP to suffer
more convoluted solutions than procedural programming.[27]

OOP and control flow[edit]


OOP was developed to increase the reusability and maintainability of source code.[28] Transparent
representation of the control flow had no priority and was meant to be handled by a compiler. With the
increasing relevance of parallel hardware and multithreaded coding, developing transparent control flow
becomes more important, something hard to achieve with OOP.[29][30][31][32]

Responsibility- vs. data-driven design[edit]


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 datadriven 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[edit]


SOLID is a mnemonic invented by Michael Feathers that stands for and advocates five programming practices:

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.

Criticism[edit]
The OOP paradigm has been criticised for a number of reasons, including not meeting its stated goals of
reusability and modularity,[33][34] and for overemphasizing one aspect of software design and modeling
(data/objects) at the expense of other important aspects (computation/algorithms). [35][36]
Luca Cardelli has claimed that OOP code is "intrinsically less efficient" than procedural code, that OOP can
take longer to compile, and that OOP languages have "extremely poor modularity properties with respect to
class extension and modification", and tend to be extremely complex. [33] The latter point is reiterated by Joe
Armstrong, the principal inventor of Erlang, who is quoted as saying:[34]
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.
A study by Potok et al. has shown no significant difference in productivity between OOP and procedural
approaches.[37]
Christopher J. Date stated that critical comparison of OOP to other technologies, relational in particular, is
difficult because of lack of an agreed-upon and rigorous definition of OOP; [38] however, Date and Darwen have
proposed a theoretical foundation on OOP that uses OOP as a kind of customizable type system to
support RDBMS.[39]
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. [40]
Alexander Stepanov compares object orientation unfavourably to Generic programming:[35]
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.
Paul Graham has suggested that OOP's popularity within large companies is due to "large (and frequently
changing) groups of mediocre programmers." According to Graham, the discipline imposed by OOP prevents
any one programmer from "doing too much damage." [41]

Steve Yegge noted that, as opposed to functional programming:[42]


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.[36]
Eric S. Raymond, a Unix programmer and open-source software advocate, has been critical of claims that
present object-oriented programming as the "One True Solution," and has written that object-oriented
programming languages tend to encourage thickly layered programs that destroy transparency.[43] Raymond
compares this unfavourably to the approach taken with Unix and the C programming language.[43]

Formal semantics[edit]
See also: Formal semantics of programming languages
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[44]

abstract data types (which have existential types) allow the definition of modules but these do not
support dynamic dispatch

recursive types

encapsulated state

inheritance

records are basis for understanding objects if function literals can be stored in fields (like in functional
programming languages), but the actual calculi need be considerably more complex to incorporate
essential features of OOP. Several extensions of System F<: that deal with mutable objects have been
studied;[45] these allow both 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[45] 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").

You might also like