0% encontró este documento útil (0 votos)
5 vistas36 páginas

Programación Orientada Objetos

El documento aborda la Programación Orientada a Objetos (POO), explicando conceptos clave como clases, objetos, herencia, encapsulamiento y excepciones. Se destacan las metas de robustez, adaptabilidad y reusabilidad en el diseño de software, así como la importancia de los tipos abstractos de datos y los patrones de diseño. Además, se menciona el uso de la sintaxis de Java para la implementación de estas características, incluyendo constructores, excepciones y genéricos.

Cargado por

Jesús Sánchez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
5 vistas36 páginas

Programación Orientada Objetos

El documento aborda la Programación Orientada a Objetos (POO), explicando conceptos clave como clases, objetos, herencia, encapsulamiento y excepciones. Se destacan las metas de robustez, adaptabilidad y reusabilidad en el diseño de software, así como la importancia de los tipos abstractos de datos y los patrones de diseño. Además, se menciona el uso de la sintaxis de Java para la implementación de estas características, incluyendo constructores, excepciones y genéricos.

Cargado por

Jesús Sánchez
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 36

Programación Orientada a

Objetos
Algorítmica y Programación II
Terminología
• Cada objeto creado en un programa es una instancia de una clase.
• Cada clase presenta al mundo exterior una visión concisa y
consistente de los objetos que son instancias de esta clase, sin entrar
en demasiados detalles innecesarios ni dar acceso a otros al
funcionamiento interno de los objetos.
• La definición de clase especifica típicamente variables de instancia,
también conocidas como miembros de datos, que el objeto contiene,
así como los métodos, también conocidas como funciones miembro,
que los objetos pueden ejecutar.
Metas
• Robustez
• Queremos que el software sea capaz de manejar entradas
inesperadas que no están explícitamente definidas para su aplicación.
• Adaptabilidad
• El software debe poder evolucionar con el tiempo en respuesta a las
condiciones cambiantes de su entorno. (hardware, SO, etc.)
• Reusabilidad
• El mismo código debe ser utilizable como un componente de
diferentes sistemas en diversas aplicaciones.
Tipos Abstractos de Datos
• Abstracción es representar un sistema por sus partes más fundamentales.
• La aplicación del paradigma de abstracción al diseño de estructuras de
datos da lugar a tipos de datos abstractos (TAD) abstract data types
(ADTs).
• Un TAD es un modelo de una estructuras de datos que especifica el tipo de
dato almacenado, las operaciones soportadas por él, y los tipos de
parámetros de las operaciones.
• Un TAD especifica qué operaciones hace, pero no como las hace.
• El conjunto colectivo de comportamientos respaldados por un TAD es su
interfaz pública.
Principios de Diseño Orientado a Objetos
• Abstracción

• Encapsulamiento

• Modularidad
Patrones de Diseño

Patrones algorítmicos: Patrones de diseño de software:


• Recursion • Iterator
• Amortization • Adapter
• Divide-and-conquer • Position
• Prune-and-search • Composition
• Brute force • Template method
• Dynamic programming • Locator
• The greedy method • Factory method
Diseño de Software Orientado a Objeto
• Responsibilidades: Divida el trabajo en diferentes actores, cada uno
con una responsabilidad diferente.
• Independencia: Defina el trabajo para cada clase para ser tan
independiente de otras clases como sea posible.
• Comportamientos: Defina los comportamientos de cada clase con
cuidado y precisión, de modo que las consecuencias de cada acción
realizada por una clase sean bien comprendidas por otras clases que
interactúen con ella.
Lenguaje de modelado unificado/Unified
Modeling Language (UML)
• Un diagrama de clase tiene tres porciones.
1. El nombre de la clase
2. Las variables de instancia recomendadas
3. Los métodos de clases recomendados.
Definiciones de Clases
• Una clase sirve como el medio principal para la abstracción en la
programación orientada a objetos.
• En Java, cada variable es un tipo base (primitivo) o es una referencia a una
instancia de alguna clase.
• Una clase proporciona un conjunto de comportamientos en forma de
funciones miembro (también conocidas como métodos), con
implementaciones que pertenecen a todas sus instancias.
• Una clase también sirve como modelo para sus instancias, determinando
de manera efectiva la forma en que se representa la información de estado
para cada instancia en forma de atributos (también conocidos como
campos, variables de instancia o miembros de datos).
Constructores
• Un usuario puede crear una instancia de una clase utilizando el
operador new con un método que tiene el mismo nombre que la
clase.
• Tal método, conocido como constructor, tiene como responsabilidad
establecer el estado de un nuevo objeto con valores iniciales
apropiados para sus variables de instancia.
Herencia
• Un mecanismo para una organización modular y jerárquica es la herencia.
• Esto permite que se defina una nueva clase basada en una clase existente
como punto de partida.
• La clase existente normalmente se describe como la clase base, clase
principal o superclase, mientras que la clase recién definida se conoce
como subclase o clase hija.
• Hay dos formas en que una subclase puede diferenciarse de su superclase :
• Una subclase puede especializar un comportamiento existente al proporcionar una
nueva implementación que anula un método existente.
• Una subclase también puede extender su superclase proporcionando métodos
completamente nuevos.
Herencia y Constructores
• Los constructores nunca se heredan en Java; por lo tanto, cada clase debe
definir un constructor por sí mismo.
• Todos sus variables de instancia deben estar inicializadas correctamente,
incluidos los campos heredados.
• La primera operación dentro del cuerpo de un constructor debe ser invocar
un constructor de la superclase, que inicializa los campos definidos en la
superclase.
• Un constructor de la superclase se invoca explícitamente mediante el uso
de la palabra clave super con los parámetros adecuados.
• Si un constructor para una subclase no realiza una llamada explícita a super
o this como su primer comando, entonces se realizará una llamada
implícita a super (), la versión de cero parámetros del constructor de la
superclase.
Un ejemplo de extensión (herencia)
• Una progresión numérica es una secuencia de números, donde cada
número depende de uno o más de los números anteriores.
• Una progresión aritmética determina el siguiente número agregando
una constante fija al valor anterior.
• Una progresión geométrica determina el próximo número
multiplicando el valor anterior por una constante fija.
• Una progresión de Fibonacci utiliza la fórmula Ni+1=Ni+Ni-1
Diagrama de Clases de Progression y sus
Subclases
La clase base Progression
La clase base, continuación
Subclase ArithmeticProgression
Subclase GeometricProgression
Subclase FibonacciProgression
Interfaces
Interfaces (cont.)
Implementación Múltiple
Implementación Múltiple
Clases Abstractas
Actividad 1
• Implementar la herencia de progresiones utilizando paquetes
• Reemplazar la clase base por una clase abstracta
• Implementar un arreglo polimórfico
• Testear ambos paquetes utilizando paquete de prueba
Excepciones
• Las excepciones son eventos inesperados que ocurren durante la ejecución
de un programa.
• Puede producirse una excepción debido a un recurso no disponible, una
entrada inesperada de un usuario o simplemente un error lógico por parte
del programador.
• En Java, las excepciones son objetos que puede lanzar (thrown) el código
que se encuentra con una situación inesperada.
• Una excepción también puede ser capturada (caught) por un bloque de
código que "maneja" el problema.
• Si no se detecta, una excepción hace que la máquina virtual deje de
ejecutar el programa y que informe un mensaje apropiado a la consola.
Atrapando Excepciones
• La metodología general para manejar excepciones es una
construcción try-catch en la que se ejecuta un fragmento de código
protegido que podría arrojar una excepción.
• Si arroja (throws) una excepción, esa excepción se captura haciendo
que el flujo de control salte a un bloque de captura predefinido que
contiene el código para aplicar una resolución apropiada.
• Si no ocurre una excepción en el código guardado, todos los bloques
catch se ignoran.
Lanzando excepciones
• Las excepciones se originan cuando una parte del código de Java
encuentra algún tipo de problema durante la ejecución y arroja un
objeto de excepción.
• Esto se hace usando la palabra clave throw seguida de una instancia
del tipo de excepción que se lanzará.
• A menudo es conveniente crear una instancia de un objeto de
excepción en el momento en que se debe lanzar la excepción. Por lo
tanto, una instrucción throw se escribe típicamente de la siguiente
manera: throw new exceptionType (parameters); donde
exceptionType es el tipo de la excepción y los parámetros se envían al
constructor de ese tipo.
La cláusula throws
• Cuando se declara un método, es posible declarar explícitamente,
como parte de su firma, la posibilidad de que se genere un tipo de
excepción particular durante una llamada a ese método.
• La sintaxis para declarar posibles excepciones en una firma de
método se basa en palabra clave throws (que no debe confundirse
con una declaración de lanzamiento real throw).
• Por ejemplo, el método parseInt de la clase Integer tiene la siguiente
firma formal:
public static int parseInt(String s) throws NumberFormatException;
Casting
• Casting con Objects permite la conversión entre clases y subclases.
• Se produce una conversión de ampliación cuando un tipo T se
convierte en un tipo "más ancho" U :
• T y U son tipos de clase y U es una superclase de T.
• T y U son tipos de interfaz y U es una superinterfaz de T.
• T es una clase que implementa la interfaz U.
• Ejemplo:
Progression prog= new AritmeticProgression(...);
Conversiones de reducción/Narrowing
Conversions
• Una conversion de reducción ocurre cuando un tipo T se convierte a
un tipo “reducido” de tipo S.
• T y S son tipos de clase y S es una subclase de T.
• T y S son tipos de interfaz y S es una subinterfaz de T.
• T es una interfaz implementada por la clase S.
• En general, una conversión de reducción de tipos de referencia
requiere un lanzamiento explícito.
• Ejemplo:
AritmeticProgression ap = (AritmenticProgression) prog;
Actividad 2
Dibuje un diagrama de clases de herencia para el siguiente conjunto de clases:

• Clase Cabra extiende Object y agrega una variable de instancia de cola y métodos: leche() y
saltar().
• Clase Pig extiende Object y agrega una variable de instancia de nariz y métodos comer(comida) y
revolcar().
• Clase Caballo extiende Object y agrega variables de instancia de altura y color, y los métodos
correr() y saltar().
• Clase Carrera extiende Caballo y agrega un método carrera().
• La clase Ecuestre extiende el Caballo y agrega la variable de instancia peso y esEntrenado, y los
métodos trotar() y isEntrenado().

Considere la herencia de las clases anterior, y sea d una variable de objeto de tipo Caballo. Si d se
refiere a un objeto real de tipo Ecuestre, ¿se puede convertir a la clase Carrera? ¿Por qué sí o por
qué no?
Genéricos
• Java incluye soporte para escribir clases genéricas y métodos que
pueden operar en una variedad de tipos de datos, mientras que a
menudo se evita la necesidad de conversiones explícitas.
• El marco (framework) de los genéricos nos permite definir una clase
en términos de un conjunto de parámetros de tipo formales, que
luego se pueden usar como el tipo declarado para variables,
parámetros y valores de retorno dentro de la definición de la clase.
• Esos parámetros de tipo formales se especifican posteriormente
cuando se utiliza la clase genérica como un tipo en otro lugar en un
programa.
Sintáxis para Genéricos
• Los tipos pueden declararse utilizando nombres genéricos :

• A continuación, se crean instancias usando tipos reales :


Pair <String,Double> bid;
Clases Anidadas
• Java permite anidar una definición de clase dentro de la definición de
otra clase.
• El uso principal para la anidación de clases es cuando se define una
clase que está fuertemente afiliada con otra clase.
• Esto puede ayudar a aumentar el encapsulamiento y reducir los
conflictos de nombres no deseados.
• Las clases anidadas son una técnica valiosa cuando se implementan
estructuras de datos, ya que una instancia de un uso anidado se
puede usar para representar una pequeña porción de una estructura
de datos más grande, o una clase auxiliar que ayuda a navegar por
una estructura de datos primaria.
Bibliografía
• 2014 Goodrich, Tamassia, Goldwasser Object-Oriented Programming

También podría gustarte