# Objecte (programació)

En la ciència computacional, un objecte és un espai de memòria que té un valor i possiblement està referenciat per un identificador. Un objecte pot ser una variable, una funció o una estructura de dades. En el paradigma de la programació orientada a objectes, un "objecte" fa referència a una instància d'una classe que pot ser una combinació de variables, funcions i estructures de dades. En l'àmbit de les Bases de dades un objecte pot ser una taula, columna o una associació entre una dada i una entitat de la Base de dades (com la relació entre l'edat d'una persona amb aquesta). Així doncs també es pot definir objecte, en la programació orientada a objectes, com una "instància" d'una classe.

## Història

El concepte d'objecte es va introduir amb el llenguatge de programació Simula, creat a Oslo entre el 1962 i 1967 amb la finalitat de facilitar la programació de simuladors. En aquest llenguatge de programació les característiques i el comportament dels objectes a simular es descrivien en el codi font. El següent pas va ser el llenguatge de programació orientat a objectes Smalltalk, que va ser creat pel centre de recerca de Xerox el 1972, i que influiria els més importants llenguatges de programació orientada a objectes (com per exemple el C++ o Java). La programació orientada a objectes es va fer popular, fent extensiu el seu ús, el 1983 amb el llançament del llenguatge de programació C++, un llenguatge orientat a objectes, amb un ús similar al també popular llenguatge C. Les primeres bases de dades orientades a objectes es van comercialitzar el 1993, i fins a finals del segle XX no va arribar a ser madura. Un altre llenguatge que va col·laborar a l'ús dels objectes en la programació va ser el llenguatge Java, creat per Sun Microsystems el 1995 i destinat a la programació d'aplicacions web.
Avui en dia la programació orientada a objectes és ja coneguda i moltes aplicacions funcionen mitjançant objectes.

## Llenguatges basats en objectes

Una distinció important en els llenguatges de programació és la diferència entre llenguatge orientat a objectes i llenguatge basat en objectes. Un llenguatge es considera que està basat en objectes si disposa de les capacitats bàsiques d'aquests: identitat, propietats i atributs. El Polimorfisme fa referència a l'habilitat de sobrecarregar el nom d'una funció amb diferents comportaments depenent de l'objecte passat a la funció. El pas de missatges convencional discrimina només el primer objecte i considera que està "enviant un missatge" a aquest objecte. No obstant, alguns llenguatges de programació orientada a objectes com el Flavors o el Common Lisp Object System (CLOS) permeten discriminar més d'un paràmetre de la funció. L'herència és l'habilitat de crear una subclasse a partir d'una classe ja existent, heretant tota la informació de la classe pare, però que canvia un o més mètodes.

## Programació orientada a objectes

La programació orientada a objectes és un enfocament al disseny modular (dividir el programa en mòduls) re-utilitzable. La programació orientada a objectes és l'evolució de la pràctica del bon disseny que es remunta als inicis de la programació. La programació orientada a objectes és simplement l'extensió lògica de les tècniques més antigues tals com la programació estructurada i els tipus de dades abstractes. Un objecte és un tipus abstracte de dades juntament amb el polimorfisme i l'herència.
El contrari dels programes estructurats com a codi i dades, els sistemes orientats a objectes integren els dos conceptes que usen "objectes". Un objecte té un estat (dada) i un comportament (codi). Els objectes corresponen a les coses del món real. Per tant, per exemple, un programa gràfic tindrà objectes tals com un cercle, un quadrat, un menú. Un sistema d'una botiga en xarxa tindria objectes com carro de compra, comprador, producte. El sistema de compra suportaria accions tals com fer una comanda, realitzar un pagament i oferir un descompte. Els objectes estan dissenyats en herència. Per tant, per exemple en el sistema de compra hi pot haver unes classes d'alt nivell tals com productes electrònics, productes de cuina o llibres. Hi pot haver més nivells de refinament com per exemple de productes electrònics: Reproductors CD i DVD, etc. Aquestes classes i subclasses corresponen a altres conjunts i subconjunts en la matemàtica lògica.

