En java world (más precisamente si no tiene herencia múltiple/mixins) la regla de oro es bastante simple: "Favorecer la composición de objetos sobre la herencia de clase".Mixins vs composición en scala
Me gustaría saber si/cómo se cambia si también se consideran mixinas, especialmente en scala?
¿Las mezclas se consideran una forma de herencia múltiple o más composición de clase?
¿Existe también una pauta "Favorecer la composición del objeto sobre la composición de la clase" (o al revés)?
He visto algunos ejemplos cuando las personas usan (o abusan) mixins cuando la composición de objetos también puede hacer el trabajo y no siempre estoy seguro de cuál es mejor. Me parece que se puede lograr cosas muy similares con ellos, pero hay algunas diferencias también, algunos ejemplos:
- visibilidad - con mixins todo se convierte en parte de la API pública, lo cual no es el caso de la composición.
- nivel de detalle - en la mayoría de los casos mixins son menos detallado y un poco más fácil de usar, pero no es siempre el caso (por ejemplo, si también está usando tipos de auto en jerarquías complejas)
sé la respuesta corta es " Depende ", pero probablemente haya alguna situación típica cuando esto o aquello sea mejor.
Algunos ejemplos de directrices que pudiera surgir con el hasta ahora (suponiendo que tengo dos rasgos A y B y A desea utilizar algunos métodos de B):
- Si desea ampliar la API de A con los métodos de B luego mixins, de lo contrario composición. Pero no ayuda si la clase/instancia que estoy creando no es parte de una API pública.
- Si desea utilizar algunos patrones que necesitan mixins (por ejemplo, Stackable Trait Pattern), entonces es una decisión fácil.
- Si tiene dependencias circulares, las mezclas con tipos propios pueden ayudar. (Intento evitar esta situación, pero no siempre es fácil)
- Si quiere algunas decisiones dinámicas, en tiempo de ejecución, cómo hacer la composición y luego la composición del objeto.
En muchos casos mixins parece ser más fácil (y/o menos detallado), pero estoy bastante seguro de que también tienen algunos errores, como la "clase de Dios" y otros descritos en dos artículos Artima: part 1, part 2 (Por cierto, me parece que la mayoría de los otros problemas no son relevantes/no tan graves para scala).
¿Tiene más consejos como estos?
¿Cuál es el significado de la construcción 'this => Logging'? No compila – HRJ
Es una anotación de self-type, que siempre olvido la sintaxis de. Editado En este caso, significa que cualquier objeto que extienda MyService también debe extenderse. –