Sunteți pe pagina 1din 20

MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

PARADIGMA ORIENTADO A OBJETOS

 Disponible en: http://www.desy.de/gna/html/cc/Tutorial/Spanish/node6.htm

I) INTRODUCCION

Actualmente una de las áreas más candentes en la industria y en el ámbito académico es la


orientación a objetos. La orientación a objetos promete mejoras de amplio alcance en la forma
de diseño, desarrollo y mantenimiento del software ofreciendo una solución a largo plazo a los
problemas y preocupaciones que han existido desde el comienzo en el desarrollo de software: la
falta de portabilidad del código y reusabilidad, código que es difícil de modificar, ciclos de
desarrollo largos y técnicas de codificación no intuitivas.

Un lenguaje orientado a objetos ataca estos problemas. Tiene tres características


básicas:
a) debe estar basado en objetos
b) basado en clases y
c) capaz de tener herencia de clases.

Muchos lenguajes cumplen uno o dos de estos puntos; muchos menos cumplen los tres.
La barrera más difícil de sortear es usualmente la herencia.

El concepto de programación orientada a objetos (OOP) no es nuevo, lenguajes clásicos


como SmallTalk se basan en ella. Dado que la OOP se basa en la idea natural de la existencia de
un mundo lleno de objetos y que la resolución del problema se realiza en términos de objetos,
un lenguaje se dice que está basado en objetos si soporta objetos como una característica
fundamental del mismo.

El elemento fundamental de la OOP es, como su nombre lo indica, el objeto. Podemos


definir “un objeto como un conjunto complejo de datos y programas que poseen estructura y
forman parte de una organización”.

Esta definición especifica varias propiedades importantes de los objetos. En primer


lugar, un objeto no es un dato simple, sino que contiene en su interior cierto número de
componentes bien estructurados. En segundo lugar, cada objeto no es un ente aislado, sino que
forma parte de una organización jerárquica o de otro tipo.

-1- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

II) ESTRUCTURA DE UN OBJETO

Un objeto puede considerarse como una especie de cápsula dividida en tres partes:

OBJETO
1 - RELACIONES Propiedades
2 - PROPIEDADES
3 - METODOS
Métodos

Cada uno de estos componentes desempeña un papel totalmente independiente:

II.1) RELACIONES: Las relaciones permiten que el objeto se inserte en la organización y


están formadas esencialmente por punteros a otros objetos.

Las relaciones entre objetos son, precisamente, los enlaces que permiten a un objeto
relacionarse con aquellos que forman parte de la misma organización.

Las hay de dos tipos fundamentales:

-Relaciones jerárquicas. Son esenciales para la existencia misma de la aplicación porque la


construyen. Son bidireccionales, es decir, un objeto es padre de otro cuando el primer objeto se
encuentra situado inmediatamente encima del segundo en la organización en la que ambos
forman parte; asimismo, si un objeto es padre de otro, el segundo es hijo del primero (en la fig.
2, B es padre de D,E y F, es decir, D,E y F son hijos de B; en la fig. 3, los objetos B y C son
padres de F, que a su vez es hijo de ambos).

A B C

D E F
FIG. 2 –ORG. JERARQUICA SIMPLE (Un hijo tiene sólo un padre)

A B C

D E F
FIG. 3 –ORG. JERARQUICA COMPLEJA (un hijo puede tener varios padres)

-2- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

Una organización jerárquica simple puede definirse como aquella en la que un objeto
puede tener un solo padre, mientras que en una organización jerárquica compleja un hijo puede
tener varios padres (F tiene a B y C como padres).

-Relaciones semánticas. Se refieren a las relaciones que no tienen nada que ver con la
organización de la que forman parte los objetos que las establecen. Sus propiedades y
consecuencia solo dependen de los objetos en sí mismos (de su significado) y no de su posición
en la organización.

Se puede ver mejor con un ejemplo: supongamos que vamos a construir un diccionario
informatizado que permita al usuario obtener la definición de una palabra cualquiera.
Supongamos que, en dicho diccionario, las palabras son objetos y que la organización jerárquica
es la que proviene de forma natural de la estructura de nuestros conocimientos sobre el mundo.

La raíz del diccionario podría llamarse TEMAS. De éste término genérico descenderán
tres grandes ramas de objetos llamadas VIDA, MUNDO y HOMBRE. El primero (vida)
comprenderá las ciencias biológicas: Biología y Medicina. El segundo (mundo), las ciencias de
la naturaleza inerte: las Matemáticas, la Física, la Química y la Geología. El tercero (hombre)
comprenderá las ciencias humanas: la Geografía, la Historia, etc.

