Mixin vs. Tratti


Risposte:


214
  1. I mixin possono contenere stati, i tratti (tradizionali) no.
  2. I mixin usano la "risoluzione implicita dei conflitti", i tratti usano la "risoluzione esplicita dei conflitti"
  3. Le mixine dipendono dalla linearizzazione, i tratti sono appiattiti.

Conferenza sui tratti

annuncio 1. Nei mixin è possibile definire le variabili di istanza. I tratti non lo consentono. Lo stato deve essere fornito componendo class (= class usando i tratti)

annuncio 2. Potrebbe esserci un conflitto di nomi. Due mixin ( MAe MB) o tratti ( TAe TB) definiscono il metodo con la stessa definizione 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'
    }
}

Nei mixin i conflitti nella classe di composizione C mixins MA, MB vengono risolti implicitamente.

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

Questo chiamerà foo():voiddaMA

D'altra parte, mentre si usano i tratti, la composizione della classe deve risolvere i conflitti.

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

Questo codice genererà conflitti (due definizioni di foo():void).

ad 3. La semantica di un metodo non dipende dal fatto che sia definita in un tratto o in una classe che utilizza il tratto.

In altre parole, non importa se la classe è composta da Traits o il codice Traits viene "copiato e incollato" nella classe.


5
So che è una data di un anno, ma per i futuri lettori, in ruby ​​userebbe il metodo dall'ultimo modulo che è stato mixato, quindi chiamerebbe foo () da MB
rik.vanmechelen,

4
in Scala i tratti possono avere campi, questo implica che non sono tratti "tradizionali"?
Sergio,

4
Sì, questi non sono "tradizionali", sono chiamati tratti "pieni di stato". La differenza tra i tratti di stato e i mixin sono i punti 2 e 3.
jk_

7
Tentativo -1; il modo in cui i termini "tratto" e "mixin" sono utilizzati in natura è altamente incoerente e almeno uno dei punti qui è per lo più sbagliato. PHP e Wikipedia (e secondo @Sergio, anche Scala) non sono d'accordo con te sul fatto che i tratti siano apolidi. Non trovo utile questa risposta perché è fatta di asserzioni nulle, e non mi è chiaro che questo sia qualcosa di più di come usi personalmente queste parole. Per essere convinto altrimenti, avrei bisogno di vedere molti esempi di come i termini vengono utilizzati nel mondo reale (ad esempio nei linguaggi di programmazione reali) per sostenere le tue affermazioni.
Mark Amery,

3
@AykutKllic Linearization -> "Il compilatore risolve la domanda su cosa sia super, senza ambiguità." ( ibm.com/developerworks/library/j-jn8 )
ben

9

Queste pagine spiegano la differenza nel linguaggio di programmazione D.

http://dlang.org/mixin.html

http://dlang.org/traits.html

I mixin in questo contesto sono codici generati al volo e quindi inseriti in quel punto nel codice durante la compilazione. Abbastanza utile per semplici DSL.

I tratti sono valori esterni in fase di compilazione (piuttosto che codice generato da una fonte esterna). La differenza è sottile. I mixin aggiungono logica, i tratti aggiungono dati come informazioni sul tipo di tempo di compilazione.

Non so molto di Ruby, ma spero che questo aiuti in qualche modo.


41
Mixin e tratti in D sono completamente diversi da ciò che i termini significano in Informatica in generale. In D, entrambi sono primitivi del preprocessore per la generazione automatica del codice. In altre lingue, sono meccanismi di ereditarietà. La decisione di nominare in D è sfortunata.
Tylerl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.