Download Tipo de Datos Abstractos y Programación Orientada a Objetos
Document related concepts
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 LCAGNINA@UNSL.EDU.AR 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.