## Objectes especialitzats

Un concepte important dels objectes són els patrons de disseny. Un patró proporciona una plantilla re-utilitzable per a fer front problemes semblants. Els següents descripcions són exemples d'alguns dels patrons de disseny més usats per objectes.
* Objecte funció: un objecte amb només un objecte.
* Objecte Immutable: un objecte creat amb un estat fixat en el moment de la creació el qual no es canvia després.
* Objecte de primera classe: un objecte que pot ser usat sense restriccions
* Contenidor: un objecte que conté altres objectes.
* Objecte Fàbrica: un objecte destinat a crear altres objectes.
* Meta Objecte: un objecte a partir del qual es poden crear altres objectes (Comparable amb una classe que no és necessàriament un objecte)
* Prototip: un meta objecte especialitzat del qual altres objectes poden ser creats mitjançant la copia.
* Objecte Déu: un objecte que sap massa o fa massa. Un objecte déu és un exemple de no patró.
* Singleton: un objecte que és només una instància de la seva classe durant l'execució del programa.

## Propietats dels objectes

Hi ha tres propietats que caracteritzen els objectes:
* Identitat: és la propietat que distingeix un objecte de qualsevol altre, és el seu identificador.
* Estat: descriu la informació que està emmagatzemada en un objecte.
* Comportament: descriu els mètodes mitjançant els quals els altres objectes s'hi poden comunicar, i aquest pot respondre realitzant les seves pròpies accions.

## Objecte distribuït

Els objectes orientats no només són un model de programació. Poden ser usats igualment com una definició d'una interfície d'un llenguatge distribuït. Els objectes en un model computacional distribuït tendeixen a durar més i estan més orientats als serveis que la programació d'objectes.
Un mètode estàndard per a empaquetar objectes distribuïts és amb la interfície de definició del llenguatge (IDL). Un IDL protegeix el client de tots els detalls d'un objecte de servidor distribuït. Els detalls tals com a quin computador està emmagatzemat l'objecte, quin llenguatge de programació i sistema operatiu utilitza, etc. Les IDL també són una part de l'entorn distribuït que proveeix de serveix tals com les transaccions o persistència als objectes d'una forma unificada. Dos dels més populars estàndards per a objectes distribuïts són els Object Management Group CORBA estàndard i Microsoft's DCOM.
Juntament amb els objectes distribuïts, un nombre d'altres extensions del concepte bàsic d'objecte s'han proposat per a permetre la computació distribuïda:
* Objectes protocol són components de la pila de protocols que engloba la xarxa de comunicació entre la interfície d'objectes orientats.
* Objectes replicats són grups d'objectes (anomenats repliques) que s'executen a un protocol multi partidista distribuït per a aconseguir una alta consistència entre els estats interns i la resposta d'una forma coordinada. Els exemples inclouen objectes CORBA amb tolerància 0 a fallades.
* Objectes distribuïts vius (o simplement objectes vius) generalitzen el concepte dels objectes replicats en grups de rèpliques que internament usar qualsevol protocol distribuït. pot ser resultant en una feble consistència entre els estats locals.
Algunes d'aquestes extensions, tals com els objectes distribuïts i objectes protocol, són de domini específic per termes especials del tipus objectes "normals" usats en un cert context (tal com invocació remota o pila de protocols). Altres, com per exemple objectes replicats i objectes distribuïts vius, són menys estandarditzats, perquè no usen el cas que l'objecte resideix en una sola localització al mateix temps, i aplicant el concepte de grups d'entitats (repliques), que poden estendre en múltiples localitzacions i els seus membres poden canviar dinàmicament.

## Objectes i Web semàntic

