Entender el concepto de clases es un elemento basico cuando programamos, ya que en si, las clases constituyen la base de la organización estructural del codigo de programacion moderno.
Las clases nos permiten crear objetos que podremos reusar o no, pero que facilitaran la escalabilidad y eficiencia del codigo.
¿Por que?
Porque la clase es como el molde de un zapatero.
Es la base para crear un objeto, lo cual permitira organizar el codigo de una manera muy como en el mundo que nos rodea.
Digamos sin ser muy profundos que un zapato de caballero, tiene cualquiera que sea el modelo, varias partes comunes: tacon, puntera, plantilla, etc.
Entonces el molde será la clase, cada modelo será un objeto de esa clase y cada caracteristica un atributo.
De la clase zapato pueden crearse diferentes objetos que seran usados de diferentes formas, venderse, exhibirse, trasladarse, y para eso necesitará relacionarse con otras clases, como tienda, caja, etc.
De estas relaciones es que hablaré, por la necesidad de su comprension para crear una mejor aplicación.
Las clases pueden relacionarse asociandose, dependiendo una de otra o mediante herencia.
Asociación
Tomemos como ejemplo una base de camiones para transporte. La relación de asociación es aquella necesaria para que la estructura funcione.
Como la que hay entre un usuario_chofer y su camión, donde se relacionan en ambas direcciones, elusuario chofer posee un camión y ese camion pertenece a ese chofer.
Una relación parecida a esta pero de una sola dirección es la que se da entre la clase combustible y camión. Digamos que hay dos acciones que el camión realiza sobre el combustible en cada viaje: recibirlo y gastarlo por tanto es una relación unidireccional
Una expresion de esta relación seria algo asi
clase Camion { variable viaje; función constructor() { $viaje = new Combustible(); } funcion publica recibir() funcion publica gastar() } clase Combustible { }
Lo anterior intenta mostrar la estructura básica de una clase, no está escrito en ningún lenguaje específico aunque inspirado en php y python
Ahí vemos dos clases camión
y combustible
con una variable viajes
que crea un nuevo objeto de combustible
sobre el cual incidirá el objeto camión
del que se trate, con dos métodos recibir
y gastar
.
Hablemos de multiplicidad
Toda relación tiene multiplicidad doble, porque se ubica a cada lado de la relación y esta tiene un minimo y un maximo.
La mejor forma de explicarlo es entendiendo por ejemplo las relaciones entre las tablas de una base de datos del tipo relacional.
Los tipos son
1 indica que la multiplicidad a cada lado de la relación es de uno y solo uno
0..1 indica una multiplicidad de 0 o 1 y viene a ser el complemento de una relación de uno
* indica una relación de cero o varios ( presente en el lado extremo varios del tipo de relación de unos a varios
*..0 cero o varios
1..* uno o varios
La multiplicidad, define además que cuando la mínima es 0, la relación es opcional y si es mayor o igual que 1 se establece como una relación obligatoria.
Entonces nuestras tablas en una base de datos relacional tendrán una relación de:
uno a uno si a ambos lados de la relación existe un uno
de uno a muchos si a un lado hay un 1 y al otro *
de muchos a muchos si a cada lado hay un *
Y por supuesto sus inversos.
Y para analizar la obligatoriedad por ejemplo en una bd con dos tablas: viajes
y camiones
, podemos decir que un camión podrá tener o no viajes (opcional-> 0..*), pero un viaje pertenecerá si o si un camión (obligatoria->1..*)
Dependencia
Es el tipo de relación, que existe entre dos clases que se necesitan para que la estructura funcione, por ejemplo siguiendo en el área transporte:
no puede hacerse un viaje si no están al clases orden de viaje
y camión
.
Un modo de verlo es pensar en un objeto que solicita un recurso o un servicio y otro que lo brinda.
Herencia
Son relaciones que surge cuando una subclase hereda los atributos de una superclase. Un ejemplo práctico es pensar en familias de animales, digamos que tenemos una clase llamada Paquidermos.
Esta superclase entre otros atributos tiene:
tipo
, trompa(posee un método llamado añadirTrompa)
y cola = corta
De ella heredaran diferentes subfamilias, elefantes, rinocerontes, hipopótamos
, con características y comportamientos parecidos ( no sudan, piel gruesa, y grandes dimensiones
).
Sin embargo, las subfamilias(subclases)
, pueden incorporar características nuevas comunes a solo algunas, ejemplo hipopótamos
y rinocerontes
necesitan refrescarse constantemente.
Podemos seguir creando subclases y derivando. Por ejemplo de la clase elefante
, pueden heredar las subclases elefante africano
y elefante asiático
.
Mientras que del rinoceronte
heredaran 5 subclases: el de java
, el indio
, el negro
, el blanco
y el de Sumatra
Y del hipopotamo
heredaran: el hipopotamo común
y el hipopotamo pigmeo
.
Para estas subclases existirán atributos de con acceso de carácter privado
, de carácter protegido
y de carácter público
.
Expliquémoslo a través del la subclase elefante
:
Si en la superclase existe el atributo tipo
, para la elefante
será público
ya que puede acceder a el, tanto elefante como elefante africano
y elefante asiático
.
El atributo cola,
será privado, y no podrá acceder ninguna subclase, para todos la cola
tiene un valor “corta”
.
Y la variable trompa,
es protegida ya que solo podrá acceder la propia clase Paquidermo
y sus subclases mediante el método añadirTrompa
.
Otra propiedad de trabajar con clases es el encapsulamiento
Encapsulamiento
Es justo lo que hemos visto en la relaciones , o sea es el mecanismo que se emplea para organizar los datos y métodos de un objeto, limitando el acceso a ellos solo por el modo que se determine .
Por tanto al crear la clases y respetar estas relaciones estamos encapsulando, todo cuanto necesitamos en una entidad, o estructura, o dicho de otro modo en un objeto
Al encapsular podemos abstraer, o sea podemos al tener concentrados los componentes de un objeto, crear superclases que representan de la manera más abstracta posible los objetos que irán heredando de ellas.
Ser fácil entender entonces, que las formas de encapsular pueden ser :
- Estándar: Forma predeterminada según nos interese
- Abierto : Se puede acceder al atributo de la clase desde el exterior de la Clase
- Protegido : Solo es accesible desde la superclase y las subclases que heredan de ella,
- Semi cerrado : Solo es accesible desde la subclase heredada, para la subclase.
- Cerrado : Solo es accesible desde la superclase.
Relacionado con la herencia tenemos que entender el poliformismo
Poliformismo
No es más que capacidad que tienen los objetos de una clase para responder ante un mensaje en dependencia de los parámetros que utilicemos al invocarlos o llamarlos.
Creo que la forma más sencilla de mostrarlo es que llamemos desde cualquiera de las clases que derivan de Paquidermos
al atributo trompa
, podremos acceder a él mediante el mismo método añadirTrompa ()
.
En definitiva el uso de clases y su aprovechamiento permite controlar el comportamiento del usuario, evitando acciones indeseadas, además de que el medio mas efectivo para controlar y manejar la complejidad de las Clases , obligandolas a actuar como cajas negras, que dejan ver mediante una interfaz el comportamiento pero no los detalles internos.
Lo cual es una ventaja ya que ayuda al programador a separar la interfaz de una clase de su implementación.
De este modo es más fácil limitar el acceso a los datos y que solo se haga mediante las funciones que ponemos a su disposición, con las validaciones que consideremos necesarias.
Y listo, esto es todo.
Espero modestamente que este artículo, sirva de ayuda a alguien.
Gracias.
….un sueño es casi todo y más que nada, más que todo al soñarlo, casi nada después……