# Programació orientada a objectes

La programació orientada a objectes o POO (OOP segons les seves sigles en anglès) és un paradigma de programació que intenta proporcionar un model de programació basat en objectes que contenen dades i procediments associats coneguts com a mètodes. Aquests objectes, que solen ser instàncies de classes, són un tipus abstracte de dades que encapsulen (amaguen) tant les dades com les funcions per a accedir-hi.
Els objectes s'utilitzen per a interactuar amb d'altres en el disseny d'aplicacions i programes informàtics. Actualment existeixen una gran varietat de llenguatges de programació que suporten l'orientació a objectes. C++, Objective-C, Smalltalk, Delphi, Java, Javascript, C#, Perl, Python, Ruby i PHP en són uns exemples.

## Introducció

Els objectes són entitats que tenen un determinat estat, comportament (mètode) i identitat. En la creació i el disseny dels objectes s'utilitza la jerarquia de classes. Aquestes classes i subclasses corresponent a conjunts i subconjunts en lògica matemàtica. En aquest cas en comptes d'utilitzar taules de base de dades i programació de subrutines, els desenvolupadors utilitzen els objectes.
Els mètodes (comportament) i atributs (estat) estan relacionats, de tal manera que una classe requereix mètodes per a poder interactuar amb els atributs de l'objecte. Un concepte clau en la POO és l'encapsulació i ocultació d'informació.
L'encapsulació és un mecanisme que consisteix a organitzar dades i mètodes en una mateixa estructura. Així, un usuari d'una classe determinada no necessita saber com estan estructurades les dades d'aquell objecte ni la implementació d'aquest. Per garantir la integritat de les dades es provoca que l'usuari no pugui modificar directament els atributs. L'encapsulació defineix els nivells d'accés pels elements d'aquest objecte. Existeixen 3 nivells d'accés: públic protegit i privat.

## Història