Estableceremos la relación trabajó entre los objetos NEWTON y OPTICA y la


interpretaremos diciendo que significa que Newton trabajó en óptica (véase la fig. 4). La
relación es, evidentemente, semántica, pues no establece ninguna connotación jerárquica entre
NEWTON y OPTICA y su interpretación depende exclusivamente del significado de ambos
objetos.

TEMAS

VIDA MUNDO HOMBRE


O

BIO MED MAT FIS QUIM GEOG HIST

Optica
No hay relación jerárquica
entre óptica y Newton Newton

FIG. 4 –TEMAS

La existencia de esta relación nos permitirá responder a preguntas como:

¿Quién trabajó en óptica?- ¿En qué trabajó Newton?- ¿Quien trabajó en Física?

Las dos primeras se deducen inmediatamente de la existencia de la relación trabajó.


Para la tercera observamos que si Newton trabajó en óptica automáticamente sabemos
que trabajó en Física, por ser óptica una rama de la Física (en nuestro diccionario, el objeto
OPTICA es hijo del objeto FISICA). Entonces gracias a la OOP podemos responder a la tercera
pregunta sin necesidad de establecer una relación entre NEWTON y FISICA, apoyándonos sólo
en la relación definida entre NEWTON y OPTICA y en que OPTICA es hijo de FISICA. De

-3- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

este modo se elimina toda redundancia innecesaria y la cantidad de información que tendremos
que definir para todo el diccionario será mínima.

II.1.2 – Clasificación de las relaciones

II.1.2.a - Relación De-La-Especie


Considérese que se ha escrito un programa para dibujar. Este programa debería permitir
el dibujo de variados objetos tales como puntos, rectángulos, triángulos y muchos más. Por cada
objeto, se provee una definición de clase.
Por ejemplo, la clase Point define un punto por sus coordenadas:

class Point {
attributes:
int x, y
methods:
setX(int newX)
getX()
setY(int newY)
getY()
}

Se continúa definiendo clases de programa de dibujo con una clase para describir círculos.

Un círculo define un punto central y un radio:


class Circle {
attributes:
int x, y,
radius
methods:
setX(int newX)
getX()
setY(int newY)
getY()
setRadius(newRadius)
getRadius()
}

Comparando ambas definiciones de clase, podemos observar lo siguiente:

 Ambas clases tienen dos elementos de datos x e y. En la clase Point estos elementos
describen la posición del punto, en el caso de la clase Circle describen el centro del
círculo. Así, x e y tienen el mismo significado en ambas clases: Describen la posición de
su objeto asociado por medio de la definición de un punto.

-4- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

 Ambas clases ofrecen el mismo conjunto de métodos para obtener y definir el valor de
los dos elementos de datos x e y.

 La clase Circle "añade'' un nuevo elemento de datos radius y sus correspondientes


métodos de acceso.

Conociendo las propiedades de la clase Point: podemos describir un círculo como un


punto más un radio más métodos para accederlo.

Así, un círculo es "de-la-especie" Point. Sin embargo, un círculo es algo más


"especializado". Ilustramos esto gráficamente en la Figura 5.1.

Figura 5.1: Ilustración de la relación "de-la-especie".

En ésta y en las siguientes figuras, las clases se dibujan usando rectángulos. Su nombre
siempre empieza con una letra mayúscula. Las flechas indican la dirección de la relación, de ahí
que se deba leer como "Circle es de-la-especie Point".

II.1.2.b - Relación Es-Un(a)


La relación anterior se usa al nivel de clase para describir las relaciones entre dos clases
similares. Si creamos objetos de tales clases, nos referimos a su relación como una relación "es-
un(a)".

Desde el momento que la clase Circle es de la especie de la clase Point, una instancia de
Circle, digamos acircle, es un point. Consecuentemente, cada círculo se comporta como un
punto. Por ejemplo, se puede mover puntos en la dirección x al alterar el valor de x.

Similarmente, se mueven círculos en ésta dirección al alterar su valor de x.

La Figura 5.2 ilustra esta relación. En ésta y en las siguientes figuras, los objetos se dibujan
usando rectángulos con las esquinas redondeadas. Su nombre consiste solamente de letras
minúsculas.

