# Transformações de modelos

No desenvolvimento orientado a modelos de software, uma transformação de modelos consiste na aplicação de um conjunto de regras de transformação sobre um ou mais modelos iniciais (modelos fontes) de modo a produzir um ou mais modelos finais (modelos alvos). Neste contexto, um modelo é definido como qualquer artefato relacionado ao desenvolvimento ou execução de um dado software. A definição e o uso de transformações automáticas de modelos busca tornar mais eficiente o desenvolvimento de um software, bem como sua manutenção e atualização, evitando erros e mantendo a consistência entre os diversos artefatos relacionados de maneira facilitada.

## Visão geral
### Modelos

No desenvolvimento de software, um modelo consiste de um conjunto coerente de declarações formais (ou semi-formais) que representam características de interesse presentes em um determinado sistema. Um modelo captura os aspectos mais importantes sobre a estrutura e o comportamento de um sistema, abstraindo detalhes menos relevantes, de maneira a facilitar a compreensão e análise deste sistema. Estas características, aliadas ao baixo custo da construção e modificação de um modelo frente ao custo de desenvolvimento e alteração de um sistema completo, tornam o uso de modelos um ferramentas importante de especificação e raciocínio nas fases iniciais da engenharia de um software. Adicionalmente, os modelos utilizados durante o desenvolvimento podem ser reutilizados posteriormente como documentação do software implementado, facilitando sua manutenção. Exemplos de modelos tradicionalmente utilizados durante o desenvolvimento de software são diagramas UML e fluxogramas.
Em um processo de desenvolvimento orientado a modelos, um modelo é definido de maneira mais ampla. Neste contexto, um modelo consiste de um artefato (estruturado) qualquer relacionado ao desenvolvimento ou execução de um dado software, de maneira que, além dos modelos tradicionais como os diagramas UML, também são vistos como modelos outros artefatos, tais como a documentação do sistema, seu código fonte e arquivos de configuração. Em um processo de desenvolvimento orientado a modelos, almeja-se que esses artefatos sejam gerados automaticamente a partir dos modelos iniciais, de modo a reduzir o esforço de desenvolvimento e manter a consistência entre modelos prescritivos, código e documentação. Neste contexto, a definição e o uso de transformações automáticas de modelos têm papel crucial.

### Metamodelos

As declarações presentes em um modelo podem ser expressas informalmente, usando uma linguagem natural, ou formalmente, usando uma linguagem formal ou um formalismo lógico-matemático. Neste sentido, a linguagem utilizada para representar um modelo $M_{1}$ pode ser definida formamente por outro modelo $M_{2}$. Neste sentido, $M_{2}$ representa o metamodelo do modelo $M_{1}$ e elementos do modelo $M_{1}$ podem ser intepretados segundo a definição desses elementos em $M_{2}$. Exemplos de linguagens de modelagens definidas como metamodelos (semi) formais são a UML, o CWM e o BPMN.
De forma análoga, os elementos do metamodelo $M_{2}$ podem ser definidos por um modelo $M_{3}$. Neste sentido, $M_{3}$ representa o metamodelo de $M_{2}$ e o meta-metamodelo de $M_{1}$. O uso de diferentes camadas de metamodelagem apresenta vantagens para a interpretação e manipulação dos modelos criados, de modo que também facilita a definição de transformações desses modelos. Exemplos de meta-metamodelos são o MOF, utilizado para definir as linguagems UML e CWM, e o Ecore, utlizado para o suporte ao desenvolvimento orientado a modelos no ambiente de desenvolvimento Eclipse.

### Transformação de modelos

