172 votes

Mixins et Traits

Quelle est la différence entre les Mixins et les Traits ?

Selon Wikipedia Les modules Ruby sont en quelque sorte des traits de caractère. Comment cela se passe-t-il ?

236voto

jk_ Points 1737
  1. Les mixins peuvent contenir de l'état, ce qui n'est pas le cas des traits (traditionnels).
  2. Les mixins utilisent la "résolution implicite des conflits", les traits utilisent la "résolution explicite des conflits"
  3. Mixins dépend de la linéarisation, les traits sont aplatis.

Exposé sur les traits de caractère

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

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

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

Ceci appellera foo():void de MA

En revanche, lors de l'utilisation des Traits, la classe de composition doit résoudre les conflits.

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

Ce code soulèvera 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 qui utilise le trait.

En d'autres termes, il importe peu que la classe soit constituée des traits ou que le code des traits soit "copié-collé" dans la classe.

9voto

Aiden Bell Points 19856

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

http://dlang.org/mixin.html

http://dlang.org/traits.html

Dans ce contexte, les mixins sont du code généré à la volée, puis inséré à cet endroit du code lors de la compilation. C'est très pratique pour les DSL simples.

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X