Considerações ao Reexecutar Transformações UML-para-C++

A transformação UML em C++ inclui a tag @generated em determinados elementos gerados. Quando você reexecuta uma transformação, ela sobrescreve elementos específicos que têm uma tag @generated. Para proteger as alterações que são feitas no código gerado, é necessário remover instâncias específicas da tag @generated. Para representar elementos C++ que não podem ser modelados, inclua código nas seções definidas pelo usuário na saída da transformação.

Elementos Gerados pela Transformação

A transformação UML-para-C++ inclui a tag @generated nos seguintes elementos:

Protegendo o Código Gerado

Quando você reexecuta uma transformação UML-para-C++, por padrão, a transformação não sobrescreve corpos de métodos gerados por ela ou criados por um usuário. A transformação sempre preserva os corpos de métodos, independentemente se você remover, ou não, a tag @generated.

Se a tag @generated não for removida dos elementos a seguir, a transformação os sobrescreverá, independentemente se eles forem de nível mais alto ou aninhados:
  • Classes
  • Estruturas
  • Uniões
  • Typedefs
  • Enumerações

Embora a transformação sempre preserve os corpos de métodos, a tag @generated deve ser removida de um método para preservar as alterações estruturais no método. Por exemplo, você deverá remover a tag @generated do método se alterar a assinatura de método, incluir inicializadores em um construtor, incluir exceções em métodos ou incluir comentários no código-fonte.

Se você não remover a tag @generated, a transformação sobrescreverá os elementos aos quais a tag @generated se aplica. A transformação também sobrescreve os seguintes elementos:
  • Palavras-chave mutable, const, volatile, static, auto e register
  • Membros de classes
  • Parâmetros
Nota: Para incluir o método no modelo UML de origem, execute a transformação reversa.
A tabela a seguir lista exemplos de elementos que a transformação preserva e sobrescreve. A coluna Código Modificado lista o código que contém as seguintes alterações:
Ao ser reexecutada, a transformação faz o seguinte:
  • Preserva a herança porque a tag @generated foi removida
  • Sobrescreve as alterações na assinatura de método porque a tag @generated não foi removida
  • Não preserva as alterações para o corpo de método porque a transformação não pode localizar o método ao qual o novo corpo de método pertence
  • Preserva as alterações para o corpo de método Operation2
Elemento de Modelo UML Código Gerado Código Modificado Código Gerado após a Reexecução da Transformação
Esta imagem mostra uma classe UML nomeada Class1 que contém um atributo do tipo inteiro e duas operações que não têm nenhum parâmetro. 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 Operation1();

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


};  //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


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


//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation2() 
{
    //TAREFA A FAZER Stub de método gerado automaticamente
    return 0;
}
Class1.h:
#ifndef CLASS1_H
#define CLASS1_H
//Iniciar seção para o arquivo Class1.h
#include Class2.h
//Encerrar seção para o arquivo Class1.h

class Class1:public Class2
{

    //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 Operation1(int parameter1);

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


};  //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


//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation1(int parameter1) 
{
    int j = 1;
    return j;
}


//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation2() 
{
    int i = 2;
    return i;
}
Class1.h:
#ifndef CLASS1_H
#define CLASS1_H
//Iniciar seção para o arquivo Class1.h
#include Class2.h
//Encerrar seção para o arquivo Class1.h

class Class1:public Class2
{

    //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 Operation1();

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


};  //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


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


//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation2() 
{
    int i = 2;
    return I;
}

Protegendo o Novo Código

A transformação não sobrescreve atributos, classes aninhadas, estruturas, uniões ou enumerações que você inclui no código C++, a não ser que a tag @generated seja incluída por engano nesses elementos.
Nota: Para incluir atributos, classes aninhadas, estruturas, uniões ou enumerações no modelo UML de origem, execute a transformação reversa.
Também é possível incluir código criado pela transformação nas seções definidas pelo usuário. A transformação não sobrescreve ou remove código que você especifica em uma seção definida pelo usuário. A tabela a seguir lista onde a transformação gera seções definidas pelo usuário e fornece exemplos de como utilizá-las.
Saída da Transformação Local e Uso das Seções Definidas pelo Usuário
Arquivos de cabeçalho e arquivos de corpo A transformação inclui uma seção definida pelo usuário no início de cada um desses arquivos. Você pode utilizar essa seção para especificar os seguintes tipos de instruções:
  • #include
  • #defines
  • utilização
Classes, uniões, estruturas, enumerações Você pode utilizar essas seções definidas pelo usuário para especificar atributos, operações, ou ambos, que não podem ser modelados em UML. Por exemplo, você pode especificar atributos de ponteiro de função, tais como os atributos int myFunction(int* myOtherFunction) em uma seção definida pelo usuário.

Embora a tag @generated e as seções definidas pelo usuário ofereçam flexibilidade, para evitar possíveis problemas, você deve fazer alterações estruturais no modelo UML de origem em vez do código gerado. Também é possível executar a transformação reversa para incluir novos métodos ou atributos no modelo UML de origem.

Exemplo de Como Incluir um Atributo no Código-fonte

A tabela a seguir lista estes itens:
  • Elemento de modelo UML
  • Código gerado pela transformação para esse elemento de modelo
  • Código que contém um novo atributo nomeado attribute2, incluído em um arquivo de cabeçalho, mas não em uma seção definida pelo usuário
  • Código que contém um novo atributo nomeado attribute2, incluído em uma seção definida pelo usuário
Embora este exemplo demonstre como incluir um atributo, você pode incluir operações e elementos aninhados da mesma maneira.
Elemento de Modelo UML Código Gerado Atributo Incluído Fora de uma Seção Definida pelo Usuário Atributo Incluído em uma Seção Definida pelo Usuário
Esta imagem mostra uma classe UML nomeada Class1 que contém um atributo e uma operação que não tem nenhum parâmetro.
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 Operation1();

};  //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


//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation1() 
{
    //TAREFA A FAZER Stub de método gerado automaticamente
    return 0;
}	
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;

	  bool attribute2;
    public:

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

};  //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


//@generated "UML para C++ (com.ibm.xtools.transform.uml2.cpp.CPPTransformation)"
int Class1::Operation1() 
{
    //TAREFA A FAZER Stub de método gerado automaticamente
    return 0;
}
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
        bool attribute2;
    //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 Operation1();

};  //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


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

Feedback