Figura 5.2: Ilustración de la relación "es-un(a)".

II.1.2.c - Relación Parte-De


Algunas veces se necesita poder construir objetos haciendo una combinación de otros.
Esto se sabe por la programación procedimental, donde se tiene la estructura o registro para
juntar variados tipos de datos.

-5- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

Regresemos al programa de dibujo. Ya se han creado varias clases para las figuras
disponibles. Ahora se decide que se quiere tener una figura especial que representa un logotipo
propio que consiste en un círculo y un triángulo. (Asumamos que ya se tiene definida un clase
Triangle.) De este modo, el logo consiste en dos partes o, el círculo y el triángulo son parte-de
logotipo:

class Logo {
attributes:
Circle circle
Triangle triangle
methods:
set(Point where)
}

Ilustramos esto con la Figura 5.3.

Figura 5.3: Ilustración de la relación "parte-de".

II.1.2.d - Relación Tiene-Un(a)


Esta relación es justamente la inversa de la relación parte-de. Por lo tanto, podemos
fácilmente añadir esta relación a la ilustración parte-de añadiendo flechas en la otra dirección
(Figura 5.4).

Figura 5.4: Ilustración de la relación "tiene-un(a)".

-6- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

II.2) PROPIEDADES

Todo objeto puede tener cierto número de propiedades, cada una de las cuales tendrá, a
su vez, uno o varios valores. En OOP, las propiedades corresponden a las clásicas "variables" de
la programación estructurada. Son, por lo tanto, datos encapsulados dentro del objeto, junto con
los métodos (programas) y las relaciones (punteros a otros objetos).

Las propiedades de un objeto pueden tener un valor único o pueden contener un


conjunto de valores más o menos estructurados (matrices, vectores, listas, etc.). Además, los
valores pueden ser de cualquier tipo (numérico, alfabético, etc.) si el sistema de programación lo
permite.

Pero existe una diferencia con las "variables", y es que las propiedades se pueden
heredar de unos objetos a otros. En consecuencia, un objeto puede tener una propiedad de
maneras diferentes:

-Propiedades propias. Están formadas dentro de la cápsula del objeto.

-Propiedades heredadas. Están definidas en un objeto diferente, antepasado de éste


(padre,"abuelo", etc.). A veces estas propiedades se llaman propiedad miembro porque el objeto
las posee por el mero hecho de ser miembro de una clase.

Las propiedades distinguen un objeto determinado de los restantes que forman parte de
la misma organización y tiene valores que dependen de la propiedad de que se trate. Las
propiedades de un objeto pueden ser heredadas a sus descendientes en la organización.

II.3) METODOS

Los métodos son las operaciones que pueden realizarse sobre el objeto, que
normalmente estarán incorporados en forma de programas (código) que el objeto es capaz de
ejecutar y que también pone a disposición de sus descendientes a través de la herencia.

Los métodos son una operación que realiza acceso a los datos. Podemos definir método
como un programa procedimental o procedural escrito en cualquier lenguaje, que está asociado
a un objeto determinado y cuya ejecución sólo puede desencadenarse a través de un mensaje
recibido por éste o por sus descendientes.

Objeto 1 Mensaje (invocación de Objeto 2


Propiedades un método) Propiedades

Métodos Métodos

Son sinónimos de 'método' todos aquellos términos que se han aplicado


tradicionalmente a los programas, como procedimiento, función, rutina, etc. Sin embargo, es
conveniente utilizar el término 'método' para que se distingan claramente las propiedades
especiales que adquiere un programa en el entorno OOP, que afectan fundamentalmente a la
forma de invocarlo (únicamente a través de un mensaje) y a su campo de acción, limitado a un
objeto y a sus descendientes, aunque posiblemente no a todos.

-7- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

Si los métodos son programas, se deduce que podrían tener argumentos, o parámetros.
Puesto que los métodos pueden heredarse de unos objetos a otros, un objeto puede disponer de
un método de dos maneras diferentes:

-Métodos propios. Están incluidos dentro de la cápsula del objeto.

-Métodos heredados. Están definidos en un objeto diferente, antepasado de éste (padre,"abuelo",


etc.). A veces estos métodos se llaman métodos miembros porque el objeto los posee por el
mero hecho de ser miembro de una clase.

III - OBJETO (Resúmen)


