Mixins vs. Traços

Respostas:

214
  1. Mixins podem conter estado, características (tradicionais) não.
  2. Mixins usam "resolução implícita de conflitos", traços usam "resolução explícita de conflitos"
  3. Mixins depende da linearização, as características são achatadas.

Palestra sobre traços

anúncio 1. Nos mixins, você pode definir variáveis ​​de instância. Traços não permitem isso. O estado deve ser fornecido pela composição da classe (= classe usando os traços)

anúncio 2. Pode haver um conflito de nome. Dois mixins ( MAe MB) ou traços ( TAe TB) definem método com a mesma definição 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'
    }
}

Em mixins, os conflitos na classe de composição C mixins MA, MB são resolvidos implicitamente.

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

Isso ligará foo():voiddeMA

Por outro lado, ao usar Traits, a composição da classe precisa resolver conflitos.

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

Este código irá gerar conflito (duas definições de foo():void).

ad 3. A semântica de um método não depende de ser definida em uma característica ou em uma classe que a usa.

Em outras palavras, não importa se a classe consiste nos traços ou se o código de traços é "copiado e colado" na classe.

jk_
fonte
5
Eu sei que é um ano passado data, mas para futuros leitores, em Ruby seria usar o formulário método o último módulo que foi misturado, por isso seria chamar foo () forma MB
rik.vanmechelen
4
no Scala, os traços podem ter campos, isso implica que eles não são traços "tradicionais"?
Sergio Sergio
4
Sim, estes não são "tradicionais", são chamados de características "statefull". Diferença entre traços statefull e mixins são pontos 2 e 3.
jk_
7
Tentativa -1; a maneira como os termos 'característica' e 'mixin' são usados ​​na natureza é altamente inconsistente e pelo menos um dos pontos aqui está quase totalmente errado. PHP e Wikipedia (e de acordo com @Sergio, também Scala) discordam de você sobre características que não têm estado. Não acho essa resposta útil porque é composta de afirmações simples e não está claro para mim que isso seja algo mais do que como você pessoalmente usa essas palavras. Para me convencer do contrário, eu precisaria ver muitos exemplos de como os termos são usados ​​no mundo real (por exemplo, em linguagens de programação reais) para fazer backup de suas reivindicações.
Mark Amery
3
@AykutKllic Linearization -> "O compilador resolve a questão do que é super, sem ambiguidade." ( ibm.com/developerworks/library/j-jn8 )
ben
9

Estas páginas explicam a diferença na linguagem de programação D.

http://dlang.org/mixin.html

http://dlang.org/traits.html

Os mixins nesse contexto são códigos gerados em tempo real e, em seguida, inseridos nesse ponto no código durante a compilação. Bastante útil para DSLs simples.

Traços são valores externos em tempo de compilação (em vez de código gerado a partir de uma fonte externa). A diferença é sutil. Os mixins adicionam lógica, os traços adicionam dados como informações do tipo em tempo de compilação.

Não sei muito sobre Ruby, mas espero que isso ajude um pouco.

Aiden Bell
fonte
41
Mixins e Traits em D são completamente diferentes do que os termos significam em Ciência da Computação em geral. Em D, ambos são primitivos do pré-processador para geração automática de código. Em outros idiomas, eles são mecanismos de herança. A decisão de nomeação em D é lamentável.
tylerl