Pergunta

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?

Graças

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 mixins vendo 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 é.

Foi útil?

Solução

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 rubi ninja, 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 métodos carregar e salvar gratuitamente 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 fechar).

Outras dicas

Eles são geralmente 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 vão realmente ser implementada por 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 a <=> 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 definir um cada método, você tem suporte para todos os outros métodos relacionados, tais como coleta, injetar, selecione, 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.

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 para 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 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 multicoloridas ao chocolate polvilha volta bin na loja de sorvete. 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 você include um módulo em Ruby, ele chama Module#append_features naquele módulo, que adicionar uma cópia de métodos que do módulo à includer uma vez.

A 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 juggle era.

É possível que você pode modificar um módulo ruby ??'incluir' a agir mais como herança múltipla, modificando Module#append_features para manter uma lista de includers, e, em seguida, atualizá-los usando o callback method_added, mas isso seria uma grande mudança de padrão ruby, e poderia causar grandes problemas quando se trabalha com outros código. Você pode estar criando mais um método Module#inherit que chamou include e manipulados delegação também.

Como um exemplo do mundo real, Enumerable é incrível. Se você definir #each e incluem Enumerable em sua classe, em seguida, que lhe dá acesso a toda uma série de iteradores, sem a necessidade de código de todos e cada um.

Ele é largamente utilizado 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 mentiras, 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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top