Los objetos soportan una serie de características específicas de los mismos:

 Se agrupan en grupos denominados clases


 Contienen datos internos que definen su estado actual.
 Soportan ocultamiento de datos.
 Pueden heredar propiedades de otros objetos.
 Pueden comunicarse con otros objetos enviando o pasando mensajes.
 Tienen métodos que definen su comportamiento

Un objeto es una entidad lógica que contiene datos y un código especial que indica como
manipular los datos.

El uso de un objeto impone a veces castigos al momento de la ejecución que en ocasiones


pueden degradar seriamente el diseño de un programa.

Los objetos son construcciones de programación que se obtienen a partir de entidades llamadas
clases. El programador tiene la responsabilidad absoluta de crear clases propias, pero también
puede tener acceso a las clases desarrolladas por otros.

Ejemplo: diseño de un Objeto.


Class Nómina de Personal

class nomina {nomina empleado; Nombre Salario

Empleado 1
char nombre[30]; Objetos Empleado 2
float salario;
}; (nomina es una clase ) ..........
(empleado es un objeto)
Empleado n

Los objetos son ejemplos de clases.

-8- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

IV - CONCEPTO DE CLASE

Cada objeto es un ejemplar de una clase a la que pertenece. Todos los ejemplares de la
misma clase tienen el mismo comportamiento (es decir invocan al mismo método) como
respuesta a una solicitud similar.

Clase
A

Objeto 1 Objeto 2 Objeto n

Una clase es un tipo especial de datos, y está orientado a creación de objetos y que
consta de unos miembros que pueden ser todas o funciones privadas o públicas.

“Una clase es un tipo de dato que contiene uno o más elementos llamados datos
miembros, y cero, una o más funciones que manipulan esos datos llamados función
miembro. Una clase se puede definir con una estructura (struct), una unión (unión) o una
clase (class).”

La sintaxis de una clase es:


