É macaco patching / class-reabrir realmente um exemplo de reflexão?
-
23-08-2019 - |
Pergunta
Desculpas para a natureza recursiva desta questão, mas o escolhido resposta a uma pergunta sobre SO me fez questionar minha compreensão de reflexão.
Eu pensei reflexão foi principalmente sobre como consultar os acontecimentos internos de um programa enquanto ele está funcionando. O exemplo dado nesta resposta remendos classe Integer built-in de Ruby.
- Não é este mais como sobrecarga de funções / herança ao invés de modificação tempo de execução?
- É classe reabertura realmente um exemplo de reflexão?
Solução
A reflexão pode ser usado para implementar a ligação tardia.
ligação tardia pode ser usado para implementar macaco patching.
Monkey patch pode ser usado para alcançar o tipo de estilo de codificação mostrado nessa resposta.
Mas há outras maneiras de implementar tais características que não exigem patching macaco, ou reflexão. Heck, uma boa macro pré-compilador poderia chegar perto.
Então, tecnicamente correta, mas não (IMHO) o maior exemplo.
Outras dicas
Com o risco de aumentar o nível de recursividade, eu gostaria de responder, embora você está fazendo referência a minha resposta naquele link.
O mal-entendido é fácil de fazer por causa da nossa compreensão intuitiva de reflexão como referindo-se olhando para dentro. E isso é certamente um aspecto importante de reflexão na programação também - em Ruby, por exemplo, temos métodos como ocorrência_de para permitir que objetos de fazer perguntas sobre si mesmo em tempo de execução.
Mas dê uma olhada a definição wikipedia de reflexão :
reflexão é o processo pelo qual um programa de computador pode observar e Modificar sua própria estrutura e comportamento.
Como você pode ver, a reflexão é mais do que apenas auto-inspeção em tempo de execução. É também a capacidade de mudança de comportamento em tempo de execução. Reabertura de classe também é referido como "patching macaco". Você pode ler mais sobre isso aqui .
Um patch macaco é uma forma de alargar ou alterar o código de tempo de execução de linguagens dinâmicas, sem alterar o código fonte original.
Este processo também é conhecido como: - patching Guerrilla - Estendendo as classes tenham sido previamente declarados - aulas Reabertura - Funk Dinâmico - Sequestro - perfuração Duck - Método Swizzling