Programación empobinada a oxetos

La **programación empobinada a oxetos** (**PO**, o **OOP** según les sos sigles n'inglés) ye un paradigma de programación que vien anovar la forma de llograr resultancies. Los oxetos manipolien los datos d'entrada pal llogru de datos de salida específicos, onde cada oxetu ufierta una funcionalidad especial.

Munchos de los oxetos pre-diseñaos de los llinguaxes de programación actuales dexen l'agrupación en biblioteques o llibreríes, sicasí, munchos d'estos llinguaxes dexen al usuariu la creación de les sos propies biblioteques.

Ta basada en delles téuniques, incluyendo heriedu, cohesión, astracción, polimorfismu, acoplamientu y encapsulamiento.

El so usu popularizar a principios de la década de 1990. Na actualidá, esiste una gran variedá de llinguaxes de programación que soporten la orientación a oxetos.

## Introducción
Los oxetos son entidaes que tienen un determináu "estáu", "comportamientu (métodu)" y "identidá":

* La **identidá** ye una propiedá d'un oxetu que lu estrema del restu; dichu con otres pallabres, ye'l so identificador (conceutu análogu al d'identificador d'una variable o una constante).

Un oxetu contién tola información que dexa definilo ya identificalo frente a otros oxetos pertenecientes a otres clases ya inclusive frente a oxetos d'una mesma clase, al poder tener valores bien estremaos nos sos atributos. De la mesma, los oxetos disponen de mecanismos d'interacción llamaos métodos, que favorecen la comunicación ente ellos. Esta comunicación favorez de la mesma el cambéu d'estáu nos mesmos oxetos. Esta carauterística lleva a tratalos como unidaes indivisibles, nes que nun se dixebra l'estáu y el comportamientu.

Los **métodos** (comportamientu) y **atributos** (estáu) tán estrechamente rellacionaos pola propiedá de conxuntu. Esta propiedá destaca qu'una clase rique de métodos pa poder tratar los atributos colos que cunta. El programador tien de pensar indistintamente en dambos conceutos, ensin dixebrar nin da-y mayor importancia a dalgún d'ellos. Faelo podría producir el vezu erróneu de crear clases contenedoras d'información per un sitiu y clases con métodos que remanen a les primeres pol otru. D'esta manera taría realizándose una "programación estructurada camuflada" nun llinguaxe de PO.

La programación empobinada a oxetos difier de la programación estructurada tradicional, na que los datos y los procedimientos tán separaos y ensin rellación, una y bones lo único que se busca ye'l procesamientu d'unos datos d'entrada pa llograr otros de salida. La programación estructurada anima al programador a pensar sobremanera en términos de procedimientos o funciones, y en segundu llugar nes estructures de datos qu'esos procedimientos remanen. Na programación estructurada solo escríbense funciones que procesen datos. El programadores qu'empleguen PO, sicasí, primero definen oxetos pa depués unvia-yos mensaxes solicitándo-yos que realicen los sos métodos por sigo mesmos.

## Orixe
Los conceutos de la PO tienen orixe n'Asemeya 67, un llinguaxe diseñáu pa faer simulaciones, creáu por Ole-Johan Dahl y Kristen Nygaard, del Centru de Cómputu Noruegu n'Oslu. Nesti centru trabayar en simulaciones de naves, que fueron confundíes pola esplosión combinatoria de cómo les diverses cualidaes de distintes naves podíen afectar unes a les otres. La idea surdió al arrexuntar los diversos tipos de naves en diverses clases d'oxetos, siendo responsable cada clase d'oxetos de definir los sos "mesmos" datos y comportamientos. Fueron refinaos más tarde en Smalltalk, desenvueltu n'Asemeya en Xerox PARC (que la so primer versión foi escrita sobre Basic) pero diseñáu pa ser un sistema dafechu dinámicu nel cual los oxetos podríen crease y modificar "sobre la marcha" (en tiempu d'execución) en llugar de tener un sistema basáu en programes estáticos.

La PO foise convirtiendo nel estilu de programación dominante a mediaos de los años 1980, en gran parte por cuenta de la influencia de C++, una estensión del llinguaxe de programación C. La so dominación foi consolidada gracies a la puxanza de les interfaces gráfiques d'usuariu, pa les cualos la PO ta particularmente bien afecha. Nesti casu, fálase tamién de **[[programación empobinada por eventos]]**.