class nombre_clase
{
miembro_1; //lista de datos miembros
miembro_2
miembro_3
funcion_miembro_1( ); // funciones miembro conocidas
funcion_miembro_2 ( ); // funciones como métodos

-9- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

IV.1 - Identificadores de diseño de una clase

Para usar una clase, primero hay que declararla, como se hace en el caso de las estructuras. La
declaración de una clase puede aparecer sólo una vez en un programa, tal y como las
estructuras. Esta es una declaración de una clase simple:

class counter {

long count;  Variable miembro de la clase


public:
void SetCount(long);
long GetValue( );
};

-La palabra clave class introduce una declaración de clase.

-Después aparece el nombre de la clase.

-Las clases contienen no sólo declaraciones de variables, sino también definiciones de funciones
completas.

-Las funciones contenidas en clases pueden ser tan largas y complejas como uno desee que lo
sean.

-Se considera que las variables declaradas dentro de una clase pertenecen a esa clase. En ciertas
circunstancias, las variables pueden compartirse entre las diferentes instancias de una clase.

-Existe garantía de que los identificadores de variables y funciones contenidos en una clase no
chocan con los identificadores que se usan en otras.

Básicamente una clase es un mundo con identificadores propios únicos.

IV.2- Cuerpo de una Clase

La variable count se define dentro del cuerpo de la clase. Por lo tanto, count recibe el
nombre de variable miembro de la clase.

Cualquier variable definida en una clase tiene campo de acción. El campo de acción de la clase
no está disponible, es decir, que este punto de declaración es una variable final de la declaración
de la clase.

Es un error intentar el acceso a una variable miembro después de la declaración de la


clase, como se puede apreciar en el código siguiente:

class counter {

long count;
public:
count = 3; //error: count no se encuentra definida aquí.

IV.3- Uso de una Clase

-10- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

Para usar una clase se debe definir un objeto con ella. Las variables de una clase se
definen tan solo como variables de tipo estructura o variables escalares. Para definir la
variable de la clase people de tipo counter, se utiliza esta notación:

Counter people

“Las variables instanciadas a partir de clases son los objetos”.

En general, es imposible usar una clase directamente. Las contadas excepciones a


esta regla se ilustran más adelante. Para el objeto people, esta es la forma en que lo
podría utilizar un programa:

Void main ( )
{
counter people;
//inicializar el objeto people.

SetValue(0);
// verificar que se borre
long value = people.GetValue( );
}

“Una clase es un tipo especial de datos, y esta orientada a la creación de objetos y


que consta de unos miembros que pueden ser datos o funciones privadas o publicas”.

IV.4- Componentes de una Clase

Para poder definir una clase se debe tomar en cuenta que consta de dos partes: una
declaración y una implementación.

-11- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

. La declaración lista los miembros de la clase.

. La implementación o cuerpo define las funciones de la clase.

class nomina {nomina empleado;

char nombre[30];
Declaración de una clase
float salario;
}; (nomina es una clase )
(empleado es un objeto)
……………………………………………………..

class contador{
long cuenta;
Funciones miembro de
public: la clase
void leervalor(long);
long obtenervalor( );
};

…………………………………………………..

Implementación de una clase

void contador::leerValor(long valor)


{
cuenta = valor,
}
long contador::obtenerValor( )
{
return cuenta;}
}

V- ENCAPSULAMIENTO Y OCULTACIÓN

Como hemos visto, cada objeto es una estructura compleja en cuyo interior hay datos y
programas, todos ellos relacionados entre sí, como si estuvieran encerrados conjuntamente en
una cápsula. Esta propiedad (encapsulamiento), es una de las características fundamentales en
la OOP.

-12- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

Los objetos son inaccesibles, e impiden que otros objetos, los usuarios, o incluso los
programadores conozcan cómo está distribuida la información o qué información hay
disponible. Esta propiedad de los objetos se denomina ocultación de la información. Esto no
quiere decir, sin embargo, que sea imposible conocer lo necesario respecto a un objeto y a lo
que contiene. Si así fuera no se podría hacer gran cosa con él.

Lo que sucede es que las peticiones de información a un objeto, deben realizarse a


través de mensajes dirigidos a él, con la orden de realizar la operación pertinente. La respuesta
a estas órdenes será la información requerida, siempre que el objeto considere que quien envía
el mensaje está autorizado para obtenerla.

El hecho de que cada objeto sea una cápsula facilita enormemente que un objeto
determinado pueda ser transportado a otro punto de la organización, o incluso a otra
organización totalmente diferente que precise de él.

Si el objeto ha sido bien construido, sus métodos seguirán funcionando en el nuevo


entorno sin problemas. Esta cualidad hace que la OOP sea muy apta para la reutilización de
programas.

VI- ORGANIZACIÓN JERARQUICA DE LOS OBJETOS

En principio, los objetos forman siempre una organización jerárquica, en el sentido de


que ciertos objetos son superiores a otros de cierto modo.

Existen varios tipos de jerarquías: serán simples cuando su estructura pueda ser
representada por medio de un "árbol". En otros casos puede ser más compleja.

En cualquier caso, sea la estructura simple o compleja, podrán distinguirse en ella tres niveles
de objetos.

-La raíz de la jerarquía. Se trata de un objeto único y especial. Este se caracteriza por estar en el
nivel más alto de la estructura y suele recibir un nombre muy genérico, que indica su categoría
especial, como por ejemplo objeto madre, Raíz o Entidad.

-Los objetos intermedios. Son aquellos que descienden directamente de la raíz y que a su vez
tienen descendientes. Representan conjuntos o clases de objetos, que pueden ser muy generales
o muy especializados, según la aplicación. Normalmente reciben nombres genéricos que
denotan al conjunto de objetos que representan, por ejemplo, VENTANA, CUENTA,
FICHERO. En un conjunto reciben el nombre de clases o tipos si descienden de otra clase o
subclase.

-Los objetos terminales. Son todos aquellos que descienden de una clase o subclase y no tienen
descendientes. Suelen llamarse casos particulares, instancias o ítems porque representan los
elementos del conjunto representado por la clase o subclase a la que pertenecen.

VII- POLIMORFÍSMO

Una de las características fundamentales de la OOP es el polimorfísmo, que no


es otra cosa que la posibilidad de construir varios métodos con el mismo nombre, pero

-13- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

con relación a la clase a la que pertenece cada uno, con comportamientos diferentes.
Esto conlleva la habilidad de enviar un mismo mensaje a objetos de clases diferentes.
Estos objetos recibirían el mismo mensaje global pero responderían a él de formas
diferentes; por ejemplo, un mensaje "+" a un objeto ENTERO significaría suma,
mientras que para un objeto STRING significaría concatenación ("pegar" strings uno
seguido al otro)

VII.1) Demonios

Es un tipo especial de métodos, relativamente poco frecuente en los sistemas de


