Quais são alguns bons exemplos de Mixins e ou traços?

votos
14

Eu estava lendo sobre Ruby, e aprendeu sobre o seu padrão de mixins, mas não conseguia pensar em muitos funcionalidade mixin útil (porque eu não estou acostumado a pensar dessa maneira mais provável). Então eu queria saber o que seriam bons exemplos de funcionalidade Mixin útil?

obrigado

Edit: Um pouco de fundo. Estou vindo de C ++ e outras linguagens objeto, mas a minha dúvida aqui é que Ruby diz que não é herdando mixins, mas eu continuo vendo mixins como herança múltipla, então eu temo que eu estou tentando classificá-los muito cedo na minha zona de conforto , e não realmente grok o que é um mixin é.

Publicado 10/12/2008 em 11:32
fonte usuário
Em outras línguas...                            


4 respostas

votos
12

Eles normalmente são usados para adicionar algum tipo de funcionalidade padrão para uma classe, sem ter de redefinir tudo. Você provavelmente pode pensar deles um pouco como interfaces em Java, mas em vez de apenas definir uma lista de métodos que precisam ser implementadas, muitos deles realmente vai ser implementado, incluindo o módulo.

Há alguns exemplos na biblioteca padrão:

Singleton - Um módulo que podem ser misturados em qualquer classe para torná-lo um singleton. O método de inicialização é feita privada, e um método de instância adicionado, o que garante que há sempre apenas uma instância dessa classe em sua aplicação.

Comparável - Se você incluir esse módulo em uma classe, definindo o método <=>, que compara a instância atual com outro objeto e diz que é maior, é suficiente para fornecer <, <=, ==,> =,>, e entre? métodos.

Enumerable - Ao misturar neste módulo, e definindo um cada método, você tem suporte para todos os outros métodos relacionados, tais como coleta, injetar, selecionar e rejeitar. Se ele também tem o método <=>, em seguida, ele irá também apoiar espécie, min e max.

DataMapper é também um exemplo interessante do que pode ser feito com uma simples instrução include, tendo uma classe padrão, e adicionando a capacidade de persistir para um armazenamento de dados.

Respondeu 10/12/2008 em 11:55
fonte usuário

votos
8

Bem, a exemplo de costume, eu acho que é Persistência

module Persistence
    def load sFileName
            puts "load code to read #{sFileName} contents into my_data"
    end
        def save sFileName
        puts "Uber code to persist #{@my_data} to #{sFileName}"
    end

end

class BrandNewClass
    include Persistence
    attr :my_data

        def data=(someData)
        @my_data = someData
    end
end

b = BrandNewClass.new
b.data = "My pwd"
b.save "MyFile.secret"
b.load "MyFile.secret"

Imagine que o módulo foi escrito por um ninja Ruby, que persiste o estado de sua classe para um arquivo.
Agora suponha que eu escrever uma nova classe marca, posso reutilizar a funcionalidade de persistência, misturando-o em dizendo include ModuleILike. Você pode até mesmo incluir módulos em tempo de execução. Recebo carregar e salvar métodos para livre por apenas misturando-o. Estes métodos são apenas como aqueles que você escreveu-se para a sua classe. Code / Comportamento / funcionalidade de reutilização sem herança!

Então, o que você está fazendo é incluindo métodos para a tabela de método para a sua classe (não literalmente correta, mas perto).

Respondeu 10/12/2008 em 12:02
fonte usuário

votos
3

Em Ruby, a razão que Mixins não são de múltipla herança é que a combinação de métodos mixin é uma coisa de uma vez. Este não seria um grande problema, a não ser que os módulos e classes de Ruby estão abertos à modificação. Isto significa que se você mixin um módulo para a sua classe, em seguida, adicionar um método para o módulo, o método não vai estar disponível para sua classe; onde se você fez isso na ordem inversa, seria.

É como pedir um sorvete de casquinha. Se você receber chocolate granulado e pedaços de caramelo como seus mixins, e ir embora com o seu cone, que tipo de cone de sorvete você tem não vai mudar se alguém acrescenta polvilha multicores ao bin de chocolate polvilha para trás na sorveteria. Sua classe, o cone de sorvete, não é modificado quando o módulo mixin, o bin de polvilha é. A próxima pessoa a usar esse módulo mixin irá ver as alterações.

Quando includeum módulo em Ruby, ele chama Module#append_featuresnaquele módulo, que adicionar uma cópia de métodos que do módulo à includer uma vez.

herança múltipla, como eu o entendo, é mais como delegação. Se sua classe não sabe como fazer algo, ele pede aos seus pais. Em um ambiente de classe aberta, os pais de uma classe pode ter sido modificado após a classe foi criada.

É como uma relação RL pai-filho. Sua mãe poderia ter aprendido a fazer malabarismos depois que você nasceu, mas se alguém lhe pede para fazer malabarismos e você pedir a ela para qualquer um: mostrar como (copiá-lo quando você precisar dele) ou fazê-lo para você (puro delegação), então ela vai ser capaz nesse ponto, mesmo que você foram criados antes de sua capacidade de fazer malabarismos foi.

É possível que você pode modificar um módulo ruby 'incluir' a agir mais como herança múltipla, modificando Module#append_featuresa manter uma lista de includers, e, em seguida, atualizá-los usando o method_addedretorno de chamada, mas isso seria uma grande mudança de padrão do Ruby, e pode causar questões importantes quando se trabalha com outros código. Você pode ser melhor criar um Module#inheritmétodo que chamou includee manipulados delegação também.

Quanto a um exemplo do mundo real, Enumerableé incrível. Se você definir #eache incluir Enumerablena sua classe, em seguida, que lhe dá acesso a toda uma série de iteradores, sem a necessidade de codificar todos e cada um.

Respondeu 10/12/2008 em 14:58
fonte usuário

votos
1

Ele é amplamente usado como se poderia usar a herança múltipla em C ++ ou interfaces de aplicação em Java / C #. Eu não tenho certeza de onde sua experiência reside, mas se você tiver feito essas coisas antes, mixins são como você fazê-las em Ruby. É uma forma sistematizada de injetar funcionalidade em classes.

Respondeu 10/12/2008 em 11:37
fonte usuário

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more