Les carauterístiques d'orientación a oxetos fueron amestaes a munchos llinguaxes esistentes mientres esi tiempu, incluyendo Ada, BASIC, Lisp más Pascal, ente otros. La adición d'estes carauterístiques a los llinguaxes que nun fueron diseñaos primeramente pa elles condució de cutiu a problemes de compatibilidá y na capacidá de caltenimientu del códigu. Los llinguaxes empobinaos a oxetos "puros", pela so parte, escarecíen de les carauterístiques de les cualos munchos programadores vinieren depender. Pa saltar esta torga, fixéronse munches tentatives pa crear nuevos llinguaxes basaos en métodos empobinaos a oxetos, pero dexando delles carauterístiques imperatives de maneres "segures". El llinguaxe de programación Eiffel de Bertrand Meyer foi un tempranu y moderadamente acertáu llinguaxe con esos oxetivos, pero agora foi esencialmente reemplazáu por Java, en gran parte por cuenta de la apaición d'Internet y a la implementación de la máquina virtual Java na mayoría de navegador web. PHP na so versión 5 modificóse; soporta una orientación completa a oxetos, cumpliendo toles carauterístiques propies de la orientación a oxetos.

## Conceutos fundamentales
La PO ye una forma de programar que trata d'atopar una solución a estos problemes. Introduz nuevos conceutos, que superen y amplíen conceutos antiguos yá conocíos. Ente ellos destaquen los siguientes:

; Clase
: Definiciones de les propiedaes y comportamientu d'un tipu d'oxetu concretu. La instanciación ye la llectura d'estes definiciones y la creación d'un oxetu a partir d'ella.

; Heriedu
: Por casu, heriedu de la clase C a la clase D, ye la facilidá por aciu la cual la clase D herieda nella cada unu de los atributos y operaciones de C, como si esos atributos y operaciones fueren definíos pola mesma D. Poro, puede usar los mesmos métodos y variables rexistraos como "públicos" (*public*) en C. Los componentes rexistraos como "privaos" (*private*) tamién s'herieden pero caltiénense escondíos al programador y namái pueden ser aportaos al traviés d'otros métodos públicos. Pa poder aportar a un atributu o operación d'una clase en cualesquier de les sos subclases pero caltenela oculta pa otres clases ye necesariu rexistrar los componentes como "protexíos" (*protected*), d'esta manera van ser visibles en C y en D pero non n'otres clases.
; Oxetu
: Instancia d'una clase. Entidá provista d'un conxuntu de propiedaes o atributos (datos) y de comportamientu o funcionalidad (métodos), los mesmos que consecuentemente reaccionen a eventos. Corresponder colos oxetos reales del mundu que nos arrodia, o con oxetos internos del sistema (del programa).
; Métodu
: Algoritmu acomuñáu a un oxetu (o a una clase d'oxetos), que la so execución desencadenar tres la receición d'un "mensaxe". Dende'l puntu de vista del comportamientu, ye lo que l'oxetu puede faer. Un métodu puede producir un cambéu nes propiedaes del oxetu, o la xeneración d'un "eventu" con un nuevu mensaxe pa otru oxetu del sistema.
; Eventu :
Ye un sucesu nel sistema (tal como una interacción del usuariu cola máquina, o un mensaxe unviáu por un oxetu). El sistema remana l'eventu unviando'l mensaxe fayadizu al oxetu pertinente. Tamién puede definise como eventu la reacción que puede desencadenar un oxetu; esto ye, l'acción que xenera.
; Atributos
: Carauterístiques que tien la clase.
; Mensaxe :
Una comunicación empobinada a un oxetu, que lu ordenar qu'execute unu de los sos métodos con ciertos parámetros acomuñaos al eventu que lu xeneró.
; Propiedá o atributu :
Contenedor d'un tipu de datos acomuñaos a un oxetu (o a una clase d'oxetos), que fai los datos visibles dende fora del oxetu y esto defínese como les sos carauterístiques predeterminadas, y que'l so valor puede ser alteriáu pola execución de dalgún métodu.
; Estáu internu :
Ye una variable que se declara privada, que puede ser namái aportada y alteriada por un métodu del oxetu, y que s'utiliza pa indicar distintes situaciones posibles pal oxetu (o clase d'oxetos). Nun ye visible al programador que remana una instancia de la clase.
; Componentes d'un oxetu :
Atributos, identidá, rellaciones y métodos.
; Identificación d'un oxetu :
Un oxetu representar por mediu d'una tabla o entidá que tea compuesta polos sos atributos y funciones correspondientes.