OOP, que se activa automáticamente cuando sucede algo especial. Es decir, es un
programa, como los métodos ordinarios, pero se diferencia de estos porque su ejecución
no se activa con un mensaje, sino que se desencadena automáticamente cuando
ocurre un suceso determinado: la asignación de un valor a una propiedad de un
objeto, la lectura de un valor determinado, etc.

Los demonios, cuando existen, se diferencian de otros métodos por que no son
heredables y porque a veces están ligados a una de las propiedades de un objeto, mas
que al objeto entero.

VIII - HERENCIA

Con la herencia podemos hacer uso de las relaciones de-la-especie y es-un(a).


Como se describió anteriormente, las clases que son de-la-especie de otra clase
comparten propiedades de esta última. En nuestro ejemplo con el punto y el círculo,
podemos definir un círculo, el cuál hereda de punto:

class Circle inherits from Point {


atrributes:
int radius

methods:
setRadius(int newRadius)
getRadius()
}
La clase Circle hereda todos los elementos de datos y métodos de la clase Point.
No hay necesidad de definirlos dos veces: Solamente usamos los ya existentes (y
familiares) datos y definiciones de métodos.

Al nivel de objeto ahora podemos usar un círculo justamente como habríamos


usado un punto, debido a que un círculo es-un(a) punto. Por ejemplo, podemos definir
un objeto círculo (acircle) y establecer sus coordenadas del punto central:

Circle acircle
acircle.setX(1) /* Heredado de Point */

-14- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

acircle.setY(2)
acircle.setRadius(3) /* Añadido por Circle */

"Es-un(a)" también implica que podemos usar un círculo en cualquier circunstancia


donde se pueda usar un punto. Por ejemplo, se puede escribir una función o un método,
digamos move(), el(la) cuál debe mover un punto en la dirección x:

move(Point apoint, int deltax) {


apoint.setX(apoint.getX() + deltax)
}
Debido a que círculo hereda de punto, se puede usar esta función con un argumento
círculo para mover su punto central y, a partir de ahí, todo el círculo :

Circle acircle
...
move(acircle, 10) /* Mover el círculo al mover */
/* su punto central */
Tratemos de formalizar el término "herencia" :

Definición (Herencia) “Herencia es el mecanismo que permite que un clase A herede


propiedades de una clase B. Decimos "A hereda de B". Objetos de la clase A tienen así
acceso a los atributos y métodos de la clase B sin necesidad de redefinirlos. La
siguiente definición describe dos términos con los que podemos hacer referencia a las
clases involucradas cuando se usa la herencia.”

Definición (Superclase/Subclase) Si la clase A hereda de la clase B, entonces B es la


superclase de A. A es subclase de B. Los objetos de una subclase pueden ser usados en
las circunstancias donde son usados los objetos de la superclase correspondiente. Esto
se debe al hecho que los objetos de la subclase comparten el mismo comportamiento
que los objetos de la superclase.

En la literatura también se pueden encontrar otros términos para "superclase" y


para "subclase". Las superclases también son llamadas clases padres. Las subclases
pueden ser llamadas también clases hijas o simplemente clases derivadas.

Por supuesto, también se puede heredar de una subclase, haciendo que esta clase sea la
superclase de la nueva subclase. Esto conduce a una jerarquía de relaciones
superclase/subclase. Si se dibuja esta jerarquía, se obtiene una gráfica de herencia.

Un esquema común consiste en usar flechas para indicar la relación de herencia


entre clases u objetos. En nuestros ejemplos hemos usado "hereda-de".
Consecuentemente, la flecha empieza desde la subclase hacia la superclase, como se
ilustra en la Figura 5.5.

-15- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

Figura 5.5: Una gráfica de herencia sencilla.

En la literatura también se puede encontrar ilustraciones donde las flechas se


dibujan del modo contrario. La dirección en la que se usan las flechas dependen de
como el autor correspondiente las haya decidido entender.

De cualquier manera, en este apunte, las flechas siempre apuntan hacia la


superclase. En las secciones siguientes, las flechas indican "hereda-de".

VII .1 - Herencia Múltiple

Un mecanismo importante de orientación a objetos es la herencia múltiple. La


herencia múltiple no significa que múltiples subclases compartan la misma superclase.
Tampoco significa que una subclase herede de una clase que es a su vez subclase de
otra clase.
“La herencia múltiple significa que una subclase puede tener más de una
superclase. Esto permite que la subclase herede propiedades de más de una
superclase y –mezclar- sus propiedades”.