Uma transformação de modelos consiste na aplicação de uma operação sobre um ou mais modelos iniciais (modelos fontes) de modo a produzir um ou mais modelos finais (modelos alvos) consistentes. A definição de uma transformação de modelos é geralmente realizada sob a forma de um conjunto de regras de transformação. Uma regra de transformação descreve como um ou mais elementos dos modelos iniciais são mapeados para elementos dos modelos finais, de modo a produzir esses elementos durante a aplicação dessa regra.
Uma transformação de modelos torna-se mais útil se definida em relação aos metamodelos dos modelos envolvidos. Neste sentido, sendo $M$ e $N$ metamodelos, uma transformação de modelos pode ser vista como uma função $T$ tal que $T:M\rightarrow N$. Essa definição torna possível que uma mesma transformação seja aplicada a quaisquer modelos $m$, instanciados a partir do metamodelo $M$, de maneira a produzir um modelo $n$ consistente representado por meio do metamodelo $N$.
Em uma transformação de modelos, os modelos iniciais e finais podem ser representados em um mesmo metamodelo ($M=N$) ou em metamodelos diferentes ($M\neq N$ ). Porém, a definição de uma transformação de modelos demanda um conhecimento claro da sintaxe e semântica dos (meta-) modelos envovidos na transformação, bem como um suporte tecnológico adequado para a manipulação dos modelos fontes e alvos. Neste sentido, a definição de uma transformação de modelos em relação aos metamodelos envolvidos é facilitada se todos os metamodelos envolvidos são definidos utilizando um mesmo meta-metamodelo.

## Abordagens para a definição de transformações de modelos

Algumas abordagens arquiteturais são utilizadas para a definição de transformações de modelos. Três dessas abordagens são a manipulação direta dos modelos, o uso de representações intermediárias e o suporte de uma linguagem de representação.

### Manipulação direta dos modelos

Na manipulação direta dos modelos, a representação do modelo é acessada e manipulada por meio de [Auxiliary Programmer Inferfaces|APIs] procedurais e uma linguagem de programação de uso geral, como Java ou C#. Uma vantagem dessa abordagem é que pouco treinamento extra é necessário para um desenvolvedor de software definir a uma transformação simples em uma linguagem que já utilize.
Por outro lado, uma linguagem de propósito geral geralmente não provê abstrações adequadas para a especificação de transformações de modelos em alto nível de abstração. Adicionalmente, o desenvolvedor da transformação precisa conhecer detalhes da representação interna de todos os modelos envolvidos. Desse modo, transformações mais complexas podem ser difíceis de serem definidas nessa abordagem, bem como apresentar dificuldades para a compreensão e manutenção.

### Uso de representações intermediárias

Em uma abordagem que utiliza representações intermediárias, os modelos fontes são primeiramente exportados para uma linguagem de representação intermediária mais facilmente tratável, como o XML ou JSON. É esta representação intermediária dos modelos fontes que é manipulada durante a transformação em si, de maneira a produzir uma representação intermediária dos modelos alvos na mesma linguagem de representação.
Neste sentido, uma transformação com uso de representações intermediárias pode ser dividida em três fases: a transformação dos modelos fontes para a representação intermediária, a transformação da representação intermediária do modelo fonte em uma representação intermediária do modelo alvo e, por fim, a transformação da representação intermediária do modelo alvo na representação final do modelo alvo. Dessa maneira, a complexidade relacionada à manipulação das representações internas dos modelos fontes e alvo é desacoplada da complexidade relacionada à definição da transformação em si.

### Suporte de linguagens de transformação

Uma linguagem específica para a definição de transformações pode ser definida, provendo construtos de maior nível de abstração e mais adequados para a manipulação dos modelos fontes e alvo. Esta linguagem de transformação pode ser definida segundo o paradigma mais adequado, como uma linguagem procedural, funcional, declarativa ou uma mistura de mais de um paradigma.
As linguagens de transformação criadas para essa abordagem podem ser definidas ao nível dos meta-metamodelos envolvidos. Desse modo, uma linguagem pode prover suporte adequado à definição de transformações aplicadas à toda família de modelos cujos metamodelos tenham sido definidos a partir desse meta-metamodelo.

## Transformações de ordem superior