El Web semàntic és essencialment un marc o entorn de treball (framework) d'objectes distribuïts. El Web Ontology Language (OWL) i el Marc de Descripció de Recursos (Resource Description Framework, RDF) són dues tecnologies clau en el camp del Web semàntic. L'RDF permet definir objectes bàsics (noms, propietats, atributs, relacions) que són accessibles a través de la xarxa. L'OWL introdueix objectes més avançats que permeten herència múltiple entre altres coses.
Existeixen diferències importants entre els objectes OWL i els objectes tradicionals dels llenguatges orientats a objectes, ja que els objectes tradicionals es compilen en jerarquia estàtica i normalment amb herència simple. En canvi els objectes OWL són dinàmics i poden canviar la seva estructura en temps d'execució i esdevenir instàncies de classes diferents.
La següent taula contrasta les diferències entre els objectes tradicionals dels llenguatges orientats a objectes amb els objectes de l'OWL:
| Objectes tradicionals | Objectes del Web semàntic |
| Les classes són considerades com a tipus per les instàncies. | Les classes són considerades com a conjunts d'individus. |
| Les instàncies no poden canviar el seu tipus en temps d'execució. | El seu tipus pot canviar en temps d'execució. |
| La llista de classes és coneguda completament en temps de compilació i no pot canviar posteriorment. | Les classes poden ser creades i modificades en temps d'execució. |
| Els compiladors es fan servir en temps de compilació i els errors indiquen problemes. | Els "Raonadors" poden ser usats per a classificar i assegurar la seva consistència tant en temps d'execució com en temps de compilació. |
| Les classes codifiquen majoritàriament en funcions i mètodes imperatius. | Les classes es defineixen amb declaracions OWL i no es permet adjuntar cap codi imperatiu. |
| Les instàncies són anònimes sempre que aquestes no puguin ser accedides des de l'exterior mentre s'executen. | Tots els recursos tenen un URI únic des del qual poden ser referenciats. |
| Món Tancat: Si no hi ha informació suficient per a demostrar que és cert, s'assumeix que és fals. | Món Obert: Si no hi ha informació suficient per a demostrar que és cert, pot ser cert o fals. |

## Referències

* ↑ «[luis.izqui.org/resources/ProgOrientadaObjetos.pdf PDF]».
* ↑ Gabriel, Richard; Linda G. DeMichie «The Common Lisp Object System: An Overview». Lucid Inc. Technical Report. Arxivat de l'original el 2003-04-06 [Consulta: 22 octubre 2014]. Arxivat 2003-04-06 a Wayback Machine.
* ↑ Wegner, Peter «Dimensions of Object-Based Language Design». OOPSLA'87 Conference Proceedings, 22, 12, 12-1987, pàg. 168–182.
* ↑ Barbey, S; M. Kempe, and A. Strohmeier. «Object-Oriented Programming with Ada 9X». Draft Technical Report. Swiss Federal Institute of Technology in Lausanne Software Engineering Laboratory, 1993 [Consulta: 15 desembre 2013]. «Ada 83 itself is generally not considered to be object-oriented; rather, according to the terminology of Wegner [Weg 87], it is said to be object-based, since it provides only a restricted form of inheritance and it lacks polymorphism.»
* ↑ Stroustrup, Bjarne. The C++ Programming Language SPECIAL EDITION (en anglès). 9a ed.. Addison Wesley, gener 2004. ISBN 0-201-70073-5.
* ↑ Berners-Lee, Tim; James Hendler and Ora Lassila «The Semantic Web A new form of Web content that is meaningful to computers will unleash a revolution of new possibilities». Scientific American, 17-05-2001. Arxivat de l'original el 24 d’abril 2013 [Consulta: 22 d’octubre 2014]. Arxivat 24 April 2013$^{[Datemismatch]}$ a Wayback Machine.
* ↑ ; Oberle, Daniel; Tetlow, Phil; Wallace, Evan«A Semantic Web Primer for Object-Oriented Software Developers». W3C, 09-03-2006. [Consulta: 30 juliol 2008].
* ↑ Taula extreta de: http://www.w3.org/2001/sw/BestPractices/SE/ODSD/

## Vegeu també

* Patró de disseny
* Model d'Actors
Viccionari