Mixins vs traits

Réponses:

214
  1. Les mixins peuvent contenir des états, contrairement aux traits (traditionnels).
  2. Les mixins utilisent la "résolution implicite des conflits", les traits utilisent la "résolution explicite des conflits"
  3. Les mixins dépendent de la linéarisation, les traits sont aplatis.

Conférence sur les traits

ad 1. Dans mixins, vous pouvez définir des variables d'instance. Les traits ne permettent pas cela. L'état doit être fourni en composant la classe (= classe utilisant les traits)

ad 2. Il peut y avoir un conflit de nom. Deux mixins ( MAet MB) ou traits ( TAet 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 classe de composition C mixins MA, MB sont résolus implicitement.

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

Cela appellera foo():voiddeMA

D'autre part, 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 soulèvera des conflits (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 qui utilise le trait.

En d 'autres termes, peu importe si la classe se compose des Traits ou si le code des Traits est "copié - collé" dans la classe.

jk_
la source
5
Je sais que c'est une date passée d'un an, mais pour les futurs lecteurs, dans ruby, il utiliserait la méthode du dernier module qui a été mélangé, donc il appellerait foo () form MB
rik.vanmechelen
4
dans Scala les traits peuvent avoir des champs, cela implique-t-il qu'ils ne sont pas des traits «traditionnels»?
Sergio
4
Oui, ce ne sont pas des traits «traditionnels», ils sont appelés des traits «étatiques». La différence entre les traits avec état et les mixins sont les points 2 et 3.
jk_
7
Provisoire -1; la façon dont les termes «trait» et «mixin» sont utilisés dans la nature est très incohérente et au moins un des points ici est généralement faux. PHP et Wikipedia (et selon @Sergio, également Scala) ne sont pas d'accord avec vous sur le fait que les traits sont apatrides. Je ne trouve pas cette réponse utile car elle est composée d'assertions nues, et je ne suis pas certain que ce soit autre chose que la façon dont vous utilisez personnellement ces mots. Pour être convaincu du contraire, j'aurais besoin de voir de nombreux exemples de la façon dont les termes sont utilisés dans le monde réel (par exemple dans de vrais langages de programmation) pour étayer vos affirmations.
Mark Amery
3
@AykutKllic Linéarisation -> "Le compilateur résout la question de savoir ce qu'est super, sans ambiguïté." ( ibm.com/developerworks/library/j-jn8 )
ben
9

Ces pages expliquent la différence dans le langage de programmation D.

http://dlang.org/mixin.html

http://dlang.org/traits.html

Les mixins dans ce contexte sont du code généré à la volée, puis insérés à ce stade dans le code lors de la compilation. Très pratique pour les DSL simples.

Les traits sont des valeurs externes au moment de 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 traits ajoutent des données telles que des informations de type à la compilation.

Je ne sais pas grand-chose sur Ruby, mais j'espère que cela vous aidera un peu.

Aiden Bell
la source
41
Les mixins et les traits en D sont complètement différents de ce que les termes signifient en informatique en général. En D, les deux sont des primitives de préprocesseur pour la génération automatique de code. Dans d'autres langues, ce sont des mécanismes d'héritage. La décision de nommer en D est malheureuse.
tylerl