Impacto das Alterações do Modelo e do Código-fonte na Saída da Transformação UML-para-C++

As alterações que você faz no modelo de origem ou no código-fonte gerado podem afetar a saída da transformação ao reexecutar a transformação UML-para-C++. A saída da transformação irá variar dependendo se você configurar a transformação para criar relacionamentos derivados entre os elementos de modelo e o código-fonte gerado ou se remover a tag @generated para elementos no código-fonte gerado.

Quando você configura a transformação para criar relacionamentos derivados entre elementos de modelo de origem, a transformação inclui um identificador exclusivo para cada elemento transformado no código-fonte gerado.

A tabela a seguir lista como as alterações no modelo de origem impactam o código gerado anteriormente quando você reexecuta uma transformação e supõe que a transformação esteja configurada para criar relacionamentos derivados entre elementos de modelo e o código-fonte gerado.
Nota: Para preservar as alterações no código, você pode excluir a tag @generated de um elemento no arquivo de cabeçalho ou arquivo de corpo.
Elemento de Modelo Alteração Impacto no Código Gerado Anteriormente ao Reexecutar a Transformação
Atributo Renomear ou mover Se a tag @generated for excluída do atributo, nenhuma alteração será feita no atributo. Nenhuma alteração será feita nos métodos getter e setter, se gerados.
Se a tag @generated não for excluída do atributo, as seguintes ações ocorrerão:
  • O atributo será renomeado ou movido para o novo local. Os métodos getter e setter padrão, se gerados, serão renomeados ou movidos.
  • Os métodos getter e setter criados serão preservados.
  • As alterações nos códigos que se referirem ao atributo ou seus métodos getter e setter não serão refatoradas.
Classe ou interface Renomear Se a tag @generated for excluída da classe ou interface, o arquivo para a classe não será renomeado.
Se a tag @generated não for excluída, as seguintes ações ocorrerão:
  • Os construtores e desconstrutores, se gerados, e as instâncias do nome da no código serão renomeados.
  • Para classes mais altas não mapeadas para um nome de arquivo diferente em um modelo de mapeamento, os arquivos de cabeçalho e de corpo serão renomeados.
  • O código incluído nessa classe, como atributos, métodos, classes-base, comentários e hierarquias de classes, será preservado.
  • O código incluído que referenciar a classe renomeada não será refatorado.
  • O código gerado, como atributos, parâmetros ou valores de retorno do mesmo tipo que a classe renomeada, que referenciar a classe renomeada será refatorado.
  • Para classes mais altas, o arquivo gerado anteriormente será excluído se você selecionar a opção de exclusão de arquivo obsoleto na configuração de transformação e se não mapear a classe UML original para um arquivo que contenha outras classes mais altas. Caso contrário, o arquivo gerado anteriormente não será alterado.
Classe ou interface mais alta Mover Se a tag @generated for excluída da classe ou interface mais alta, o arquivo para classe não será alterado.
Se a tag @generated não for excluída, as seguintes ações ocorrerão:
  • Um novo arquivo de código-fonte será gerado no local que corresponde ao novo local da classe UML. Se não existir um modelo de mapeamento, as seguintes ações ocorrerão:
    • Se uma classe UML aninhada tornar-se não aninhada, um novo arquivo de código-fonte será gerado.
    • Se uma classe UML não aninhada tornar-se aninhada, um novo arquivo de código-fonte não será gerado.
  • Se existir um modelo de mapeamento, a transformação gerará os arquivos de código-fonte de acordo com o mapeamento no modelo de mapeamento.
  • As alterações feitas no código-fonte, como a inclusão de atributos, métodos, classes-base, comentários, hierarquias de classes, serão preservadas no novo arquivo de código-fonte. Isto se aplica a classes não aninhadas que tornam-se aninhadas e vice-versa.
  • As alterações no código que se referirem à classe original não serão refatoradas.
  • Os arquivos obsoletos serão excluídos se a opção de exclusão de arquivo obsoleto for selecionada na configuração de transformação
Operação Renomear, mover ou modificar um tipo de retorno ou assinatura Se a tag @generated for excluída a operação, nenhuma alteração será feita na operação.
Se a tag @generated não for excluída, as seguintes ações ocorrerão:
  • As mesmas alterações serão feitas no código-fonte da operação.
  • As alterações no corpo da operação serão preservadas.
  • As alterações no código que referenciarem a operação não serão refatoradas.