En comparanza con un llinguaxe imperativu, una "variable" nun ye más qu'un contenedor internu del atributu del oxetu o d'un estáu internu, según la "función" ye un procedimientu internu del métodu del oxetu.

## Carauterístiques de la PO
Esiste un alcuerdu alrodiu de qué carauterístiques contempla la "orientación a oxetos". Les carauterístiques siguientes son les más importantes:
; Astracción
: Denota les carauterístiques esenciales d'un oxetu, onde se prinden los sos comportamientos. Cada oxetu nel sistema sirve como modelu d'un "axente" astractu que puede realizar trabayu, informar y camudar el so estáu, y "comunicase" con otros oxetos nel sistema ensin revelar "cómo" impleméntense estes carauterístiques. Los procesos, les funciones o los métodos pueden tamién ser abstraídos, y, cuando lo tán, una variedá de téuniques son riquíes p'ampliar una astracción. El procesu d'astracción dexa escoyer les carauterístiques relevantes dientro d'un conxuntu ya identificar comportamientos comunes pa definir nuevos tipos d'entidaes nel mundu real. L'astracción ye clave nel procesu d'analís y diseñu empobináu a oxetos, yá que por aciu ella podemos llegar a armar un conxuntu de clases que dexen modelar la realidá o'l problema que quier atacase.
; Encapsulamiento
: Significa axuntar tolos elementos que pueden considerase pertenecientes a una mesma entidá, al mesmu nivel d'astracción. Esto dexa aumentar la cohesión (diseñu estructurado) de los componentes del sistema. Dellos autores confunden esti conceutu col principiu de tapecimientu, principalmente porque se suelen emplegar conxuntamente.
; Polimorfismu
: Comportamientos distintos, acomuñaos a oxetos distintos, pueden compartir el mesmu nome; al llamalos por esi nome va utilizase'l comportamientu correspondiente al oxetu que se tea usando. O, dichu otra manera, les referencies y les coleiciones d'oxetos pueden contener oxetos de distintos tipos, y la invocación d'un comportamientu nuna referencia va producir el comportamientu correutu pal tipu real del oxetu referenciáu. Cuando esto asocede en "tiempu d'execución", esta postrera carauterística llámase **asignación tardía** o **asignación dinámica**. Dellos llinguaxes apurren medios más estáticos (en "tiempu de compilación") de polimorfismu, tales como les plantíes y la sobrecarga d'operadores de C++.
; Heriedu
: Les clases nun s'atopen aisllaes, sinón que se rellacionen ente sigo, formando una xerarquía de clasificación. Los oxetos herieden les propiedaes y el comportamientu de toles clases a les que pertenecen. L'heriedu entama y facilita el polimorfismu y el encapsulamiento, dexando a los oxetos ser definíos y creaos como tipos especializaos d'oxetos presistentes. Estos pueden compartir (y estender) el so comportamientu ensin tener que volver implementalo. Esto suel faese davezu arrexuntando los oxetos en **clases** y estes en **árboles** o **enrexaos** que reflexen un comportamientu común. Cuando un oxetu herieda de más d'una clase dizse qu'hai **heriedu múltiple**; siendo d'alta complexidá téunica polo cual suel recurrise al heriedu virtual pa evitar la duplicación de datos.
; Modularidad
: Denominar "modularidad" a la propiedá que dexa subdividir una aplicación en partes más pequeñes (llamaes módulos), caúna de les cuales tien de ser tan independiente como sía posible de l'aplicación en sí y de les restantes partes. Estos módulos puédense compilar por separáu, pero tienen conexones con otros módulos. Al igual que la encapsulación, los llinguaxes soporten la modularidad de diverses formes.
; Principiu de tapecimientu
: Cada oxetu ta aislláu del esterior, ye un módulu natural, y cada tipu d'oxetu espón una "interfaz" a otros oxetos qu'especifica cómo pueden interactuar colos oxetos de la clase. L'aislamientu protexe a les propiedaes d'un oxetu contra'l so cambéu por quien nun tenga derechu a aportar a elles; solamente los mesmos métodos internos del oxetu pueden aportar al so estáu. Esto asegura qu'otros oxetos nun puedan camudar l'estáu internu d'un oxetu de manera inesperada, esaniciando efeutos secundarios ya interacciones inesperaes. Dellos llinguaxes relaxen esto, dexando un accesu direutu a los datos internos del oxetu d'una manera controlada y llindando el grau d'astracción. L'aplicación entera amenorgar a un agregáu o ruempecabeces d'oxetos.
; Recoyida de basura
: La recoyida de basura (*garbage collection*) ye la téunica pola cual la redolada d'oxetos encargar de destruyir automáticamente, y por tanto desvenceyar la memoria acomuñada, los oxetos que quedaren ensin nenguna referencia a ellos. Esto significa que'l programador nun tien d'esmolecer se pola asignación o lliberación de memoria, una y bones el redolada asignar al crear un nuevu oxetu y va lliberar cuando naide tar usando. Na mayoría de los llinguaxes híbridos que s'estendieron pa soportar el Paradigma de Programación Empobinada a Oxetos como C++ o Object Pascal, esta carauterística nun esiste y la memoria debe desasignarse espresamente.