Considérese por ejemplo nuevamente nuestro programa de dibujo. Suponiendo


que ya tenemos una clase String que nos permite el manejo adecuado de texto. Podría
tener, por ejemplo, un método append para añadir otro texto.

En este programa, nos gustaría usar esta clase para añadir texto a los objetos
que se pudieran dibujar. También sería bueno usar rutinas ya existentes tales como
move() para mover el texto a donde fuera necesario.

En consecuencia, es razonable permitir que un texto para dibujarse tenga un


punto que defina su localización dentro del área de dibujo. Por lo tanto derivamos una
nueva clase DrawableString que hereda propiedades de Point y de String como se
ilustra en la Figura 5.6.

Figura 5.6: Derivar un string desplegable que herede propiedades de Point y de


String.

-16- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

En nuestro pseudo lenguaje, escribimos esto, simplemente separando las


diferentes superclases con comas :
class DrawableString inherits from Point, String {
attributes:
/* Todos heredados de superclases */
methods:
/* Todos heredados de superclases */
}
Podemos usar objetos de la clase DrawableString como ambos: puntos y strings.

 Debido a que drawablestring es-un(a) point podemos mover dichos objetos:

DrawableString dstring
...
move(dstring, 10)
...
Desde el momento que son string, podemos añadirles otro texto:

dstring.append("La flores color azul ...")

Podemos definir la herencia múltiple :

Definición (Herencia Múltiple) Si la clase A hereda de más de una clase, p.ej. A


hereda de B1, B2, ..., Bn, hablamos de herencia múltiple. Esto puede presentar
conflictos de nomenclatura en A si al menos dos de sus superclases definen
propiedades con el mismo nombre.
La definición de arriba presenta conflictos de nomenclatura los cuáles ocurren si
más de una superclase de una subclase usan el mismo nombre para ambos, atributos o
métodos. Por ejemplo, supongamos que la clase String define un método setX() que
pone el string en una secuencia de "X" caracteres. Se produce la pregunta ¿Que debería
ser heredado por DrawableString? ¿La versión de Point, de String o ninguna de las dos?
Estos conflictos pueden ser resueltos de al menos dos maneras :

 El orden en el cuál las superclases son provistas, definen que propiedad será
accesible por el nombre causante del conflicto. Los otros quedarán "escondidos".
 Las subclases deben resolver el conflicto proveyendo una propiedad con el
nombre y definiendo como usar los de sus superclases.

-17- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

La primera solución no es muy conveniente ya que presentan consecuencias


implícitas dependiendo del orden en el cuál las clases heredan unas de otras. Para el
segundo caso, las subclases deben redefinir explícitamente las propiedades que están
involucradas en conflictos de nomenclatura.

Un tipo especial de conflicto de nomenclatura se presenta si una clase D hereda en


forma múltiple de las superclases B y C que a su vez son derivadas de una superclase A.
Esto conduce a una gráfica de herencia como se muestra en la Figura 5.7.

Figura 5.7: Un conflicto de nomenclatura presentado por una superclase compartida


por superclases usadas en herencia múltiple.

Cabe la pregunta acerca de que propiedades hereda realmente la clase D de sus


superclases B y C. Algunos lenguajes de programación existentes resuelven esta gráfica
de herencia especial derivando D con

 las propiedades de A más


 las propiedades de B y C sin las propiedades que han heredado de A.

Consecuentemente, D no puede presentar conflictos de nomenclatura con los


nombres en la clase A. Sin embargo, si B y C añaden propiedades con el mismo
nombre, D entra en un conflicto de nomenclatura.

Otra posible solución es que D herede de ambas trayectorias de herencia. En esta


solución, D tiene dos copias de las propiedades de A: una heredada de B y otra de C.

Aunque la herencia múltiple es un poderoso mecanismo en orientación a objetos,


los problemas que se presentan con los conflictos de nomenclatura ha llevado a varios
autores a "condenarla". Debido a que los resultados de la herencia múltiple siempre
puede ser lograda usando herencia simple, algunos lenguajes orientados a objetos no

-18- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

permiten siquiera su uso. Sin embargo, usada con cuidado, bajo algunas condiciones
la herencia múltiple provee una manera eficiente y elegante de formular cosas.

VIII - BENEFICIOS Y PROBLEMAS QUE SE OBTIENEN DEL DESARROLLO


CON OOP

