- · POO
La programación orientada a objetos o POO (OOP según sus siglas en inglés) es un paradigma de programación que usa objetos y sus interacciones, para diseñar aplicaciones y programas informáticos. Está basado en varias técnicas, incluyendo herencia, abstracción, polimorfismo y encapsulamiento. Su uso se popularizó a principios de la década de los años 1990. En la actualidad, existe variedad de lenguajes de programación que soportan la orientación a objetos.
- · Clases de objetos e instancias
Una clase es la estructura de un objeto, es decir, la definición de todos los elementos de que está hecho un objeto. Un objeto es, por lo tanto, el "resultado" de una clase. En realidad, un objeto es una instancia de una clase, por lo que se pueden intercambiar los términos objeto o instancia (o incluso evento).
Una clase se compone de dos partes:
Atributos (denominados, por lo general, datos miembros): esto es, los datos que se refieren al estado del objeto
Métodos (denominados, por lo general, funciones miembros): son funciones que pueden aplicarse a objetos
Si tenemos una clase llamada auto, los objetos Peugeot y Renault serán instancias de esa clase. También puede haber otros objetos Peugeot 406, diferenciados por su número de modelo. Asimismo, dos instancias de una clase pueden tener los mismos atributos, pero considerarse objetos distintos independientes. En un contexto real: dos camisas pueden ser idénticas, pero no obstante, también ser diferentes de alguna manera. Sin embargo, si las mezclamos es imposible distinguir una de la otra.
- · El concepto de objeto
La programación orientada a objetos consiste en ordenar datos en conjuntos modulares de elementos de información del mundo real (denominado un dominio). Estos elementos de datos se llaman objetos. Estos datos se agrupan de acuerdo a las características principales del mundo real de estos elementos (tamaño, color, etc.).
El enfoque de objetos es una idea que se ha probado con creces. Simula fue el primer lenguaje de programación en implementar el concepto de clases en 1967. En 1976, Smalltalk implementó los conceptos de encapsulación, agrupación y herencia (los conceptos principales de la programación orientada a objetos). Por otra parte, se han implementado varios lenguajes de programación orientada a objetos a escala global (Eiffel, Objective C, Loops, etc.).
La dificultad que presenta este enfoque es la creación de una representación abstracta, en forma de objetos, de entidades que realmente existen (perro, auto, lámpara eléctrica...) o que existen virtualmente (seguridad social, clima...).
Un objeto se caracteriza por varios conceptos:
Atributos: estos son los datos que caracterizan al objeto. Son variables que almacenan datos relacionados al estado de un objeto.
Métodos (usualmente llamados funciones de miembro): Los métodos de un objeto caracterizan su comportamiento, es decir, son todas las acciones (denominadas operaciones) que el objeto puede realizar por sí mismo. Estas operaciones hacen posible que el objeto responda a las solicitudes externas (o que actúe sobre otros objetos). Además, las operaciones están estrechamente ligadas a los atributos, ya que sus acciones pueden depender de, o modificar, los valores de un atributo.
Identidad: El objeto tiene una identidad, que lo distingue de otros objetos, sin considerar su estado. Por lo general, esta identidad se crea mediante un identificador que deriva naturalmente de un problema (por ejemplo: un producto puede estar representado por un código, un automóvil, por un número de modelo, etc.).
- · El concepto de herencia poo
La herencia es específica de la programación orientada a objetos, donde una clase nueva se crea a partir de una clase existente. La herencia (a la que habitualmente se denomina subclases) proviene del hecho de que la subclase (la nueva clase creada) contiene las atributos y métodos de la clase primaria. La principal ventaja de la herencia es la capacidad para definir atributos y métodos nuevos para la subclase, que luego se aplican a los atributos y métodos heredados.
Esta particularidad permite crear una estructura jerárquica de clases cada vez más especializada. La gran ventaja es que uno ya no debe comenzar desde cero cuando desea especializar una clase existente. Como resultado, se pueden adquirir bibliotecas de clases que ofrecen una base que puede especializarse a voluntad (la compañía que vende estas clases tiende a proteger las datos miembro usando la
- · Jerarquía de clase poo
La relación primaria-secundaria entre clases puede representarse desde un punto de vista jerárquico, denominado vista de clases en árbol. La vista en árbol comienza con una clase general llamada superclase (a la que algunas veces se hace referencia como clase primaria, clase padre, clase principal, o clase madre; existen muchas metáforas genealógicas). Las clases derivadas (clase secundaria o subclase) se vuelven cada vez más especializadas a medida que van descendiendo el árbol. Por lo tanto, se suele hacer referencia a la relación que une a una clase secundaria con una clase primaria mediante la frase "es una" x o y.
- · Herrencia multiple
Algunos lenguajes orientados a objetos, como C++ permiten herencias múltiples, lo que significa que una clase puede heredar los atributos de otras dos superclases. Este método puede utilizarse para agrupar atributos y métodos desde varias clases dentro de una sola.
- Definición de polimorfismo
La palabra polimorfismo proviene del griego y significa que posee varias formas diferentes. Este es uno de los conceptos esenciales de una programación orientada a objetos. Así como la herencia está relacionada con las clases y su jerarquía, el polimorfismo se relaciona con los métodos.
En general, hay tres tipos de polimorfismo:
- Polimorfismo de sobrecarga
- · Polimorfismo paramétrico (también llamado polimorfismo de plantillas)
- · Polimorfismo de inclusión (también llamado redefinición o subtipado)
Trataremos de describir ahora con más precisión estos tipos de polimorfismo, pero le sugerimos prestar atención, ya que muchas personas suelen confundirse al tratar de comprender las diferencias existentes entre estos tres tipos.
Polimorfismo de sobrecarga
- El polimorfismo de sobrecarga
ocurre cuando las funciones del mismo nombre existen, con funcionalidad similar, en clases que son completamente independientes una de otra (éstas no tienen que ser clases secundarias de la clase objeto). Por ejemplo, la clase complex, la clase image y la clase link pueden todas tener la función "display". Esto significa que no necesitamos preocuparnos sobre el tipo de objeto con el que estamos trabajando si todo lo que deseamos es verlo en la pantalla.
Por lo tanto, el polimorfismo de sobrecarga nos permite definir operadores cuyos comportamientos varían de acuerdo a los parámetros que se les aplican. Así es posible, por ejemplo, agregar el operador + y hacer que se comporte de manera distinta cuando está haciendo referencia a una operación entre dos números enteros (suma) o bien cuando se encuentra entre dos cadenas de caracteres (concatenación).
- Polimorfismo paramétrico
El polimorfismo paramétrico es la capacidad para definir varias funciones utilizando el mismo nombre, pero usando parámetros diferentes (nombre y/o tipo). El polimorfismo paramétrico selecciona automáticamente el método correcto a aplicar en función del tipo de datos pasados en el parámetro.
Por lo tanto, podemos por ejemplo, definir varios métodos homónimos de addition() efectuando una suma de valores.
El método int addition(int,int) devolvería la suma de dos números enteros.
float addition(float, float) devolvería la suma de dos flotantes.
char addition(char, char) daría por resultado la suma de dos caracteres definidos por el autor.
etc.
Una signature es el nombre y tipo (estático) que se da a los argumentos de una función. Por esto, una firma de método determina qué elemento se va a llamar.
- Polomorfismo de subtipado
La habilidad para redefinir un método en clases que se hereda de una clase base se llama especialización. Por lo tanto, se puede llamar un método de objeto sin tener que conocer su tipo intrínseco: esto es polimorfismo de subtipado. Permite no tomar en cuenta detalles de las clases especializadas de una familia de objetos, enmascarándolos con una interfaz común (siendo esta la clase básica).
Imagine un juego de ajedrez con los objetos rey, reina, alfil, caballo, torre y peón, cada uno heredando el objeto pieza.
El método movimiento podría, usando polimorfismo de subtipado, hacer el movimiento correspondiente de acuerdo a la clase objeto que se llama. Esto permite al programa realizar el movimiento.de_pieza sin tener que verse conectado con cada tipo de pieza en particular.
- · ATRIBUTOS
Los atributos son datos específicos de una clase. En la definición de clase se indica cuales son los atributos y conque nombre se va a designar a cada uno de ellos. El que una declaración de atributo sea pública significa que el elemento definido pueda utilizarse libremente desde cualquier otro punto del programa.
En el caso de una clase su carácter público es necesario para poder crear objetos de esa clase en otros puntos del programa (new). Para acceder a un atributo hay que indicarle el nombre del objeto al que pertenece:
unaEntrada.nombre = "Juan Pablo"
unaEntrada.apellidos = "de Frutos Martínez"
- · ENCAPSULADO Y OCULTACIÓN DE OBJETOS
Hay que tener presente que todos los programas en su nivel más simple constan de dos cosas: código y datos. Para tener una idea sobre lo que es el encapsulado, se puede pensar en un envoltorio protector alrededor del código y los datos que se manipulan. El envoltorio, que como se ve protege el código y define el comportamiento, también protege los datos para evitar que otro código acceda a ellos de manera arbitraria. El poder del código encapsulado viene dado por el conocimiento tan extensivo de acceso al mismo y puede ser utilizado de este modo independientemente de los detalles de implementación.
En Java, la base del encapsulado es la clase. Se crea una clase que representa una abstracción para un conjunto de objetos que comparten la misma estructura y comportamiento. Un objeto es una estancia única de una clase que mantiene la estructura y comportamiento de la misma. A estos objetos se les llama instancia de una clase. El comportamiento e interfaz de una clase se definen mediante métodos que operan sobre los datos de una instancia. Un método es un mensaje para realizar alguna acción en un objeto.
A la hora de llevar a cabo el encapsulado existen métodos para ocultar la complejidad de la implementación dentro de una clase. Cada método o variable se puede marcar como público o privado. La interfaz pública representa todo lo que los usuarios externos de la clase necesitan conocer o pueden conocer. Los métodos y datos privados no pueden ser accedidos. Es aconsejable ocultar la mayoría de las variables de una instancia. Esto ayuda a proteger el objeto frente a la manipulación de los datos por métodos ajenos a la clase.
La clase es lo que agrupa los atributos generales de un objeto y los métodos para operar en él. Una instancia es un caso concreto de la clase de un objeto.
Un programa escrito en Java es un conjunto de clases interrelacionadas, cada una de las cuales contienen métodos (funciones) y atributos (datos) propios. Los elementos contenidos en una clase son responsabilidad única y exclusiva de ésta y no pueden ser modificados por ninguna otra. Sin embargo, una de las características principales es que las clases están interrelacionadas, pues son todas partes de un mismo problema y cooperan entre sí para lograr la solución. Para conseguir esta relación sin comprometer la privacidad de sus componentes se crea una interfaz que define los únicos caminos, a través de los cuales puede establecer una comunicación con el resto de las clases. La interfaz será por lo tanto un conjunto de métodos que deberán ser accesibles públicamente para que otras clases puedan utilizarlos.
Para limitar el acceso a las variables internas de una clase, se añade el término private antes de su declaración. Así se limita el acceso desde el exterior. Cuando una variable tiene la característica private, será invisible incluso para las clases que hereden de ésta. Si se quiere mantener la integridad, pero que a la vez esos atributos puedan ser heredados, se utilizará el modificador protected en vez de private.
- · public class EntradaAgenda {· protected String nombre ;
- · public class EntradaAmigo extends EntradaAgenda {
- · private String apodo;
Así nombre podrá ser heredado en la clase EntradaAmigo, pero continua siendo inaccesible para el resto de las clases.
Para tener la certeza de que todo funciona del modo adecuado, evitar la modificación de los datos es algo necesario y la manera de conseguirlo es haciendo invisibles los datos al exterior.
Como beneficios del encapsulado se obtienen los siguientes:
Las clases se pueden desarrollar de manera independiente: la implementación que se haga de cada una de ellas no influye en el resto de las implementaciones.
Una vez escrita una clase y se comprueba que su funcionamiento es correcto, se tendrá la certeza de que siempre lo será.
- · Métodos
Son los métodos de una clase son funciones propias de la misma, formando parte de su definición. Cada instancia de la clase contiene los métodos y atributos particulares de la misma. Los métodos de una clase operan sobre los atributos particulares. La llamada de un método es similar a la consulta de atributo: nombre de objeto.método:
unaEntrada.muestraDatos ( );
Los paréntesis son obligatorios para la definición de los métodos aunque no se emplee ningún argumento. Una de las consecuencias de que Java sea un lenguaje orientado a objetos es que todo el código que se escriba ha de estar incluido dentro de una clase.
La creación de un objeto mediante new involucra la invocación de un método especial de la clase denominado constructor, encargado de realizar las funciones de inicialización necesarias para la correcta creación del objeto. El compilador de Java introduce un constructor de forma implícita si el programador no proporciona un constructor propio.
Los lenguajes orientados a objetos, proporcionan mecanismos que refuerzan el modelo orientado a objetos. Los mecanismos fundamentales se llaman encapsulado, herencia y polimorfismo.
En un capítulo anterior se trató brevemente las variables instancia, pero no se hizo mucho con ellas. Las variables instancia de un objeto son sus atributos, eso que diferencia a un objeto de otro dentro de la misma clase. Es importante poder modificar y leer estos atributos; lo que supone definir métodos denominados //accesores de atributos//. Veremos en un momento que no siempre hay que definir los métodos accesores explícitamente, pero vayamos paso a paso. Los dos tipos de accesores son los de //escritura// y los de //lectura//.
Los accesores permiten el acceso a los atributos del objeto.
:
# SIN accesores
class Cancion
def initialize(titulo, artista)
@titulo = titulo
@artista = artista
end
def titulo
@titulo
end
def artista
@artista
end
end
cancion = Cancion.new("Brazil", "Ivete Sangalo")
puts cancion.titulo
puts cancion.artista
# CON accesores
class Cancion
def initialize(titulo, artista)
@titulo = titulo
@artista = artista
end
# accesor de lectura
attr_reader :titulo, :artista
# accesor de escritura
# attr_writer :titulo
# accesor de escritura y lectura
# attr_accessor :titulo
end
cancion = Cancion.new("Brazil", "Ivete Sangalo")
puts cancion.titulo
puts cancion.artista
No hay comentarios:
Publicar un comentario