Download Tipo de Datos Abstractos y Programación Orientada a Objetos

Document related concepts

Polimorfismo (informática) wikipedia , lookup

Rust (lenguaje de programación) wikipedia , lookup

Common Lisp wikipedia , lookup

Dylan (lenguaje de programación) wikipedia , lookup

Ocaml wikipedia , lookup

Transcript
Tipo de Datos Abstractos y
Programación Orientada a Objetos
DISEÑO Y PARADIGMAS DE LENGUAJES
ING. EN INFORMÁTICA/ING. EN COMPUTACIÓN
DEPARTAMENTO DE INFORMÁTICA
UNIVERSIDAD NACIONAL DE SAN LUIS
ARGENTINA - 2016
[email protected]
Tipo de Datos Abstractos

Notas correspondientes a las págs. 195-202, Cap. 5, Lenguajes de
Programación - Diseño e Implementación. Pratt y Zelkowitz. Tercera
edición (Español)
Tipo de Datos Abstractos

Construir grandes programas involucra usualmente diseñar e implementar nuevos
tipos de datos.
Ejemplo: un tipo de objeto de datos empleado para un programa de administración
de personal.
Información que podrían tener los O.D. de este tipo (atributos): nombre, edad, número de
documento, antigüedad, dependencia, entre otros.
También será necesario definir las operaciones de manipulación básicas de los O.D. de
tipo empleado.
Tipo de Datos Abstractos
La especificación de los atributos y las operaciones es una especificación del TDA
empleado.
¿En qué consistiría la implementación de empleado?
Soporte para la definición de nuevos
tipos de datos

El uso del tipo de dato empleado debería ser similar al de un tipo primitivo del
lenguaje.

Uno de los objetivos en el diseño de los lenguajes de programación es que las
distinciones entre varias formas de tipos de datos sean transparentes al
programador.

Mecanismos básicos para crear nuevos tipos de datos y operaciones:

1. Los subprogramas (disponibles en casi todos los lenguajes)

2. Las declaraciones de tipos

3. La herencia (propia de la POO)
Evolución del concepto de tipos de
datos

“Conjunto de valores que puede tomar una variable“ (Ej.: FORTRAN). Los tipos se
asocian a variables.
REAL A(100)
REAL B(100)

La definición de tipo (aplicable a un conj. de variables), especifica la estructura del
OD (Pascal).
type pila = record
datos: array [1..MAX] of integer;
tope: 1..MAX;
end;
var p:pila;

El concepto es extendido para incluir no sólo un conjunto de OD’s sino también un
conjunto de operaciones que los manipulan (Tipos de datos abstractos).
Tipo de Datos Abstractos (TDA)
Idea: extender la idea de encapsulamiento de los tipos primitivos a los tipos definidos por
el programador. Definición:

Un conjunto de OD’s que pueden usar una o más definiciones de tipos.

Un conjunto de operaciones abstractas para aquellos objetos de datos.

El encapsulamiento, para que el usuario sólo pueda manipular los objetos de datos del tipo,
mediante las operaciones definidas.
Algunos lenguajes que proveen soporte para TDA’s:

ADA (packages)

C++ y Java (class)

Modula II (class)

Smalltalk (class)
Abstracción y ocultamiento de
información
Un lenguaje de programación provee una serie de abstracciones (sus características) y
medios para que el programador defina las suyas:

Subprogramas

Definiciones de tipos, clases y paquetes
Ocultamiento de información: principio central en el diseño de abstracciones definidas
por el programador: “ocultar tanta información como sea posible, a los usuarios de una
abstracción".
Ejemplo: la función raíz cuadrada es una operación abstracta útil (no necesito conocer
la representación de los números ni el algoritmo para realizar el cálculo).
Abstracción y ocultamiento de
información
Un tipo de dato definido por el programador es una abstracción útil si puede ser usada
sin conocimiento de la representación de los objetos de este tipo, ni de los algoritmos
usados por sus operaciones.
Encapsulamiento
A diferencia del ocultamiento de la información, en este caso, el usuario de la abstracción:

no necesita conocer la información oculta para poder usarla.

no puede manipular directamente la información oculta (aunque lo desee).
Principal ventaja del encapsulamiento: permite reducir el impacto de la modificación de los
programas.
Importante!!!!!!!: el ocultamiento de información se relaciona con el diseño de los programas
mientras que el encapsulamiento es una cuestión de diseño del lenguaje (debe brindarle
soporte al programador para que prohíba el acceso a la información oculta de la
abstracción).
Abstracción sin encapsulamiento
(Pascal)
Encapsulamiento (C++)
Encapsulamiento por subprograma

Un subprograma es una operación abstracta definida por el programador.

Es el mecanismo de encapsulamiento presente en la mayoría de los lenguajes.
Consideraciones sobre la visualización de los subprogramas como operaciones abstractas:
La definición de un subprograma consta de dos partes:

La especificación: incluye el nombre, signatura y descripción de la función que computa.

La implementación: cuerpo del subprograma, formada por declaraciones de datos locales
(encapsulados) y sentencias.
Ejemplo:
float fn (float x,int y) {
float m[100]; int n;
.....
/*signatura*/
/*declaraciones*/
} /*secuencia de sentencias*/
Programación Orientada a Objetos
Notas correspondientes a las págs. 457-477, Cap. 12, Concepts of Programming Languages,
Sixth Edition, Robert Sebesta.
Programación Orientada a Objetos

Hoy en día no es possible pensar en lenguajes sin el concepto de POO.

Inicios…. Mejoras posteriores de las versiones imperativas: COBOL y LISP.

Lenguajes con soporte a la POO… procedural + OO: C++ y Ada 95.
funcional + OO: CLOS.

Lenguajes OO sin soporte a otros tipos de programación: Java y C#.
Programación Orientada a Objetos
Lenguaje
PP Original
PP Mejorado
Actualmente
COBOL
Imperativo (1959)
POO
(1974 y 2002)
Procedural, OO,
Imperativo
Lisp
Funcional
(1958)
POO
(finales de 1970)
Multiparadigma (OO,
Funcional, Declarativo)
C++
Imperativo y OO (mediados de 1980)
Basado en C
Ada95
Imperativo y OO (mediados de 1995)
CLOS
Funcional y OO (1988) Basado en Lisp
Java
Imperativo y OO (1995)
C#
Multiparadigma: estructurado,
imperativo, OO, dirigido por eventos,
funcional, genérico y “reflexive” (2000)
Multiparadigma
(Imperativo, Genérico,
OO)
Programación Orientada a Objetos

Los comienzos… Simula67

Smalltalk… el primer lenguaje OO
Programación Orientada a Objetos
Para que un lenguaje sea OO debe proveer tres características:

Tipos de Datos Abstractos (TDA): cjto de datos de nuevos tipos + operaciones
abstractas para esos nuevos tipos + encapsulamiento

Herencia (1980): reuso (mayor productividad). Soluciona el problema de
modificación de los TDA y jerarquización de datos.

Polimorfismo y ligadura dinámica: proveer polimorfismo entre los mensajes y la
definición de los métodos. Equivale a una operación genérica que se
instanciará dinámicamente.
Programación Orientada a Objetos