La terminologia que invoca "objectes" en el sentit modern de la programació orientada a objectes va fer la seva primera aparició al MIT a finals dels anys 50 i principis dels 60. En l'entorn del grup de l'intel·ligència artificial, ja l'any 1960, "objecte" podia referir-se a elements identificats (àtoms LISP) amb propietats (atributs); Alan Kay més tard va citar una comprensió detallada dels aspectes interns de LISP com una forta influència en el seu pensament l'any 1966, i que va utilitzar el terme "programació orientada a objectes" a la conversa des de 1967. Encara que de vegades es diu "el pare de la programació orientada a objectes", Alan Kay ha diferenciat la seva noció d'OO de la noció d'objectes de tipus de dades abstractes més convencional, i ha donat a entendre que l'establishment informàtic no va adoptar la seva noció. Una nota del MIT de 1976, coautora per Barbara Liskov enumera Simula 67, CLU i Alphard com a llenguatges orientats a objectes, però no esmenta Smalltalk.
| « | Vaig pensar que els objectes eren com cèl·lules biològiques i/o ordinadors individuals en una xarxa, només capaços de comunicar-se amb missatges (així que la missatgeria va arribar al principi; va trigar una estona a veure com fer missatges en un llenguatge de programació de manera prou eficient per ser útil). | » |
| — Alan Kay, |||
Un altre dels primers exemples del MIT va ser el Sketchpad creat per Ivan Sutherland el 1960–1961; en el glossari de l'informe tècnic de 1963 basat en la seva dissertació sobre Sketchpad, Sutherland va definir les nocions d'"objecte" i "instància" (amb el concepte de classe cobert per "mestre" o "definició"), encara que especialitzat en la interacció gràfica. A més, una versió del MIT ALGOL, AED-0, va establir un enllaç directe entre estructures de dades ("plexes", en aquest dialecte) i procediments, prefigurant el que més tard es van anomenar "missatges", "mètodes" i "funcions de membre".
Simula va introduir conceptes importants que avui són una part essencial de la programació orientada a objectes, com ara classe i objecte, herència i enllaç dinàmic. El llenguatge de programació Simula orientat a objectes va ser utilitzat principalment per investigadors implicats en la modelació física, com ara models per estudiar i millorar el moviment de vaixells i el seu contingut a través dels ports de càrrega.
A la dècada de 1970, la primera versió del llenguatge de programació Smalltalk va ser desenvolupada a Xerox PARC per Alan Kay, Dan Ingalls i Adele Goldberg. Smalltalk-72 va incloure un entorn de programació i va ser tipada dinàmicament, i al principi va ser interpretat, no compilat. Smalltalk es va destacar per la seva aplicació de l'orientació a objectes a nivell de llenguatge i el seu entorn de desenvolupament gràfic. Smalltalk va passar per diverses versions i l'interès pel llenguatge va créixer. Tot i que Smalltalk es va veure influenciat per les idees introduïdes a Simula 67, va ser dissenyat per ser un sistema totalment dinàmic en el qual les classes es poguessin crear i modificar dinàmicament.
A la dècada de 1970, Smalltalk va influir en la comunitat Lisp per incorporar tècniques basades en objectes que es van introduir als desenvolupadors mitjançant la màquina Lisp. L'experimentació amb diverses extensions de Lisp (com ara LOOPS i Flavors que introdueixen herència múltiple i mixins) finalment van conduir al Common Lisp Object System, que integra programació funcional i programació orientada a objectes i permet l'extensió mitjançant un protocol de meta-objecte. A la dècada de 1980, hi va haver alguns intents de dissenyar arquitectures de processadors que incloïen suport de maquinari per a objectes a la memòria, però no van tenir èxit. Alguns exemples inclouen l'Intel iAPX 432 i els Linn Smart Rekursiv.
El 1981, Goldberg va editar el número d'agost de Byte Magazine, introduint Smalltalk i la programació orientada a objectes a un públic més ampli. El 1986, l'Association for Computing Machinery va organitzar la primera Conference on Object-Oriented Programming, Systems, Languages, and Applications (OOPSLA), a la qual van assistir inesperadament 1.000 persones. A mitjans de la dècada de 1980, Brad Cox va desenvolupar l'Objective-C, que havia utilitzat Smalltalk a ITT Inc., i Bjarne Stroustrup, que havia utilitzat Simula per la seva tesi doctoral, finalment va crear el C++ orientat a objectes. El 1985, Bertrand Meyer també va produir el primer disseny del llenguatge Eiffel. Centrat en la qualitat del programari, Eiffel és un llenguatge de programació purament orientat a objectes i una notació que admet tot el cicle de vida del programari. Meyer va descriure el mètode de desenvolupament de programari Eiffel, basat en un petit nombre d'idees clau de l'enginyeria del programari i la informàtica, al llibre Object-Oriented Software Construction. Essencial per a l'enfocament de qualitat d'Eiffel és el mecanisme de fiabilitat de Meyer, disseny per contracte, que és una part integral tant del mètode com del llenguatge.
A principis i mitjans de la dècada de 1990, la programació orientada a objectes es va desenvolupar com el paradigma de programació dominant quan els llenguatges de programació que suportaven les tècniques es van fer àmpliament disponibles. Aquests inclouen Visual FoxPro 3.0, C++, i Delphi. El seu domini es va reforçar encara més per la creixent popularitat de les interfícies gràfices d'usuari, que depenen molt de les tècniques de programació orientada a objectes. Es pot trobar un exemple d'una biblioteca GUI dinàmica estretament relacionada i d'un llenguatge OOP als marcs Cocoa a Mac OS X, escrit en Objective-C, un objecte- extensió de missatgeria dinàmica orientada a C basada en Smalltalk. Les eines de POO també van millorar la popularitat de la programació basada en esdeveniments (tot i que aquest concepte no es limita a la POO).
A l'ETH Zürich, Niklaus Wirth i els seus col·legues també havien estat investigant temes com l'abstracció de dades i la programació modular (tot i que això havia estat d'ús comú). des de la dècada de 1960 o abans, Wirth ha afegit la verificació de tipus a través dels límits del mòdul). Modula-2 (1978) va incloure tots dos, i el seu disseny posterior, Oberon, va incloure un enfocament distintiu a l'orientació d'objectes, classes, etc. L'herència no és òbvia en el disseny de Wirth, ja que la seva nomenclatura mira en la direcció oposada: s'anomena extensió de tipus i el punt de vista és des del pare fins a l'hereu.
S'han afegit funcions orientades a objectes a molts llenguatges existents anteriorment, com ara Ada, BASIC, Fortran, Pascal, i COBOL. L'addició d'aquestes característiques a idiomes que inicialment no hi estaven dissenyats sovint provocava problemes de compatibilitat i manteniment del codi.
Més recentment, han sorgit una sèrie de llenguatges que estan principalment orientats a objectes, però que també són compatibles amb la metodologia procedimental. Dos d'aquests llenguatges són Python i Ruby. Probablement els llenguatges recents orientats a objectes més importants comercialment són Java, desenvolupat per Sun Microsystems, així com C# i Visual Basic.NET (VB.NET), tots dos dissenyats per a la plataforma .NET de Microsoft. Cadascun d'aquests dos marcs mostra, a la seva manera, el benefici d'utilitzar POO mitjançant la creació d'una abstracció de la implementació. VB.NET i C# admeten l'herència entre llengües, permetent classes definides en un idioma a classes de subclasses definides en l'altre idioma.

## Conceptes

* Classe
    Una classe defineix les característiques abstractes d'una cosa (objecte), incloent-hi les seves característiques (atributs,camps o propietats) i els seus comportaments (allò que pot fer, mètodes, operacions o funcionalitats). Es podria dir que una classe és el model que descriu la natura d'alguna cosa. Per exemple, la classe gos podria consistir en els trets diferencials compartits per tots els gossos, com la raça i el color de la pell (característiques), i les capacitats de bordar i seure (comportaments). Les classes proveeixen modularitat i estructura en un programa informàtic orientat a objectes. Una classe pot ser entesa per una persona no-programadora, però familiaritzada amb el problema general, cosa que vol dir que les característiques d'una classe han de tenir sentit al seu context. També, que el codi d'una classe ha d'estar relativament contingut dins d'ella mateixa (generalment utilitzant l'encapsulació). Col·lectivament, les propietats i els mètodes definits en una classe són anomenats membres.
* Objecte
    És el conjunt de dades modulars d'elements d'informació, proveït de propietats o atributs (dades) i de comportament o funcionalitat (mètodes). És la instància d'una classe.
* Mètode
    És un algoritme associat a un objecte (o a una classe d'objectes) l'execució del qual es desencadena després de la recepció d'un missatge. Aquest pot produir un canvi en les propietats de l'objecte o l'execució d'una nova operació amb un nou missatge per a un altre objecte.
* Pas de missatge
    És la invocació directa d'un mètode a través del seu nom que provoca la seva execució. Aquesta comunicació pot tenir definits certs paràmetres associats a l'event que el genera.
* Herència
    L'herència és especifica de la POO, on una nova classe es crea a partir d'una existent. L'herència prové del fet que una subclasse conté els atributs i mètodes de la classe primària. D'aquesta manera ens permet crear una estructura jeràrquica de classes cada cop més especialitzada i així no haver de començar de nou al especialitzar-ne una de ja existent.
* Encapsulació
    La classe oculta els detalls de la implementació l'objecte que en fa ús
* Abstracció
    Centrar-se en uns detalls d'un problema, deixant de banda la resta. Al programar, permet definir objectes que representen actors abstractes que poden realitzar una tasca, informar del seu estat o modificar-lo, a la vegada que es comuniquen amb altres objectes del sistema.
* Polimorfisme
    És la provisió d'una interfície única per a entitats diferents. Per exemple, en Java totes les classes hereten de Object. Per tant, es pot crear una variable de tipus Object i assignar-li una instància de qualsevol classe.

## Llenguatges orientats a objectes

Simula (1967) és considerat el primer llenguatge que conté les característiques principals d'un llenguatge orientat a objectes. Va ser creat per a fer programes de simulació, on els objectes són la representació de la informació més important. Smalltalk (1972 a 1980) és possiblement l'exemple canònic, i amb el qual la major part de la teoria de la programació orientada a objectes s'ha desenvolupat.
Entre els llenguatges orientats a objectes destaquen els següents:
* ABAP
* ActionScript
* Ada
* C++
* C#
* Clarion
* Clipper
* D
* Eiffel
* Fortran 90/95
* Gambas
* Genie
* Harbour
* Java
* JavaScript
* Lexico
* Object Pascal
* Objective-C
* OCaml
* OpenEdge ABL
* Oz
* Perl
* PHP
* PowerBuilder
* Python
* R
* Ruby
* Scala
* Self
* Smalltalk
* Vala
* VB.NET
* Visual Basic 6.0
* Visual DataFlex
* Visual FoxPro
* Visual Objects
* XBase++
Molts d'aquests llenguatges de programació no són purament orientat a objectes, sinó que són híbrids i combinen la POO amb altres paradigmes de programació.
Igual que C++, altres llenguatges, com el OOCOBOL, OOLISP, OOPROLOG y Object REXX, han estat creats afegint extensions orientades a objectes a un llenguatge de programació clàssic.
Un nou pas en l'abstracció de paradigmes de programació, és la programació orientada a aspectes (POA). Tot i que encara és una metodologia en estat de maduració, cada cop atrau més als investigadors i fins i tot projectes comercials de tot el món.

## Referències

* ↑ McCarthy, J.; Brayton, R.; Edwards, D.; Fox, P.; Hodes, L.; Luckham, D.; Maling, K.; Park, D.; Russell, S. «LISP I Programmers Manual». . Artificial Intelligence Group, M.I.T. Computation Center and Research Laboratory, 01-03-1969, pàg. 88f. «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".»
* ↑ McCarthy, John; Abrahams, Paul W.; Edwards, Daniel J. [et al.].. LISP 1.5 Programmer's Manual. MIT Press, 1962, p. 105. ISBN 978-0-262-13011-0. «Object — a synonym for atomic symbol»
* 1 2 3 «Dr. Alan Kay on the Meaning of "Object-Oriented Programming"», 2003. [Consulta: 11 febrer 2010].
* ↑ Butcher, Paul. Seven Concurrency Models in Seven Weeks: When Threads Unravel (en anglès). Pragmatic Bookshelf, 30 June 2014, p. 204. 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.
* ↑ Sutherland, I. E.. «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), 30-01-1963. Arxivat de l'original el 8 April 2013. [Consulta: 17 juliol 2019].
* ↑ The Development of the Simula Languages, Kristen Nygaard, Ole-Johan Dahl, p.254 Uni-kl.ac.at Arxivat 2006-08-28 a Wayback Machine.
* ↑ Ross, Doug. «The first software engineering language». LCS/AI Lab Timeline. MIT Computer Science and Artificial Intelligence Laboratory. [Consulta: 13 maig 2010].
* 1 2 Holmevik, Jan Rune «Compiling Simula: A historical study of technological genesis». IEEE Annals of the History of Computing, vol. 16, 4, 1994, pàg. 25–37. DOI: 10.1109/85.329756. Arxivat 30 August 2017$^{[Datemismatch]}$ a Wayback Machine.
* 1 2 Bertrand Meyer. Touch of Class: Learning to Program Well with Objects and Contracts. Springer Science & Business Media, 2009, p. 329. ISBN 978-3-540-92144-8.
* ↑ Kay, Alan. «The Early History of Smalltalk». Arxivat de l'original el 10 July 2008. [Consulta: 13 setembre 2007].
* ↑ 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
* ↑ Khurana, Rohit. Object Oriented Programming with C++, 1E. Vikas Publishing House Pvt Limited, 1 November 2009. ISBN 978-81-259-2532-3.

## Bibliografia

* Kindler, E.; Krivy, I. (2011). "Object-Oriented Simulation of systems with sophisticated control". International Journal of General Systems. pp. 313–343.
* Lewis, John; Loftus, William (2008). Java Software Solutions Foundations of Programming Design 6th ed. Pearson Education Inc. ISBN 0-321-53205-8., section 1.6 "Object-Oriented Programming"
* Booch, Grady (1986). Software Engineering with Ada. Addison Wesley. p. 220. ISBN 978-0805306088. "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."
* Jacobsen, Ivar; Magnus Christerson; Patrik Jonsson; Gunnar Overgaard (1992). Object Oriented Software Engineering. Addison-Wesley ACM Press. pp. 43–69. ISBN 0-201-54435-0.
* Brooks, Fred P. (April 1987). "No Silver Bullet — Essence and Accidents of Software Engineering". IEEE Computer 20 (4): 10–19.

## Vegeu també

* Sobreescriptura de mètodes
* Principi open/closed
Viccionari