Metaobjeto - Metaobject

Na ciência da computação , um metaobjeto é um objeto que manipula, cria, descreve ou implementa objetos (incluindo ele mesmo). O objeto ao qual o metaobjeto pertence é chamado de objeto base. Algumas informações que um metaobjeto pode definir incluem o tipo do objeto base , interface , classe , métodos , atributos , árvore de análise , etc. Metaobjetos são exemplos do conceito de reflexão da ciência da computação , onde um sistema tem acesso (geralmente em tempo de execução) a seus própria estrutura interna. A reflexão permite que um sistema se reescreva essencialmente em tempo real, para alterar sua própria implementação à medida que é executada.

Protocolo de metaobjeto

Um protocolo de metaobjeto (MOP) fornece o vocabulário ( protocolo ) para acessar e manipular a estrutura e o comportamento de sistemas de objetos. As funções típicas de um protocolo de metaobjeto incluem:

  • Criar ou excluir uma nova classe
  • Crie uma nova propriedade ou método
  • Faz com que uma classe herde de uma classe diferente ("alterar a estrutura da classe")
  • Gerar ou alterar o código que define os métodos de uma classe

O protocolo de metaobjetos é contrário ao princípio aberto / fechado de Bertrand Meyer , que afirma que os sistemas de objetos de software devem ser abertos para extensão, mas fechados para modificação . Este princípio efetivamente estabelece uma distinção entre estender um objeto adicionando a ele e modificar um objeto redefinindo-o, propondo que a primeira é uma qualidade desejável ("os objetos devem ser extensíveis para atender aos requisitos de casos de uso futuros "), enquanto o o último é indesejável ("os objetos devem fornecer uma interface estável não sujeita a revisão resumida "). O protocolo de metaobjetos, ao contrário, expõe de forma transparente a composição interna de objetos e todo o sistema de objetos em termos do próprio sistema. Na prática, isso significa que os programadores podem usar objetos para se redefinir, possivelmente de maneiras bastante complexas.

Além disso, o protocolo de metaobjeto não é meramente uma interface para uma implementação "subjacente"; em vez disso, por meio do protocolo de metaobjeto, o sistema de objeto é implementado recursivamente em termos de um sistema de meta- objeto, que por si só é teoricamente implementado em termos de um sistema de meta- objeto, e assim por diante até um caso base arbitrário (um estado consistente do sistema de objeto ) é determinado, com o protocolo como tal sendo a relação funcional recursiva entre esses níveis de implementação.

Implementar sistemas de objetos de tal forma abre a possibilidade de um redesenho discricionário radical, fornecendo flexibilidade profunda, mas introduzindo questões de metaestabilidade possivelmente complexas ou difíceis de entender (por exemplo, o sistema de objetos não deve atualizar destrutivamente seu próprio protocolo de metaobjeto - seu self interno representação - mas a destrutividade potencial de algumas atualizações não é trivial de prever e pode ser difícil de raciocinar), dependendo da profundidade recursiva para a qual as modificações desejadas são propagadas. Por esse motivo, o protocolo de metaobjeto, quando presente em uma linguagem, costuma ser usado com moderação e para fins especializados, como software que transforma outro software ou a si mesmo de maneiras sofisticadas, por exemplo, em engenharia reversa.

Tempo de execução e tempo de compilação

Quando a compilação não está disponível em tempo de execução, há complicações adicionais para a implementação do protocolo de metaobjeto. Por exemplo, é possível alterar a hierarquia de tipo com esse protocolo, mas isso pode causar problemas para o código compilado com uma definição de modelo de classe alternativa. Alguns ambientes encontraram soluções inovadoras para isso, por exemplo, tratando de problemas de metaobjetos em tempo de compilação. Um bom exemplo disso é o OpenC ++ . O modelo orientado a objetos da Web Semântica é mais dinâmico do que a maioria dos sistemas de objetos padrão e é consistente com os protocolos de metaobjetos de tempo de execução. Por exemplo, no modelo da Web Semântica, espera-se que as classes mudem suas relações entre si e há um mecanismo de inferência especial conhecido como classificador que pode validar e analisar modelos de classe em evolução.

Uso

O primeiro protocolo de metaobjeto estava na linguagem de programação orientada a objetos Smalltalk desenvolvida no Xerox PARC . O Common Lisp Object System (CLOS) veio depois e foi influenciado pelo protocolo Smalltalk, bem como pelos estudos originais de Brian C. Smith sobre o 3-Lisp como uma torre infinita de avaliadores. O modelo CLOS, ao contrário do modelo Smalltalk, permite que uma classe tenha mais de uma superclasse ; isso levanta uma complexidade adicional em questões como a resolução da linhagem da hierarquia de classes em alguma instância de objeto. O CLOS também permite o despacho multimétodo dinâmico , que é tratado por meio de funções genéricas, em vez da passagem de mensagens como no despacho único de Smalltalk . O livro mais influente que descreve a semântica e a implementação do protocolo de metaobjeto em Common Lisp é The Art of the Metaobject Protocol, de Gregor Kiczales et al.

Os protocolos de metaobjetos também são amplamente usados ​​em aplicativos de engenharia de software. Em praticamente todos os CASE comerciais, reengenharia e Ambientes de Desenvolvimento Integrado, há alguma forma de protocolo de metaobjeto para representar e manipular os artefatos de design.

Um protocolo de metaobjeto é uma maneira de implementar a programação orientada a aspectos . Muitos dos primeiros fundadores de MOPs, incluindo Gregor Kiczales , desde então passaram a ser os principais defensores da programação orientada a aspectos. Kiczales et al. do PARC foram contratados para projetar AspectJ for Java , uma linguagem que não possui um protocolo de metaobjeto nativo.

Veja também

Referências

links externos