De rebote llego a la web del proyecto Re-motion (un framework DDD) y veo que, entre otras cosas, incluye una librería para crear mixins.
Aunque en otras plataformas parece ser algo bastante frecuente, dentro de la comunidad .NET en general, y de C# en partircular, no parece que el uso de mixins esté muy extendido, aunque hay varias librerías bastante buenas.
¿Qué es un mixin?
La página de la wikipedia sobre mixins, define un mixin de la siguiente manera:
En lenguajes de programación orientada a objetos, un mixin es una clase que ofrece cierta funcionalidad para ser heredada por una subclase, pero no está ideada para ser autónoma. Heredar de un mixin no es una forma de especialización sino más bien un medio de obtener funcionalidad. Una subclase puede incluso escoger heredar gran parte o el total de su funcionalidad heredando de uno o más mixins mediante herencia múltiple.
La idea es tener pequeños bloques de funcionalidad que se pueden añadir a otras clases para dotarlas de esa funcionalidad. En C# (y en OOP) hay dos formas habituales de reutilizar lógica:
- Herencia: todo el mundo la conoce. Es casi lo primero que se enseña sobre programación orientada a objetos y supongo que por eso casi todo el mundo la usa mal :-). Debería modelar una relación es-un entre la clase derivada y la clase base.
- Composición: igual de famosa que su amiga la herencia. La relación que modela es un tiene-un y, en general, la composición debe preferirse a la herencia.
Si ya existen estas opciones para reutilizar lógica, ¿qué aportan los mixins? Los mixins son independientes de la clase a la que se añaden. Independientes de verdad:
- Un mixin puede no conocer la o las clases a las que se va a añadir.
- Las clases a las que se añaden los mixins no necesitan saber si van a recibir algún mixin, ni qué tipo de mixin van a recibir.
Esta independencia permite una gran flexibilidad a la hora de extender la funcionalidad de aplicaciones que no están diseñadas desde el principio para ello. Utilizando mixins es posible añadir comportamiento a una clase ya existente, usarlos para implementar un interface, o incluso sobreescribir el comportamiento original de la clase.
¿Y ahora qué?
Esto acaba de empezar. En próximos posts pondré ejemplos concretos de uso de mixins y probaremos las alternativas que existen para generarlos en C#.
Pingback: Mixins en C# – Un ejemplo: Memento | Koalite's blog
Pingback: Mixins en Javascript « Koalite's blog
Pingback: Approval Tests: Sí pero… « Koalite's blog