Tarta de Scala al estilo tradicional

Hoy toca hablar de cocina. Hoy vamos a hacer una bonita tarta. ¿Se me ha ido la olla con Master Chef?
No. Hoy toca hablar del cake-pattern.

t4ilmu

El cake-pattern es un patrón de diseño de inyección de dependencias. Nos permite establecer dependencias entre componentes. Es común necesitar un servicio o un repositorio para poder implementar otros. En estos casos, el cake pattern nos ayudará a establecer esta relación.

La base de este patrón de diseño es formar nuestro sistema a partir de varios componentes más pequeños. Es decir, vamos a formar nuestra tarta a partir de pequeñas porciones. Además, estableceremos relaciones entre dichas porciones.

Para ello, primero crearemos unos componentes abstractos mediante traits, de los que heredarán los componentes reales. De esta forma, nos aseguramos que todos los componentes que implementemos tengan la misma funcionalidad.

trait MyComponent {
  
  def service: MyService

  trait MyService {
    def saySomething: String
  }
}

En este caso tenemos un componente que engloba un servicio que contiene el método saySomething.

Ahora vamos a implementar el servicio. Para ello necesitamos llamar a un repositorio. Por lo tanto, debemos inyectar la dependencia con dicho repositorio. Pero como aún no sabemos que tipo de repositorio será (una base de datos implementada en mysql, una estructura en memoria, …), vamos a tener una dependencia con un repositorio abstracto. Más tarde, cuando creemos nuestro sistema (aka, nuestra tarta), decidiremos con qué tipo de repositorio vamos a trabajar.

trait MyRepository {

  def repo: MyRepoService {

    def getRandomExpression: String
  }
}

Para poder crear dependencias vamos a usar los self types. Los self types los usaremos en este caso para inyectar una dependencia con otro componente. Sin embargo, también pueden ser utilizados para hacer referencia a inners u outter classes. Don’t worry. Ya veremos estos conceptos más adelante. Por el momento, vamos a usar estos self types para crear restricciones en el mixin con el componente ya que si queremos tener un componente que herede de este trait, tendrá que heredar también de los traits que aparecen en su self type. Vamos a ver como queda:

trait MyComponentImpl extends MyComponent{
  self: MyRepository =>
  
  def service = new MyServiceImpl

  trait MyServiceImpl extends MyService {

    def saySomething: String = repo.getRandomExpression()
  
  }
}

Para finalizar, podemos crear nuestro sistema utilizando la versión implementada de nuestro componente, y la versión implementada de un repositorio. Una vez creado el sistema (la tarta), ya podemos hacer uso de su funcionalidad:

val system = new MyComponentImpl with MyRepositoryImpl

println(system.service.saySomething)

Et voila! Bon appetit!

Anuncios

One thought on “Tarta de Scala al estilo tradicional

Responder

Introduce tus datos o haz clic en un icono para iniciar sesión:

Logo de WordPress.com

Estás comentando usando tu cuenta de WordPress.com. Cerrar sesión / Cambiar )

Imagen de Twitter

Estás comentando usando tu cuenta de Twitter. Cerrar sesión / Cambiar )

Foto de Facebook

Estás comentando usando tu cuenta de Facebook. Cerrar sesión / Cambiar )

Google+ photo

Estás comentando usando tu cuenta de Google+. Cerrar sesión / Cambiar )

Conectando a %s