A paradigm of programming.

There's a craze about any new software using the term "Object-Oriented". But if you ask people what it means to be "OO", most won't be able to tell anything, because it's only a buzzword.

The meaningful ideas that have to be isolated and distinguished behind this fad are that of having a unified way to manipulate objects, but few understand it even partially, and even fewer are those fully conscious of what it means.

Another buzzword associated to "OO" is inheritance, often incorrectly presented as the essence of "OO" design, whereas it is only a braindead special-case way of organizing objects, often done with a lot of confusion.

Typical confusion in "OO" approaches are between (constant) values and (variable) state-holders, between (semantical) objects and (meta-semantical) environments, between (specificational) abstraction level and (implementational) dispatch-time (run-time vs compile-time), etc. In a sane design, these concepts would be distinguished and made orthogonal; they would not even intervene at all at the same place in the semantics.

For instance, most "OO" languages (like Java, C++) can't distinguish the notion of a constant, absolute, value, as soon as this value is not "atomic" in the hardware (a curious limitation for alleged "high-level" languages); all objects are then modifiable records, which leads to all kinds of unsafety, bugs, and contortions when manipulating putatively constant recursive structures.

Languages with single-dispatch (among which are C++ and Java again) also confuse the objects being manipulated with the environment in which they are manipulated; they force the programmer to define the semantics of "an integer", or "a polynomial", whereas anyone with a little background in formal mathematics knows that an isolated integer or polynomial has no meaning; only the set of integers, or the set of polynomials, has meaning. More generally, isolated objects mean nothing, only structured sets of objects do; and these language don't allow to manipulate those sets, to describe their properties. Languages with multiple dispatch, such as CLOS or Cecil, do a better job of not associating environments to objects.

Even with multiple dispatch, all the widespread OO languages have a unique global environment to dispatch (multi)methods according to objects' class. This means that there is only one fixed way of looking at objects, whereas mathematicians will also tell you how the interesting properties of structures lie in the infinity of ways to isomorphically reformulate them. The only way round this unicity of view is the explicit wrapping of objects into new classes; but most languages do not allow generic wrappers, and/or impose restrictions in the specification and implementation of wrapped objects.

Kent M. Pitman has written a great essay about object-orientation as a term, What's in a name? Uses and Abuses of Lisp Terminology within his set of articles, Parenthetically-Speaking.

For true OO languages, see CLOS, Simula, Beta, Dylan, Self, Smalltalk, OCAML.

For languages with true OO extensions, see Lisp, Perl, Scheme, Forth.

For false OO languages, see Ada, C++, Java, Visual BASIC.

Pages in this topic: ABCL   Agora   Amiga E   Brain   C#   Cecil   Cel   Claire   CLIPS   CLOS   Dylan   E   Eidola   Eiffel   Ellie   EuLisp   Functional and Object-Oriented   Goo   Haskell   Hobbit   Io   Kaleidoscope   Kevo   kew   Lava   LENS   LIFE   Moby   Moostrap   Morphe   Mozart/Oz   Needle   NetCLOS   NUT   O'Haskell   Objective-C   Obliq   OCAML   OOP   Pike   Python   Ruby   Sather   Scala   Self   Simula   Sina   Slate   TOM   Unicon  

Also linked from: Actor   Ada   AdaOS   Aldor   AmigaOS   BASIC   Benjamin C. Pierce   Blue   C++   Caper   CLIM   Dispatch   Forth   FramerD   GENS   Hidden Algebra   Java   Luca Cardelli   Object   OO   OZONE   Prolog   prototype-based   RbCl   Reverse Literate Programming   Scheme   Sigil   Smalltalk   Squeak   Tigger   Unified   Unity Project