VIII.1- REUTILIZACION DE CODIGO

Día a día los costos del Hardware decrecen. Así surgen nuevas áreas de
aplicación cotidianamente: procesamiento de imágenes y sonido, bases de datos
multimediales, automatización de oficinas, ambientes de ingeniería de software, etc.

Lamentablemente, los costos de producción de software siguen aumentando;


el mantenimiento y la modificación de sistemas complejos suele ser una tarea trabajosa;
cada aplicación, (aunque tenga aspectos similares a otra) suele encararse como un
proyecto nuevo, etc.

Todos estos problemas aún no han sido solucionados en forma completa. Pero
como los objetos son portables (teóricamente) mientras que la herencia permite la
reusabilidad del código orientado a objetos, es más sencillo modificar código existente
porque los objetos no interaactúan excepto a través de mensajes; en consecuencia un
cambio en la codificación de un objeto no afectará la operación con otro objeto
siempre que los métodos respectivos permanezcan intactos.

“La introducción de tecnología de objetos como una herramienta conceptual


para analizar, diseñar e implementar aplicaciones permite obtener aplicaciones más
modificables, fácilmente extendibles y a partir de componentes reusables”. Esta
reusabilidad del código disminuye el tiempo que se utiliza en el desarrollo y hace que
el desarrollo del software sea más intuitivo porque la gente piensa naturalmente en
términos de objetos más que en términos de algoritmos de software.

VIII.2 - Problemas derivados de la utilización de OOP en la actualidad

Un sistema orientado a objetos, por lo visto, puede parecer un paraíso virtual. El


problema sin embargo surge en la implementación de tal sistema. Muchas compañías
oyen acerca de los beneficios de un sistema orientado a objetos e invierten gran cantidad
de recursos luego comienzan a darse cuenta que han impuesto una nueva cultura que es
ajena a los programadores actuales. Específicamente los siguientes temas suelen
aparecer repetidamente:

a) Curvas de aprendizaje largas. Un sistema orientado a objetos ve al mundo en una


forma única. Involucra la conceptualización de todos los elementos de un programa,
desde subsistemas a los datos, en la forma de objetos. Toda la comunicación entre los
objetos debe realizarse en la forma de mensajes. Esta no es la forma en que están
escritos los programas orientados a objetos actualmente; al hacer la transición a un

-19- Año 2014


MODELOS DE DESARROLLO DE PROGRAMAS Y PROGRAMACON CONCURRENTE

sistema orientado a objetos la mayoría de los programadores deben capacitarse


nuevamente antes de poder usarlo.

b) Dependencia del lenguaje. A pesar de la portabilidad conceptual de los objetos en un


sistema orientado a objetos, en la práctica existen muchas dependencias. Muchos
lenguajes orientados a objetos están compitiendo actualmente para dominar el mercado.
Cambiar el lenguaje de implementación de un sistema orientado a objetos no es una
tarea sencilla; por ejemplo C++ soporta el concepto de herencia múltiple mientras que
SmallTalk no lo soporta; en consecuencia la elección de un lenguaje tiene
ramificaciones de diseño muy importantes.

c) Determinación de las clases. Una clase es un molde que se utiliza para crear nuevos
objetos. En consecuencia es importante crear el conjunto de clases adecuado para un
proyecto. Desafortunadamente la definición de las clases es más un arte que una ciencia.
Si bien hay muchas jerarquías de clase predefinidas usualmente se deben crear clases
específicas para la aplicación que se este desarrollando. Luego, en 6 meses ó 1 año se da
cuenta que las clases que se establecieron no son posibles; en ese caso será necesario
reestructurar la jerarquía de clases devastando totalmente la planificación original.

d) Performance. En un sistema donde todo es un objeto y toda interacción es a través de


mensajes, el tráfico de mensajes afecta la performance. A medida que la tecnología
avanza y la velocidad de microprocesamiento, potencia y tamaño de la memoria
aumentan, la situación mejorará; pero en la situación actual, un diseño de una aplicación
orientada a objetos que no tiene en cuenta la performance no será viable
comercialmente.
Idealmente, habría una forma de atacar estos problemas eficientemente al mismo
tiempo que se obtienen los beneficios del desarrollo de una estrategia orientada a
objetos.

“ Debería existir una metodología fácil de aprender e independiente del lenguaje, y


fácil de reestructurar que no drene la performance del sistema.”

-20- Año 2014

S-ar putea să vă placă și