Guardar información sobre diferentes tipos de pelotas…
Programación Orientada a Objetos
Class Pelota{
Int peso
float diámetro
Char textura
}
Programación Orientada a Objetos
Class Pelota{
Int peso
float diámetro
Char textura
setPeso (int value){
peso=value;
}
showTextura(){
print(“La pelota es “);
}
}
TDA Pelota
Programación Orientada a Objetos
Herencia
Programación Orientada a Objetos
Class Pelota{
…..
showName (){
print_class_name();
}
}
…..
Pelota X;
X = new(Pelota);
X.showName();
Programación Orientada a Objetos
Class Pelota{
…..
showName (){
print_class_name();
}
}
…..
Pelota X;
X = new(Pelota);
X.showName();
Imprime “Pelota”
Programación Orientada a Objetos
Class Pelota{
…..
showName (){
print_class_name();
}
}
…..
Pelota X;
X = new(PelotaDeTenis);
X.showName();
Programación Orientada a Objetos
Class Pelota{
…..
showName (){
print_class_name();
}
}
…..
Pelota X;
X = new(PelotaDeTenis);
X.showName();
Imprime “PelotaDeTenis”
Programación Orientada a Objetos
Class Pelota{
…..
showName (){
print_class_name();
}
}
…..
Pelota X;
X = new(PelotaDeTenis);
X.showName();
Variable Polimórfica
Ligadura
Dinámica
Soporte POO: Smalltalk

transcript show: ‘Hello Word’
Soporte POO: Smalltalk

transcript show: ‘Hello Word’

1 negated
Soporte POO: Smalltalk

transcript show: ‘Hello Word’

1 negated

10 + 20 + 30
Soporte POO: Smalltalk

Todo programa SmallTalk consiste de objetos: constantes, archivos,
objetos que se crean, etc.

Todo es tratado uniformemente: se envía un mensaje a un objeto lo que
retorna algo o comunica que se pudo aplicar el mensaje.

Todos los objetos se almacenan en el heap.

Utiliza Recolector de Basura para recuperar el espacio (no existe
‘deslocación’ de espacio).
Soporte POO: Smalltalk

La ligadura de mensajes a métodos se efectúa dinámicamente (hasta
llegar a object o error).

El chequeo de tipos (dinámico) se traduce a encontrar un error por la
falta de un método (variables no tipadas).

El código de un programa SmallTalk es ‘genérico’ (los tipos de las
variables son irrelevantes).
Polimorfismo
Soporte POO: Smalltalk

Herencia simple.

Las subclases son “subtipos”.

Variables y métodos pueden ser sobreescritos aunque aún pueden
accederse los de la clase padre usando la palabra clave super.
Herencia
Soporte POO: Smalltalk

Lenguaje simple, pequeño y regular con un sistema de ejecución grande
y potente.

Código genérico.

Los programas son más lentos que los de otros lenguajes (compilados e
imperativos) y quizás menos eficientes.

El ‘error de tipo’ es demorado hasta la ejecución (pasa la compilación).
Soporte POO: C++

Evolucionó de C y Simula67 (1er lenguaje en usar el concepto de abstracción).

Uno de los más usados en la actualidad a pesar de que la herencia, abstracción y
ligadura dinámica no es simple.

Al ser un híbrido es compatible con C: los objetos pueden ser almacenados en la pila
o en el heap.

Todas las clases tienen al menos un método (constructor) para inicializar los datos de
la clase (pueden programarse destructores que se invocarán implícitamente).
Soporte POO: C++

Los objetos manejados como variables no tendrán presente la ligadura
dinámica (objeto conocido y estático).

Variables referencias o punteros de la clase base que pueden apuntar a
objetos de las clases derivadas se pueden transformar en variables
polimórficas.

Las funciones miembro que deben ser ligadas dinámicamente deben ser
declaradas como virtuales (virtual).
Polimorfismo
Soporte POO: C++
Polimorfismo
Soporte POO: C++
Square s;
Rectangle r;
Shape &ref_shape = s; //una referencia a s
ref_shape.draw( );
//ligadura dinámica
r.draw( );
//ligadura estática
Polimorfismo
Soporte POO: C++

Sin herencia (clases solitarias).

Las subclases son “subtipos”.

Herencia multiple.

Modificadores: public, private (concepto de clase ‘amiga’), protected.
Herencia
Soporte POO: C++

El programador puede elegir el tipo de ligadura para los métodos:
estática (más rápido) o dinámico (más rápido que en Smalltalk).

Chequeo de tipos estático: detecta errores anticipadamente.

Herencia multiple y más compleja de manejar.

Complejo, poco elegante y difícil de entender.