Pacote Renomear ou mover Os arquivos na pasta original gerada serão movidos para a nova pasta.

As pastas e os arquivos obsoletos serão excluídos se a opção de exclusão de arquivo obsoleto for selecionada na configuração de transformação.

Pacote com «cpp_namespace» aplicado Renomear a propriedade NamespaceName O espaço de nomes é renomeado em todos os arquivos de origem gerados. As alterações no código que se referirem ao espaço de nomes original não serão refatoradas.
Renomear o pacote O código é refatorado e movido para o pacote renomeado porque o pacote não tem um identificador exclusivo.

Exemplo de Código Gerado quando Você Reexecuta a Transformação

O exemplo a seguir mostra as alterações no código quando você reexecuta a transformação, dependendo da existência de identificadores exclusivos e da tag @generated.

Suponha que o modelo de origem UML neste exemplo contenha a seguinte classe:

Esta imagem mostra uma classe UML nomeada Class1 que possui um atributo de número inteiro nomeado attribute1 e uma operação nomeada Operation1.
Neste exemplo, suponha que a Operation1 tenha uma assinatura de Operation1 ([in] Parameter1 : Integer) e retorne um inteiro que tenha um valor de zero.

A tabela a seguir mostra o código gerado pela transformação:
Class1.h Class1.cpp
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslx4A"
//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class1
{

    //Iniciar seção para Class1
    //TAREFA A FAZER: Incluir atributos a serem preservados
    //Encerrar seção para Class1

    private:

 	//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslw3S"

        int attribute1;
    public:

        //@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofsly5D"

        int Operation1(int Parameter1);

};  //encerrar classe Class1
#include "Class1.h"
//Iniciar seção para o arquivo Class1.cpp
//TAREFA A FAZER: Incluir definições preservadas
//Encerrar seção para o arquivo Class1.cpp


//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation1(int Parameter1) 
{
    //TAREFA A FAZER Stub de método gerado automaticamente
    return 0;
}
Suponha que o usuário faça as seguintes alterações:
  • No código gerado, o usuário implementa Operation1:
    int Class1::Operation1(int Parameter1) 
    {
        return Parameter1;
    }
  • No modelo de origem, o usuário renomeia Operation1 para Operation2
O código gerado pela transformação depende dos seguintes eventos:
  • Se você configurará, ou não, a transformação para gerar relacionamentos de rastreio, que gera um identificador exclusivo para cada elemento que suporta a tag @generated. Consulte a tabela Código com Identificadores Exclusivos para visualizar o código gerado pela transformação quando você configurar a transformação para criar relacionamentos de rastreio. Consulte a tabela Código sem Identificadores Exclusivos para visualizar o código gerado pela transformação quando você não configurar a transformação para gerar relacionamentos de rastreio.
  • Se você excluirá, ou não, a tag @generated no código-fonte gerado
A tabela a seguir mostra o código gerado pela transformação quando você reexecuta uma transformação configurada para gerar relacionamentos derivados, que anexa um identificador exclusivo aos comentários do código-fonte de cada elemento que suporta a tag @generated.
Código com Identificadores Exclusivos
Tag @generated não excluída
O código ilustra as seguintes alterações:
  • A transformação renomeia Operation1 para Operation2.
  • A implementação especificada em Operation1 aparece em Operation2.

Class1.h:

//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslx4A"
//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class1
{

    //Iniciar seção para Class1
    //TAREFA A FAZER: Incluir atributos a serem preservados
    //Encerrar seção para Class1

    private:

 	//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslw3S"

        int attribute1;
    public:

        //@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofsly5D"

        int Operation2(int Parameter1);

};  //encerrar classe Class1
Class1.cpp:
#include "Class1.h"
//Iniciar seção para o arquivo Class1.cpp
//TAREFA A FAZER: Incluir definições preservadas
//Encerrar seção para o arquivo Class1.cpp