A definição de uma transformação de modelos representada como um modelo em si (modelo de transformação). Se o metamodelo do modelo de transformação é instanciado a partir do mesmo meta-metamodelo que a linguagem de transformação, torna-se possível definir transformações de modelos que manipulem outras definições de transformações criadas nesta mesma linguagem. Uma transformação de modelos cujos modelos fontes e/ou alvos são definições de transformações é chamada de uma transformação de ordem superior.
Transformações de ordem superior podem ser utilizadas para atingir diversos objetivos, tais como a composição e a modificação de transformações. Na composição de transformações, um conjunto de transformações que seriam aplicadas sequencialmente sobre os modelos iniciais é unificado em um único modelo de transformação. Por sua vez, na modificação de transformações, um modelo de transformação é alterado de modo a ser adaptado para um novo uso ou necessidade. Por exemplo, a transformação de ordem superior pode ser executada sobre uma definição modelo de transformação fonte para adicionar um mecanismo de rastreio à definição de transformação alvo.

## Classificação de transformações de modelos

Transformações de modelos podem ser agrupadas em categorias segundo alguns critérios. A classificação de transformações de modelos segundo diferentes categorias permite reconhecer suas características similares, bem como comparar e selecionar abordagens de transformação segundo critérios de interesse. Neste sentido, critérios para a definição de categorias comumente usados são a quantidade de modelos fontes e alvos, o espaço técnico da transformação, se a transformação é exógena ou endógena, se a transformação é horizontal ou vertical, e se a transformação é uma transformação sintática ou semântica.

### Quantidade de modelos fonte e alvos

Tradicionalmente, uma transformação de modelos é vista como uma operação $T:M\rightarrow N$ que mapeia um único modelo fonte $m$ representado em um metamodelo $M$ a um único modelo alvo $n$ representado em um metamodelo $N$. Porém, esta definição inicial pode ser facilmente estendida para acomodar o uso de múltiplos modelos fontes ou alvos. Neste sentido, podemos ver $M$ e $N$ como conjuntos de metamodelos fontes ou alvos, tal que $M=\{M_{1},M_{2},...M_{i}\}$ e $N={N_{1},N_{2},...N_{j}}$, sendo $i$ e $j$ números naturais. Adicionalmente, cada metamodelo dos conjuntos fonte e alvo pode ser definido de forma independente dos demais.
Uma possível transformação de um conjunto de modelos fontes e um único modelo alvo é a composição de múltiplos modelos ortogonais desenvolvidos paralelamente em um único modelo final. Dessa maneira, modelos representando aspectos ortogonais de um dado sistema podem ser compostos em um único modelo final, representando o sistema como um todo. Esse tipo de transformação é de especial interesse na arquitetura orientada a modelos. Esta arquitetura define que um mesmo modelo independente de plataforma pode ser reutilizado para a obtenção de diferentes modelos específicos de plataforma por meio de transformações em que os detalhes da plataforma alvo são incluídos na transformação por meio de um modelo fonte adicional.

### Espaço técnico

O espaço técnico consiste da tecnologia de gerenciamento de modelos utilizada e engloba os conceitos, ferramentas, mecanismos, técnicas e linguagens associadas a essa tecnologia. Exemplos de espaços técnicos são o espaço técnico XML promovido pelo W3C e o espaço técnico MDA promovido pelo OMG. Um espaço técnico é determinado principalmente ao meta-metamodelo utilizado pelos modelos em transformação.
Os modelos fontes e alvo de uma dada transformação podem pertencer a um mesmo espaço técnico ou a espaço técnicos diferentes. Quando modelos em uma transformação pertencem a diferentes espaços técnicos, torna-se necessário que essa diferença seja, de alguma forma, suprimida. Uma abordagem possível neste caso é a escolha de um dos espaços técnicos envolvidos como base da transformação, e a importação/exportação dos modelos pertencentes aos outros espaços técnicos para/de uma representação intermediária.

### Transformações exógenas e transformações endógenas

