Mixins vs. Rasgos

Respuestas:

214
  1. Los mixins pueden contener rasgos estatales, (tradicionales) no.
  2. Los mixins usan "resolución implícita de conflictos", los rasgos usan "resolución explícita de conflictos"
  3. Mixins depende de la linealización, los rasgos son aplanados.

Conferencia sobre rasgos

anuncio 1. En mixins puede definir variables de instancia. Los rasgos no permiten esto. El estado debe ser proporcionado componiendo la clase (= clase usando los rasgos)

anuncio 2. Puede haber un conflicto de nombres. Dos mixins ( MAy MB) o rasgos ( TAy TB) definen el método con la misma definición foo():void.

Mixin MA {
    foo():void {
        print 'hello'
    }
}

Mixin MB {
    foo():void {
        print 'bye'
    }
}

Trait TA {
    foo():void {
        print 'hello'
    }
}

Trait TB {
    foo():void {
        print 'bye'
    }
}

En mixins, los conflictos en la clase de composición C mixins MA, MB se resuelven implícitamente.

Class C mixins MA, MB {
    bar():void {
        foo();
    }
}

Esto llamará foo():voiddesdeMA

Por otro lado, al usar Rasgos, la clase de composición tiene que resolver conflictos.

Class C mixins TA, TB {
    bar():void {
        foo();
    }
}

Este código generará conflicto (dos definiciones de foo():void).

ad 3. La semántica de un método no depende de si está definido en un rasgo o en una clase que usa el rasgo.

En otras palabras, no importa si la clase consiste en los Rasgos o si el código de los Rasgos está "copiado-pegado" en la clase.

jk_
fuente
55
Sé que es una fecha pasada, pero para futuros lectores, en ruby ​​usaría el método del último módulo que se mezcló, por lo que llamaría foo () form MB
rik.vanmechelen
44
en Scala los rasgos pueden tener campos, esto implica que no son rasgos "tradicionales"?
Sergio
44
Sí, estos no son "tradicionales", se llaman rasgos "estatales". La diferencia entre los rasgos con estado y los mixins son los puntos 2 y 3.
jk_
77
Tentativo -1; la forma en que se usan los términos 'rasgo' y 'mezcla' en la naturaleza es muy inconsistente y al menos uno de los puntos aquí es mayormente incorrecto. PHP y Wikipedia (y según @Sergio, también Scala) no están de acuerdo con usted acerca de los rasgos que no tienen estado. No encuentro esta respuesta útil porque está hecha de afirmaciones simples, y para mí no está claro que esto sea algo más que cómo usas personalmente estas palabras. Para convencerme de lo contrario, necesitaría ver muchos ejemplos de cómo se usan los términos en el mundo real (por ejemplo, en lenguajes de programación reales) para respaldar sus afirmaciones.
Mark Amery
3
@AykutKllic Linearization -> "El compilador resuelve la pregunta de qué es súper, sin ambigüedad". ( ibm.com/developerworks/library/j-jn8 )
ben
9

Estas páginas explican la diferencia en el lenguaje de programación D.

http://dlang.org/mixin.html

http://dlang.org/traits.html

Los mixins en este contexto son códigos generados sobre la marcha y luego insertados en ese punto del código durante la compilación. Muy útil para DSL simples.

Los rasgos son valores externos en tiempo de compilación (en lugar de código generado desde una fuente externa). La diferencia es sutil. Los mixins agregan lógica, los rasgos agregan datos como información de tipo de tiempo de compilación.

No sé mucho sobre Ruby, pero espero que esto ayude un poco.

Aiden Bell
fuente
41
Mixins y Traits en D son completamente diferentes de lo que significan los términos en informática en general. En D, ambos son primitivas de preprocesador para la generación automática de código. En otros idiomas, son mecanismos de herencia. La decisión de nombrar en D es desafortunada.
tylerl