Quelle est la différence entre Mixins et Traits?
Selon Wikipedia , les modules Ruby sont en quelque sorte des traits similaires. Comment?
Conférence sur les traits
ad 1. Dans mixins, vous pouvez définir des variables d’instance. Les traits ne le permettent pas. L’état doit être fourni en composant la classe (= classe utilisant les traits)
ad 2. Il peut y avoir le conflit de nom. Deux mixins ( MA
et MB
) ou traits ( TA
et TB
) définissent la méthode avec la même définition 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' } }
Dans les mixins, les conflits dans la composition des C mixins MA, MB
classe C mixins MA, MB
sont résolus implicitement.
Class C mixins MA, MB { bar():void { foo(); } }
Cela va appeler foo():void
de MA
Par contre, lors de l’utilisation de Traits, la classe de composition doit résoudre les conflits.
Class C mixins TA, TB { bar():void { foo(); } }
Ce code déclenchera un conflit (deux définitions de foo():void
).
ad 3. La sémantique d’une méthode ne dépend pas du fait qu’elle soit définie dans un trait ou dans une classe utilisant le trait.
En d’autres termes, peu importe que la classe soit composée des Traits ou que le code Traits soit “copié-collé” dans la classe.
Ces pages expliquent la différence dans le langage de programmation D.
Les mixins dans ce contexte sont des codes générés à la volée, puis insérés à ce moment dans le code lors de la compilation. Très pratique pour les DSL simples.
Les caractères sont des valeurs externes à la compilation (plutôt que du code généré à partir d’une source externe). La différence est subtile. Les mixins ajoutent de la logique, les caractéristiques ajoutent des données telles que les informations de type à la compilation.
Je ne sais pas grand chose sur Ruby, mais j’espère que cela aide quelque peu.