Fundamentos del Enfoque orientado a Objetos.
Iº
El Enfoque Orientado a Objeto se basa en cuatro principios
que constituyen la base de todo desarrollo orientado a objetos. Estos
principios son: la Abstracción, el Encapsulamiento, la Modularidad y la
Herencia.
Es el principio de ignorar aquellos aspectos de un fenómeno
observado que no son relevantes, con el objetivo de concentrarse en aquellos
que si lo son. Una abstracción
denota las características esenciales de un objeto (datos y operaciones), que
lo distingue de otras clases de objetos. Decidir el conjunto correcto de
abstracciones de un determinado dominio, es el problema central del diseño
orientado a objetos.
Los
mecanismos de abstracción son usados en el EOO para extraer y definir del medio
a modelar, sus características y su comportamiento. Dentro del EOO son muy
usados mecanismos de abstracción: la Generalización, la Agregación y la
clasificación.
l La
generalización es el mecanismo de
abstracción mediante el cual un conjunto de clases de objetos son agrupados en
una clase de nivel superior (Superclase), donde las semejanzas de las clases
constituyentes (Subclases) son enfatizadas, y las diferencias entre ellas son
ignoradas. En consecuencia, a través de la generalización, la superclase
almacena datos generales de las subclases, y las subclases almacenan sólo datos
particulares.La especialización es lo contrario de la generalización. Por
ejemplo; La clase Médico es una especialización de la clase Persona, y a su
vez, la clase Pediatra es una especialización de la superclase Médico.
l La
agregación es el mecanismo de
abstracción por el cual una clase de objeto es definida a partir de sus partes
(otras clases de objetos). Mediante agregación se puede definir por ejemplo un
computador, por descomponerse en: la CPU, la ULA, la memoria y los dispositivos
periféricos. El contrario de agregación es la descomposición.
l La
clasificación consiste en la definición
de una clase a partir de un conjunto de objetos que tienen un comportamiento
similar. La ejemplificación es lo contrario a la clasificación, y corresponde a
la instanciación de una clase, usando el ejemplo de un objeto en particular.
Fundamento 2: Encapsulamiento
Es
la propiedad del EOO que permite ocultar al mundo exterior la representación
interna del objeto. Esto quiere decir que el objeto puede ser utilizado, pero
los datos esenciales del mismo no son conocidos fuera de él. La idea central
del encapsulamiento es esconder los detalles y mostrar lo relevante. Permite el
ocultamiento de la información separando el aspecto correspondiente a la
especificación de la implementación; de esta forma, distingue el "qué
hacer" del "cómo hacer". La especificación es visible al
usuario, mientras que la implementación se le oculta. El encapsulamiento en un
sistema orientado a objeto se representa en cada clase u objeto, definiendo sus
atributos y métodos con los siguientes modos
de acceso:
l Público (+): Atributos
o Métodos que son accesibles fuera de la clase. Pueden ser llamados por
cualquier clase, aun si no está relacionada con ella.
l Privado (-): Atributos
o Métodos que solo son accesibles dentro de la implementación de la clase.
l Protegido (#): Atributos o Métodos que son accesibles
para la propia clase y sus clases hijas (subclases).
Los atributos y los métodos que son públicos constituyen la
interfaz de la clase, es decir, lo que el mundo exterior conoce de la
misma.Normalmente lo usual es que se oculten los atributos de la clase y solo
sean visibles los métodos, incluyendo entonces algunos de consulta para ver los
valores de los atributos. El método constructor (Nuevo, New) siempre es Público.
Fundamento 3: Modularidad
Es la propiedad que permite tener
independencia entre las diferentes partes de un sistema. La modularidad
consiste en dividir un programa en módulos o partes, que pueden ser compilados
separadamente, pero que tienen conexiones con otros módulos. En un mismo módulo
se suele colocar clases y objetos que guarden una estrecha relación. El sentido
de modularidad está muy relacionado con el ocultamiento de información.
Fundamento 4: Herencia
Es el proceso
mediante el cual un objeto de una clase adquiere propiedades definidas en otra
clase que lo preceda en una jerarquía de clasificaciones. Permite la definición
de un nuevo objeto a partir de otros, agregando las diferencias entre ellos
(Programación Diferencial), evitando repetición de código y permitiendo la
reusabilidad.
Las clases heredan
los datos y métodos de la superclase. Un método heredado puede ser sustituido
por uno propio si ambos tienen el mismo nombre. La herencia puede ser simple
(cada clase tiene sólo una superclase) o múltiple (cada clase puede tener asociada
varias superclases). La clase Docente y la clase Estudiante heredan las
propiedades de la clase Persona (superclase, herencia simple). La clase
Preparador (subclase) hereda propiedades de la clase Docente y de la clase
Estudiante (herencia múltiple).
Fundamento 5: Polimorfismo
Es una propiedad del EOO que permite que un método tenga
múltiples implementaciones, que se seleccionan en base al tipo objeto indicado
al solicitar la ejecución del método. El polimorfismo operacional o Sobrecarga
operacional permite aplicar operaciones con igual nombre a diferentes clases o
están relacionados en términos de inclusión. En este tipo de polimorfismo, los
métodos son interpretados en el contexto del objeto particular, ya que los
métodos con nombres comunes son implementados de diferente manera dependiendo
de cada clase.
Por ejemplo, el
área de un cuadrado, rectángulo y círculo, son calculados de manera distinta;
sin embargo, en sus clases respectivas puede existir la implementación del área
bajo el nombre común Área. En la práctica y dependiendo del objeto que llame al
método, se usará el código correspondiente.
Ejemplos:
Superclase: Clase Animal
Subclases:
Clases Mamífero, Ave, Pez.
Se puede definir un método Comer en cada subclase, cuya
implementación cambia de acuerdo a la clase invocada, sin embargo el nombre del
método es el mismo.
Mamifero.Comer ≠ Ave.Comer ≠ Pez.Comer
Otro ejemplo de polimorfismo es el operador +. Este operador
tiene dos funciones diferentes de acuerdo al tipo de dato de los operandos a
los que se aplica. Si los dos elementos son numéricos, el operador + significa
suma algebraica de los mismos, en cambio si por lo menos uno de los operandos
es un String o Carácter, el operador es la concatenación de cadenas de
caracteres.
Características del Enfoque Orientado a Objetos.
Las
características siguientes son las más importantes:
l Abstracción:
Denota las características esenciales de un objeto, donde se capturan sus
comportamientos.Cada objeto en el sistema sirve como modelo de un
"agente" abstracto que puede realizar trabajo, informar y cambiar su
estado, y "comunicarse" con otros objetos en el sistema sin revelar
cómo se implementan estas características. Los procesos, las funciones o los
métodos pueden también ser abstraídos y cuando lo están, una variedad de
técnicas son requeridas para ampliar una abstracción.El proceso de abstracción permite
seleccionar las características relevantes dentro de un conjunto e identificar
comportamientos comunes para definir nuevos tipos de entidades en el mundo
real. La abstracción es clave en el proceso de análisis y diseño orientado a
objetos, ya que mediante ella podemos llegar a armar un conjunto de clases que
permitan modelar la realidad o el problema que se quiere atacar.
l Encapsulamiento:
Significa reunir a todos los elementos que pueden considerarse pertenecientes a
una misma entidad, al mismo nivel de abstracción. Esto permite aumentar la cohesión de
los componentes del sistema. Algunos autores confunden este concepto con el
principio de ocultación, principalmente porque se suelen emplear conjuntamente.
l Modularidad:
Se denomina Modularidad a la propiedad que permite subdividir una aplicación en
partes más pequeñas (llamadas módulos), cada una de las cuales debe ser tan
independiente como sea posible de la aplicación en sí y de las restantes
partes. Estos módulos se pueden compilar por separado, pero tienen conexiones
con otros módulos. Al igual que la encapsulación, los lenguajes soportan la
Modularidad de diversas formas.
l Principio
de ocultación: Cada objeto está aislado del exterior,
es un módulo natural, y cada tipo de objeto expone una interfaz a otros objetos
que específica cómo pueden interactuar con los objetos de la clase. El
aislamiento protege a las propiedades de un objeto contra su modificación por
quien no tenga derecho a acceder a ellas, solamente los propios métodos
internos del objeto pueden acceder a su estado. Esto asegura que otros objetos
no pueden cambiar el estado interno de un objeto de maneras inesperadas,
eliminando efectos secundarios e interacciones inesperadas. Algunos lenguajes
relajan esto, permitiendo un acceso directo a los datos internos del objeto de
una manera controlada y limitando el grado de abstracción. La aplicación entera
se reduce a un agregado o rompecabezas de
objetos.
l Polimorfismo:
Comportamientos diferentes, asociados a objetos distintos, pueden compartir el
mismo nombre, al llamarlos por ese nombre se utilizará el comportamiento
correspondiente al objeto que se esté usando. O dicho de otro modo, las
referencias y las colecciones de objetos pueden contener objetos de diferentes
tipos, y la invocación de un comportamiento en una referencia producirá el
comportamiento correcto para el tipo real del objeto referenciado. Cuando esto
ocurre en "tiempo de ejecución", esta última característica se llama
asignación tardía o asignación dinámica. Algunos lenguajes proporcionan medios
más estáticos (en "tiempo de compilación") de polimorfismo, tales
como las plantillas y la sobrecarga de operadores de
C++.
l Herencia:
Las clases no están aisladas, sino que se relacionan entre sí, formando una
jerarquía de clasificación. Los objetos heredan las propiedades y el
comportamiento de todas las clases a las que pertenecen. La herencia organiza y
facilita el polimorfismo y el encapsulamiento permitiendo a los objetos ser
definidos y creados como tipos especializados de objetos preexistentes. Estos
pueden compartir (y extender) su comportamiento sin tener que volver a
implementarlo. Esto suele hacerse habitualmente agrupando los objetos en clases
y estas en árboles o enrejados que reflejan un comportamiento común. Cuando un
objeto hereda de más de una clase se dice que hay herencia múltiple.
l Recolección
de basura: La recolección de basura o garbage
collector es la técnica por la cual el entorno de objetos se encarga de
destruir automáticamente, y por tanto desvincular la memoria asociada, los
objetos que hayan quedado sin ninguna referencia a ellos. Esto significa que el
programador no debe preocuparse por la asignación o liberación de memoria, ya
que el entorno la asignará al crear un nuevo objeto y la liberará cuando nadie
lo esté usando. En la mayoría de los lenguajes híbridos que se extendieron para
soportar el Paradigma de Programación Orientada a Objetos como C++ u Object
Pascal, esta característica no existe y la
memoria debe desasignarse manualmente.