1. ENCAPSULAMIENTO
El encapsulamiento consiste en unir en la Clase las características y comportamientos, esto es, las variables y métodos. Es tener todo esto es una sola entidad. En los lenguajes estructurados esto era imposible. Es evidente que el encapsulamiento se logra gracias a la abstracción y el ocultamiento que veremos a continuación.
La utilidad del encapsulamiento va por la facilidad para manejar la complejidad, ya que tendremos a las Clases como cajas negras donde sólo se conoce el comportamiento pero no los detalles internos, y esto es conveniente porque nos interesará será conocer qué hace la Clase pero no será necesario saber cómo lo hace.
2. HERENCIA
La herencia es uno de los conceptos más cruciales en la POO. La herencia básicamente consiste en que una clase puede heredar sus variables y métodos a varias subclases (la clase que hereda es llamada superclase o clase padre). Esto significa que una subclase, aparte de los atributos y métodos propios, tiene incorporados los atributos y métodos heredados de la superclase. De esta manera se crea una jerarquía de herencia.
Java permite el empleo de la herencia , característica muy potente que permite definir una clase tomando como base a otra clase ya existente. Esto es una de las bases de la reutilización de código, en lugar de copiar y pegar.
En java, como ya vimos la herencia se especifica agregando la clausula extends después del nombre de la clase. En la clausula extends indicaremos el nombre de la clase base de la cuál queremos heredar.
Al heredar de una clase base, heredaremos tanto los atributos como los métodos, mientras que los constructores son utilizados, pero no heredados.
3. POLIMORFISMO
En programación orientada a objetos el polimorfismo se refiere a la posibilidad de definir clases diferentes que tienen métodos o atributos denominados de forma idéntica, pero que se comportan de manera distinta.
Por ejemplo, podemos crear dos clases distintas: Pez y Ave que heredan de la superclase Animal. La clase Animal tiene el método abstracto mover que se implementa de forma distinta en cada una de las subclases (peces y aves se mueven de forma distinta).
Como se mencionó anteriormente, el concepto de polimorfismo se puede aplicar tanto a funciones como a tipos de datos. Así nacen los conceptos de funciones polimórficas y tipos polimórficos. Las primeras son aquellas funciones que pueden evaluarse o ser aplicadas a diferentes tipos de datos de forma indistinta; los tipos polimórficos, por su parte, son aquellos tipos de datos que contienen al menos un elemento cuyo tipo no está especificado.
4. MODULARIDAD
En programación modular, y más específicamente en programación orientada a objetos, 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 que se puedan compilar por separado, pero que tienen conexiones con otros módulos. Al igual que la encapsulación, los lenguajes soportan la Modularidad de diversas formas.
Descomponer un programa en un número pequeño de abstracciones coherentes que pertenecen al dominio del problema y enmascaran la complejidad interna.
* Existen muchas acepciones del concepto de modularidad.
* Van desde una subrutina hasta la asignación de trabajo para un programador.
* La modularidad consiste en subdividir el software en partes denominadas módulos, cada uno con un propósito especifico, que se integran para satisfacer los requerimientos de un problema.
* La modularidad es el atributo más sencillo del software, que permite a un programa ser manejable intelectualmente.
* Asimismo, la modularidad es un enfoque comúnmente aceptado tanto para análisis como para diseño.
5. PRINCIPIO ALTA COHESION Y BAJO ACOPLAMIENTO
Los conceptos de cohesión y acoplamiento están íntimamente relacionados. Un mayor grado de cohesión implica uno menor de acoplamiento. Maximizar el nivel de cohesión intramodular en todo el sistema resulta en una minimización del acoplamiento intermodular.
Alta cohesión
Nos dice que la información que almacena una clase debe de ser coherente y debe estar (en la medida de lo posible) relacionada con la clase.
a. Cohesión Coincidente: El módulo realiza múltiples tareas, sin ninguna relación entre ellas.
b. Cohesión Lógica: El módulo realiza múltiples tareas relacionadas, pero, en tiempo de ejecución, sólo una de ellas será llevada a cabo.
c. Cohesión Temporal: Las tareas llevadas a cabo por un módulo tienen, como única relación el deber ser ejecutadas “al mismo tiempo”.
d. Cohesión de Procedimiento: La única relación que guardan las tareas de un módulo es que corresponden a una secuencia de pasos propia del “producto”.
e. Cohesión de Comunicación: Las tareas corresponden a una secuencia de pasos propia del “producto” y todas afectan a los mismos datos.
f. Cohesión de Información: Las tareas llevadas a cabo por un módulo tienen su propio punto de arranque, su codificación independiente y trabajan sobre los mismos datos. El ejemplo típico: OBJETOS
g. Cohesión Funcional: Cuando el módulo ejecuta una y sólo una tarea, teniendo un único objetivo a cumplir, se dice que tiene Cohesividad Funcional.
Bajo acoplamiento
Es la idea de tener las clases lo menos ligadas entre sí que se pueda. De tal forma que en caso de producirse una modificación en alguna de ellas, se tenga la mínima repercusión posible en el resto de clases, potenciando la reutilización, y disminuyendo la dependencia entre las clases
a. Acoplamiento de Contenido: Cuando un módulo referencia directamente el contenido de otro módulo. (En lenguajes de alto nivel es muy raro)
b. Acoplamiento Común: Cuando dos módulos acceden (y afectan) a un mismo valor global.
c. Acoplamiento de Control: Cuando un módulo le envía a otro un elemento de control que determina la lógica de ejecución del mismo.
A. COHESIÓN
La cohesión mide el costo del cambio dentro de un elemento. Un elemento es cohesivo a medida que cambia el elemento entero cuando el sistema necesita cambiar.
Un elemento puede tener poca cohesión tanto por ser muy grande o muy pequeño. Un elemento muy pequeño, que resuelve sólo una parte del problema, va a necesitar estar acoplado a otros elementos para resolver las otras partes del problema. Si cambia la solución se va a necesitar cambiar todos los elementos. Un elemento que resuelve muchos problemas sólo va a necesitar cambiarse en parte. Esto es más riesgoso y más costoso que cambiar un elemento completo, porque primero se necesita averiguar qué parte del elemento debe cambiarse, y luego probar que las partes sin cambios del elemento realmente sigan sin cambios. Los elementos cohesivos, que se reemplazan en su totalidad, no tienen estos costos.
La estrategia de aislar los cambios es una forma de inducir la cohesión antes de hacer un cambio; por ejemplo, extraer la parte de un método que necesita cambiarse dentro de un método propio antes de hacer el cambio.
B. ACOPLAMIENTO
Dos elementos están acoplados en la medida en el que los cambios en uno tienden a necesitar cambios en el otro. Por ejemplo, la comunicación por red entre dos sistemas está acoplada respecto a cambios en el protocolo - si un sistema necesita cambiar el protocolo, el otro va a necesitar cambiar también. El acoplamiento entre los elementos es un conductor de cambios.
Empezaremos por el acoplamiento. El término "acoplamiento" hace alusión al grado de dependencia que tienen dos unidades de software. Tiempo atrás se utilizaba la palabra "módulo" o "subrutina" en lugar de unidad de software. Hoy en día, en opinión del que escribe, la palabra "módulo" es completamente inadecuada y obsoleta. Mejor utilizaremos "unidad de software", que es un concepto más amplio.
Bien... ¿Qué es una unidad de software? Pues simplemente cualquier pieza de software que realice algún cometido. Por ejemplo: una función, un método, una clase, una librería, una aplicación, un componente, etc.
Si hablamos de funciones, el acoplamiento nos da una idea de lo dependientes que son dos funciones entre sí. Es decir, en qué grado una función puede hacer su trabajo sin la otra. Si hablamos de librerías, el acoplamiento nos dará una idea de en qué medida el contenido de una librería puede hacer su trabajo sin la otra.
Cuando dos unidades de software son absolutamente independientes (cada una puede hacer su trabajo sin contar para nada con la otra), encontramos el grado más bajo de acoplamiento, y decimos que ambas unidades están totalmente desacopladas.
Nuestro objetivo al programar o diseñar debe ser el de tener un acoplamiento lo más bajo posible entre dos unidades de software cualesquiera. Por supuesto, es imposible lograr un desacoplamiento total entre las unidades. Sin embargo, manteniendo lo más bajo posible el acoplamiento lograremos que las distintas "piezas" de nuestro software funcionen sin depender demasiado unas de otras. Eso redunda en una mejora considerable en la detección y corrección de errores, en una mayor facilidad de mantenimiento y sobre todo, en la reutilización de esas "piezas" de software.
6. PRINCIPIO ABIERTO-CERRADO
Las entidades software deben estar abiertas para su extensión, pero cerradas para su modificación.
Bertrán Meyer
• Sistema funcionando (cerrado), pero ampliable (abierto).
• Conseguir cambios añadiendo nuevo código sin afectar al resto de elementos del diseño.
7. CLASE
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.
8. INSTANCIA
Bien, decíamos que una clase es como la definición de un objeto, pero no es el objeto en sí, del modo como una idea no es una cosa física (el ejemplo de la silla). Así que para sentarnos necesitaremos convertir esa idea en algo, en un objeto real; a ese objeto lo llamamos instancia.
En un mismo proyecto puedo tener una o más instancias de una misma clase sin problemas.
Cada vez que creamos una nueva instancia, ésta adquiere las propiedades, métodos y eventos de la clase a la que pertenece (es lo que permite la relación es un), sin embargo, cada instancia es independiente de las otras; esto nos da dos ventajas:
1. Si hago algún cambio en la clase, todas las instancias de esta clase se actualizarán automáticamente; esto nos permite hacer cambios sin tener que ir a cada una de las instancias (se aplica el mismo principio de herencia, aunque a un nivel diferente).
2. Al ser independientes de las otras instancias, puedo darles valores diferentes sin que afecten a las demás (como tener una silla negra, una roja, una más alta, etc.). Aunque comparten la misma estructura, pueden programarse individualmente, dando versatilidad y flexibilidad al código.
9. PASO DE MENSAJES
Mediante el denominado paso de mensajes, un objeto puede solicitar de otro objeto que realice una acción determinada o que modifique su estado. El paso de mensajes se suele implementar como llamadas a los métodos de otros objetos.
Desde el punto de vista de la programación estructurada, esto correspondería con la llamada a funciones.
10. ATRIBUTO
Los atributos son las características individuales que diferencian un objeto de otro y determinan su apariencia, estado u otras cualidades. Los atributos se guardan en variables denominadas de instancia, y cada objeto particular puede tener valores distintos para estas variables.
Las variables de instancia también denominados miembros dato, son declaradas en la clase pero sus valores son fijados y cambiados en el objeto.
Además de las variables de instancia hay variables de clase, las cuales se aplican a la clase y a todas sus instancias. Por ejemplo, el número de ruedas de un automóvil es el mismo cuatro, para todos los automóviles.
11. METODO
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 un atributo.
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.
12. CONSTRUCTOR
En una clase existe una función miembro muy particular llamada Constructor.
Un constructor es una función que debe tener el mismo nombre que la clase y no debe retornar ningún valor, (ni siquiera void), y se encarga de asignarle valores iniciales, (o simplemente inicializar), a los datos miembros.
En el ejemplo descubrirá que allí no hay ningún constructor definido, cuando ocurre esto el compilador de C++ crea en ejecución el constructor.
No obstante hubiera sido correcto haber definido un constructor que se encargara de, por ejemplo, inicializar con 0 los datos miembros.
Un constructor es invocado automáticamente cuando se crea la instancia, o sea que no hay llamarlo explícitamente desde el programa principal.
No hay comentarios:
Publicar un comentario