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 mudanças 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 mudanças 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 mudanças:
- Em Class1.h, remova a tag @generated de Class1
- Em Class1.h, inclua uma herança para Class1
- Em Class1.cpp, altere a assinatura de método para o método Operation1,
mas não remova a tag @generated
- Em Class1.cpp, inclua uma implementação para o método Operation2
Ao ser reexecutada, a transformação faz o seguinte:
- Preserva a herança porque a tag @generated foi removida
- Sobrescreve as mudanças na assinatura de método porque a tag @generated
não foi removida
- Não preserva as mudanças 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 mudanças 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 |
 |
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. É possível utilizar essa seção para especificar
os seguintes tipos de instruções:- #include
- #defines
- utilização
|
| Classes, uniões, estruturas, enumerações |
É possível 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, é possível 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 mudanças 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, é possível 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 |
 |
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;
}
|