Comunidad de diseño web y desarrollo en internet online

POO: Dependencia de clases y Polimorfismo

La dependencia de clases es un concepto de la programación orientada a objetos que nos indica la relación existente entre dos clases. Como su nombre indica nos está diciendo que una clase depende de otra para realizar su funcionamiento.

Cuando trabajamos con clases es una buena práctica que una clase realice una única función. De manera que las clases que deban realizar funciones complejas estarán formadas a partir de una asociación de diversas pequeñas clases en las que delegará cada funcionalidad en concreto.

Este sería un ejemplo simple de una relación de asociación y de delegación entre clases:

Código :

package 
{
   public class Foro
   {
      private var _moderador:Zguillez;

      public function Foro()
      {
         _moderador = new Zguillez();
      }
      public function moderar():void
      {
         _moderador.moderar();
      }
   }
}


Aqui vemos como la clase "Foro" está delegando toda la funcionalidad del método "moderar" al objeto de clase "Zguillez", haciendo de esta manera que toda la implementación esté en esa clase dejando la clase principal más limpia y ordenada. Esto nos permite una mayor reutilización de nuestras clases.

El problema que nos encontramos aquí es que se ha creado una relación de dependencia muy grande entre estas dos clases. La clase "Foro" tiene una referencia directa a la clase "Zguillez" y necesita estrictamente de esa clase para funcionar.

De manera que si tuviésemos (por requisitos de la aplicación o por reutilización del código) que cambiar la implementación de la función "moderar" tendríamos que reescribir la la clase "Zguillez" para cambiar su implementación concreta o reescribir la clase "Foro" para delegar esa función a la clase "Zah" (por ejemplo). Con lo que hace estas clases poco reutilizables.

Polimorfismo


Esta dependencia la podemos romper gracias al Polimorfismo de las clases. El polimorfismo es la propiedad que tienen las clases de ocultar la estructura interna en una jerarquía de clases, implementando de manera diferente un mismo método. El polimorfismo nos permite que una identificación se refiera a diferentes entidades.

En este caso haremos que "moderador" se pueda referir tanto a "Zguillez" como a "Zah". Este polimorfismo lo podemos conseguir gracias a la herencia de clases o a la implementación de una Interface.

Definiremos una Interface que contendrá las funciones que estamos delegando a la clase asociada. En este caso sería así:

Código :

package 
{
   public interface IModerador
   {
      function moderar():void;
   }
}


Ahora asociaremos el objeto a la Interface en lugar de a una clase en concreto:

Código :

private var _moderador:IModerador;


Tendremos que hacer que tanto la clase "Zguillez" como la clase "Zah" implementen la Interface "IModerador".

Código :

public class Zguillez implements IModerador

Código :

public class Zah implements IModerador


De manera que ahora podemos asociar cualquiera de las dos clases a la propiedad "moderador".

Código :

var moderador:IModerador = new Zguillez();
// o var moderador:IModerador = new Zah();


Gracias al polimorfismo hemos ganado en dinamismo y reutilizabilidad, ya que podemos hacer que nuestra aplicación la "modere" Zguillez o Zah según nos interese.

Pero en este punto aun no nos hemos liberado de la dependencia de clases, ya que la clase que realiza la delegación está escrita en la implementación de la clase. Con lo que si quisiésemos cambiar la clase en la que delegamos tendríamos que reescribir la clase para colocar la otra.

Inyección de dependencias


Esto lo solucionamos con lo que se llama "Inyección de dependencias", que consiste en insertar los objetos a la clase en lugar de que sea la clase la que cree el objeto.

Haremos que la clase "Foro" no genere directamente el objeto que realizará la delegación sino que ese objeto le venga inyectado.

Código :

package 
{
   public class Foro
   {
      private var _moderador:IModerador;

      public function Foro()
      {
      }
      public function set moderador(m:IModerador):void
      {
         _moderador = m;
      }
      public function moderar():void
      {
         _moderador.moderar();
      }
   }
}


Para inyectarle la dependencia utilizaremos el setter.

Código :

var foro:Foro = new Foro();
var moderador:IModerador = new Zguillez();
foro.moderador = moderador;
foro.moderar();


De esta manera hemos conseguido que la clase "Foro" sea totalmente independiente de las clases que vayan a realizar la delegación haciendo el sistema totalmente reutilizable sin tener que realizar cambios en las clases existentes.

¿Sabes SQL? ¿No-SQL? Aprende MySQL, PostgreSQL, MongoDB, Redis y más con el Curso Profesional de Bases de Datos que empieza el martes, en vivo.

Publica tu comentario

o puedes...

¿Estás registrado en Cristalab y quieres
publicar tu URL y avatar?

¿No estás registrado aún pero quieres hacerlo antes de publicar tu comentario?

Registrate