Modelos fontes e alvos podem ser expressos por meio de um mesmo metamodelo ou por meio de metamodelos diferentes. Transformações que produzem modelos alvo expressos no mesmo metamodelo dos modelos fontes ($T:M\rightarrow M$) são chamadas de transformações endógenas. Transformações endógenas são geralmente utilizadas para realizar otimizações, refatorações, normalizações e/ou adaptações sobre os modelos fontes.
Por sua vez, transformações que produzem modelos alvos expressos em um metamodelo diferente dos modelos fontes ($T:M\rightarrow N$) são chamadas de transformações exógenas. Transformações exógenas têm muitos usos, tais como migração de dados entre metamodelos, engenharia reversa e síntese de modelos.

### Transformações horizontais e transformações verticais

Modelos fontes e alvos podem existir em um mesmo nível de abstração ou existir em níveis de abstração diferentes. Transformações que produzam modelos alvos no mesmo nível de abstração de abstração dos modelos fontes são chamadas de transformações horizontais. Por sua vez, transformações que produzam modelos alvos em nível de abstração mais alto ou mais baixo que os modelos fontes são chamadas de transformações horizontais.
Exemplos de transformações horizontais são as refatorações de modelos e a migração entre metamodelos. Por sua vez, exemplos de transformações verticais são o refinamento, no qual detalhes são adicionados ao modelo de modo a torná-lo mais completo e próximo da implementação do sistema, e a geração de código, quando um modelo suficientemente refinado é transformado diretamente em código de aplicação.
Uma transformação pode ser horizontal ou vertical de maneira independente de ser endógena ou exógena. Por exemplo, a refatoração é uma transformação endógena horizontal (mesmo nível de abstração e mesmo metamodelo), porém o refinamento é uma transformação endógena vertical (diferentes níveis de abstração, porém mesmo metamodelo). Por sua vez, a migração entre metamodelos pode ser uma transformação exógena horizontal (diferentes metamodelos, mesmo nível de abstração), enquanto a geração de código a partir de um modelo é uma transformação exógena vertical (diferentes metamodelos, diferentes níveis de abstração).

### Transformações sintáticas e transformações semânticas

Uma transformação pode modificar apenas a linguagem de representação utilizada para representar um modelo, mantendo todos os elementos do modelo fonte presentes no modelo alvo, apenas representados de outra maneira. Este tipo de transformação é denominada de transformação sintática. Exemplos de transformações sintáticas são a exportação de um modelo para diferentes formatos de representação, como o XML e o JSON.
Por outro lado, uma transformação pode obter modelos alvos com/sem elementos inicialmente presentes no modelo fonte sem que essa transformação gere mudanças do significado do modelo como um todo. Este tipo de transformação é denominada de transformação semântica. Exemplos de transformações semânticas são a refatoração e a otimização de um código fonte.

## Transformações unidirecionais e transformações bidirecionais

Transformações de modelos são geralmente definidas de maneira unidirecional. Porém, é comum o desenvolvedor encontrar cenários em que é necessário prover uma definição bidirecional para uma transformação. Por exemplo, o desenvolvedor pode encontrar um cenário onde tanto modelos fontes quanto modelos alvos podem ser modificados por usuários e que a consistência entre ambos modelos precisa ser mantida após uma modificação. Neste sentido, uma transformação bidirecional é uma forma de especificar algoritmicamente como essa consistência pode ser restaurada.
Embora essencialmente uma transformação bidirecional possa ser vista como uma composição de duas transformações bidirecionais, a definição de transformações bidirecionais não é trivial. Por exemplo, o desenvolvedor deve ter em conta uma definição clara do significado de consistência entre ambos os modelos. Também deve ter em conta a diferença de representações para um mesmo conceito nos diferentes metamodelos fonte e alvo. Adicionalmente, a definição de transformações bidirecionais torna-se mais complexa se não há elementos adequados em um dos metamodelos para a representação de conceitos presentes no outro metamodelo.