## Resume
La PO ye un paradigma surdíu nos años 1970, qu'utiliza oxetos como elementos fundamentales na construcción de la solución. Un oxetu ye una astracción de dalgún fechu o ente del mundu real, con atributos que representen les sos carauterístiques o propiedaes, y métodos qu'emulen el so comportamientu o actividá. Toles propiedaes y métodos comunes a los oxetos se encapsulan o arrexunten en clases. Una clase ye una plantía, un prototipu pa crear oxetos; polo xeneral, dizse que cada oxetu ye una instancia o exemplar d'una clase.

## Tipos
Pa realizar programación empobinada a oxetos esisten dos corrientes principales:
* **Basase en clases**.- Ye la más llargamente usada polos llinguaxes de programación empobinada a oxetos PO. Por casu ye usada per Java, C++ y C#. Basar en crear una estructura molde llamada clase onde s'especifiquen los campos y métodos que van tener los nuesos oxetos. Cada vez que precisamos un oxetu creamos una instancia (o copia del oxetu) usando la clase como molde.
* **[[Programación basada en prototipos|Basase en prototipos]]**.- Ye soportáu en Javascript, Python y Ruby. Nun hai clases, solo hai oxetos. El mecanismu pa la reutilización ta dau pola **clonación d'oxetos**. Créanse direutamentos oxetos y cuando quier xenerase otru cola mesma estructura úsase clonación. Una vegada clonáu si queremos podemos amestar los campos y métodos necesarios. Un **oxetu prototípicu** ye un oxetu que s'utiliza como una plantía a partir de la cual llógrase'l conxuntu inicial de propiedaes d'un oxetu. Cualquier oxetu puede ser utilizáu como'l prototipu d'otru oxetu, dexando al segundu oxetu compartir les propiedaes del primeru.

## Dellos llinguaxes empobinaos a oxetos
**Asemeya** (1967) ye aceptáu como'l primer llinguaxe que tien les carauterístiques principales d'un llinguaxe empobináu a oxetos. Foi creáu pa faer programes de simulación, onde los "oxetos" son la representación de la información más importante.

**Smalltalk** (1972 a 1980) ye posiblemente l'exemplu canónicu, y col que gran parte de la teoría de la programación empobinada a oxetos desenvolvióse.

Ente los llinguaxes empobinaos a oxetos destáquense los siguientes:

Munchos d'estos llinguaxes de programación nun son puramente empobinaos a oxetos, sinón que son híbridos que combinen la PO con otros paradigmes.

Al igual que C++, otros llinguaxes, como OOCOBOL, OOLisp, OOProlog y Object REXX, fueron creaos añadiendo estensiones empobinaes a oxetos a un llinguaxe de programación clásicu.

Un nuevu pasu na astracción de paradigmes de programación ye la Programación Empobinada a Aspeutos (POA). Anque ye inda una metodoloxía n'estáu de maduración, cada vez atrai a más investigadores ya inclusive proyeutos comerciales en tol mundu.

## Ver tamién
* Base de datos empobinada a oxetos
* Inxeniería de software basada en componentes

## Notes y referencies

## Enllaces esternos