//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation2(int Parameter1) 
{
    return Parameter1;
}
Tag @generated excluída de Class1.h ou Class1.cpp
A transformação utiliza identificadores exclusivos para determinar que a Operation1 foi renomeada para Operation2 no modelo, mas como você excluiu a tag @generated do método, a transformação preserva as alterações para Operation1. Portanto, a Operation1 não é alterada em Class1.h ou Class1.cpp, e a transformação não gera um método chamado Operation2.
Class1.h:
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslx4A"
//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class1
{

    //Iniciar seção para Class1
    //TAREFA A FAZER: Incluir atributos a serem preservados
    //Encerrar seção para Class1

    private:

 	//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofslw3S"

        int attribute1;
    public:

//@uml.annotationsderived_abstraction="platform:/resource/Bug-Fixes/GUIDs.emx#_0NWVMJy6EdueYKrofsly5D"

        int Operation1(int Parameter1);

};  //encerrar classe Class1
Class1.cpp:
#include "Class1.h"
//Iniciar seção para o arquivo Class1.cpp
//TAREFA A FAZER: Incluir definições preservadas
//Encerrar seção para o arquivo Class1.cpp


int Class1::Operation1(int Parameter1) 
{
    return Parameter1;
}

A tabela a seguir mostra o código gerado pela transformação quando você reexecuta uma transformação que não está configurada para gerar relacionamentos derivados. Sem identificadores exclusivos, a transformação utiliza nomes completos e assinaturas de métodos para vincular elementos de modelo a elementos de código-fonte; além disso, a refatoração não é suportada.

Código sem Identificadores Exclusivos
Tag @generated não excluída
O código ilustra as seguintes alterações:
  • A transformação renomeia Operation1 para Operation2.
  • A transformação sobrescreve a implementação de Operation1 do usuário com a implementação padrão porque, sem um identificador exclusivo, não é possível vincular o novo nome do método ao método original. A sobrescrita ocorre porque a tag @generated não foi excluída.
Geralmente, a transformação preserva alterações em corpos de funções, mas neste exemplo, a alteração não é preservada porque a transformação não pôde localizar o método renomeado.
Class1.h:
#ifndef CLASS1_H
#define CLASS1_H
//Iniciar seção para o arquivo Class1.h
//TAREFA A FAZER: Incluir definições preservadas
//Encerrar seção para o arquivo Class1.h

//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class1
{

    //Iniciar seção para Class1
    //TAREFA A FAZER: Incluir atributos a serem preservados
    //Encerrar seção para Class1

    private:

        //@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int attribute1;
    public:

        //@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation2(int Parameter1);

};  //encerrar classe Class1
Class1.cpp:
//Iniciar seção para o arquivo Class1.cpp
//TAREFA A FAZER: Incluir definições preservadas
//Encerrar seção para o arquivo Class1.cpp


//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation2(int Parameter1) 
{
    //TAREFA A FAZER Stub de método gerado automaticamente
    return 0;
}
Tag @generated excluída de Class1.h ou Class1.cpp
Sem identificadores exclusivos, a transformação determina que a Operation2 é um novo método.
O código ilustra as seguintes alterações:
  • A transformação gera um corpo de método padrão em Operation2.
  • A transformação preserva as alterações em Operation1. Como a tag @generated foi excluída, a transformação preservará as alterações mesmo se não houver um método correspondente no modelo UML.
Class1.h:
#ifndef CLASS1_H
#define CLASS1_H
//Iniciar seção para o arquivo Class1.h
//TAREFA A FAZER: Incluir definições preservadas
//Encerrar seção para o arquivo Class1.h

//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
class Class1
{

    //Iniciar seção para Class1
    //TAREFA A FAZER: Incluir atributos a serem preservados
    //Encerrar seção para Class1

    private:

        //@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int attribute1;
    public:

        int Operation1(int Parameter1);

        //@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
        int Operation2(int Parameter1);

};  //encerrar classe Class1

#endif
Class1.cpp:
#include "Class1.h"
//Iniciar seção para o arquivo Class1.cpp
//TAREFA A FAZER: Incluir definições preservadas
//Encerrar seção para o arquivo Class1.cpp


int Class1::Operation1(int Parameter1) 
{
	return Parameter1;
}

//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation2(int Parameter1) 
{
    //TAREFA A FAZER Stub de método gerado automaticamente
    return 0;
}

Feedback