Interpretação de Código-fonte pelas Transformações de C++ em UML

Os elementos UML gerados pela transformação dependem das características do código C++ especificadas como origem da transformação. Ao executar a transformação de C++ em UML, ela aplica o perfil de transformação C++ ao modelo gerado, e também aplica os estereótipos do perfil aos elementos UML gerados.

Por padrão, a transformação gera elementos UML com o mesmo nome e visibilidade dos elementos C++ de origem. Se a transformação não puder transformar um elemento C++, ela ignorará o elemento. A tabela a seguir lista a saída gerada pela transformação quando ela transforma elementos de código C++ em elementos de modelo UML.

Elemento C++ Elemento UML
Classe
  • Classe com o mesmo nome e visibilidade da classe C++ de origem
  • A hierarquia de pacotes UML é a mesma da hierarquia de pastas de origem no projeto C++ de origem
  • Se a classe C++ estender uma superclasse, a transformação gerará um relacionamento de generalização entre a classe e a superclasse
Enumeração
  • Enumeração com o mesmo nome e visibilidade, em um pacote com o mesmo nome do pacote C++ de origem
  • Para uma enumeração anônima, a transformação gera uma enumeração UML que tem o«cpp_enum» aplicado, e define a propriedade isAnonymousEnum do estereótipo para true
Namespace
  • Pacote com o estereótipo «cpp_namespace» aplicado
  • O atributo NameSpaceName do estereótipo é igual ao valor do espaço de nomes C++
Classe aninhada, estrutura ou união
  • Classe aninhada, estrutura ou união
  • A transformação gera classes aninhadas, estruturas ou uniões com as mesmas características de classes de alto nível, estruturas ou uniões
Instância de modelo especializado
  • Classe com o estereótipo «cpp_specialized_template» aplicado
  • No modelo UML, o nome do modelo especializado é nome de classe de modelo base_nomes do tipo especializado
Estrutura
  • Classe com o estereótipo «cpp_struct» aplicado, e com o mesmo nome e visibilidade da estrutura C++ de origem
  • A hierarquia de pacotes é a mesma da hierarquia de pastas de origem no projeto C++ de origem
  • Se a estrutura C++ estender uma superclasse, a transformação gerará um relacionamento de generalização entre a classe e a superclasse
Typedef
  • Classe com o «cpp_typedef» aplicado; o atributo ImplementationType do estereótipo é igual ao valor do especificador typedef
  • Por exemplo, a transformação transforma a declaração typedef typedef int MyInt em uma classe com o «cpp_typedef» aplicado e a transformação configura o atributo ImplementationType do estereótipo como int
União
  • Classe com o estereótipo «cpp_union» aplicado, e com o mesmo nome e visibilidade da união C++ de origem
  • A hierarquia de pacotes é a mesma da hierarquia de pastas de origem no projeto C++ de origem.
  • Se a união C++ estender uma superclasse, a transformação gerará um relacionamento de generalização entre a classe e a superclasse

Variáveis Globais e Funções Globais

Se um projeto C++ contiver um arquivo de cabeçalho que contenha variáveis globais e que não contenha uma classe com o mesmo nome que o próprio arquivo de cabeçalho, a transformação gera uma classe UML que tem o estereótipo «cpp_globals» aplicado. Para cada variável global no arquivo de cabeçalho, a transformação gera um atributo UML correspondente nessa classe UML. Para cada método global no arquivo de cabeçalho, a transformação gera uma operação UML correspondente nessa classe UML. A primeira linha na tabela a seguir fornece um exemplo desse cenário.

Se o arquivo de cabeçalho contiver uma classe que tenha o mesmo nome que o arquivo de cabeçalho, então todas as variáveis globais e os métodos no arquivo de cabeçalho serão estereotipados como tipos globais e serão criados na classe UML correspondente, conforme mostrado na segunda linha na tabela a seguir.
Código C++ Elementos UML gerados
Código para um arquivo de cabeçalho chamado Class1.h:
#include <iostream>
const int MAX_LENGTH = 80;
void print_line(const char*);
Elementos de modelo gerado para um arquivo de cabeçalho que contém variáveis globais e que não contém uma classe com o mesmo nome que o arquivo de cabeçalho.
Código para um arquivo de cabeçalho chamado Class1.h:
#include <iostream>
const in MAX_LENGTH = 80;
void print_line(const char *);

class Class1 {
	public: 
	int printStatement();
};
Essa imagem mostra os elementos de modelo gerados descritos no parágrafo anterior.
Se variáveis globais forem definidas no arquivo de cabeçalho que contiver uma classe que tenha o mesmo nome que o arquivo de cabeçalho e o arquivo de cabeçalho contiver variáveis de membro, métodos ou ambos;
  • A transformação transforma variáveis globais em atributos que possuem as seguintes características:
    • O estereótipo «cpp_type» é aplicado
    • A propriedade isGlobal é definida para true
    • A classe UML que contém o atributo gerado tem o mesmo nome do arquivo de origem C++ que contém a variável global
  • A transformação transforma funções globais em operações que possuem as seguintes características:
    • O estereótipo «cpp_operation» é aplicado
    • A propriedade isGlobal é definida para true
    • A classe UML que contém a operação gerada tem o mesmo nome do arquivo de origem C++ que contém a função global
Essa saída é a mesma que a saída na coluna dos elementos UML Gerados na segunda linha da tabela anterior.

Diretivas do Pré-processador

A transformação não transforma diretivas do pré-processador no código C++ porque esses elementos C++ não podem ser representados em UML. É necessário especificar diretivas do pré-processador definidas pelo usuário na seção definida pelo usuário nos arquivos de origem C++.

Classes de Gabarito C++

Se o projeto C/C++ Development Tools (CDT) de origem incluir uma instanciação de modelo que instancia uma classe que não existe no projeto CDT de origem, a transformação transformará a instanciação de modelo em um tipo primitivo UML. A transformação transformará as referências na instanciação do gabarito na referência apropriada para o tipo primitivo de UML no modelo de destino.

A tabela a seguir lista como a transformação de C++ em UML transforma classes de gabaritos quando a instanciação de gabarito instancia uma classe no projeto de origem.
Classe de gabarito C++ Elemento UML
Definição da classe de gabarito
  • Classe com parâmetros, se o parâmetro de gabarito tiver o tipo Classe
  • A transformação ignora os outros parâmetros de gabarito e também ignora classes parciais de gabarito
  • O seguinte exemplo demonstra como a transformação transforma uma definição de classe de gabarito em uma classe UML com parâmetros:
    template <class T=""> class stack {
       public:
    	void push(T ob);
    	T pop();
    };
  • A transformação gera a seguinte classe com parâmetros UML:
    Uma classe com parâmetros UML chamada stack, que tem uma operação chamada push e uma operação chamada pop.
Instanciação da classe de gabarito em uma definição typedef
  • Classe com o mesmo nome da declaração typedef
  • A transformação gera um relacionamento de ligação que aponta da instanciação da classe de gabarito para a classe UML com parâmetros
  • Por exemplo, a transformação transforma a declaração typedeftypedef stack<A> myStackA; na seguinte classe UML chamada myStackA, e cria um relacionamento de ligação com a classe stack:
    Um diagrama de classe com um relacionamento de ligação entre a instanciação da classe de modelo e a classe UML com parâmetros.
Instanciação da classe de gabarito ausente em uma definição typedef
  • Classe na pasta de instanciação de gabarito do modelo UML de destino
  • A transformação gera um relacionamento de ligação que aponta da instanciação da classe de modelo para a classe UML com parâmetros.
  • A classe UML que a transformação gera na pasta de instanciação de modelo possui o esquema de nomenclatura mostrado no seguinte diagrama e corresponde à instanciação de modelo no arquivo C++ de origem.
  • O seguinte exemplo demonstra como a transformação transforma uma instanciação de classe de modelo que não está em uma definição typedef:
    class B {
    	stack<A> stackA;
    };
  • A transformação gera a seguinte classe UML chamada stack_A, e gera um relacionamento de ligação com a classe stack:
    Um relacionamento de associação direcionado da classe B para stack_A, e o relacionamento de ligação entre stack_A e stack.

Variáveis de Membros C++ em uma Classe, Estrutura ou União

A transformação transforma uma variável de membro C++ em uma classe, estrutura ou união em uma propriedade UML que tem as seguintes características:
  • A propriedade gerada tem o mesmo nome e visibilidade da variável de membro C++.
  • A transformação configurará a propriedade Type com um tipo primitivo C++ existente se o tipo correspondente da variável de membro C++ for um tipo primitivo C++. Considere o seguinte código:
    class Class1{
        int x;
    } 
    A transformação cria um mapeamento entre o tipo da propriedade x na classe UML chamada Class1 e o tipo primitivo int C++. A biblioteca de tipos C++ contém o tipo primitivo int.

    As tabelas a seguir listam como a transformação configurará a propriedade Type se o tipo da variável de membro C++ for um tipo definido pelo usuário.

Se o tipo da variável de membro C++ for um tipo definido pelo usuário, a transformação configurará a propriedade UML Type com o valor de um elemento UML correspondente ao tipo definido pelo usuário no modelo UML de destino. Se a transformação não puder determinar o elemento UML no modelo correspondente ao tipo definido pelo usuário, a transformação criará um tipo primitivo de UML com o mesmo nome do elemento UML e configurará o Tipo da propriedade UML com o mesmo nome do novo tipo primitivo de UML.

O exemplo da tabela a seguir lista como a transformação configura o valor da propriedade UML Type:
Amostra de código C++ Valor da propriedade Type
class Class2{
};

class Class3{
Class2 x1;
};
A transformação configura o Tipo da propriedade chamada x1 na classe UML Class3 como Class2, criada pela transformação no modelo UML de destino.

O exemplo da tabela a seguir lista como a transformação configura o valor da propriedade UML Type quando o tipo da variável do membro C++ referenciar um tipo que é definido em um projeto CDT diferente:

Amostra de código C++ Valor da propriedade Type
O projeto CDTProject1 contém uma classe chamada Class1.

O projeto CDTProject2 contém uma classe chamada Class2:

#include "CDTProject1/Class1"
class Class2{
	Class1 x;
};
A transformação cria um mapeamento entre o tipo da propriedade UML x para o elemento visual que corresponde à classe chamada Class1 no projeto de origem C++ chamado CDTProject1.

A tabela a seguir lista informações adicionais geradas pela transformação para variáveis de membros específicas.

Variável de membro C++ Características adicionais da saída de transformação
const A propriedade isStatic é true
mutable A transformação aplica o estereótipo «cpp_type» à propriedade; a propriedade isMutable do estereótipo é configurada como true
estática A propriedade isStatic é true
volatile A transformação aplica o estereótipo «cpp_type» à propriedade; a propriedade isVolatile do estereótipo é configurada como true

Funções-membros C++ em uma Classe, Estrutura ou União

A transformação transforma uma função-membro C++ em uma classe, estrutura ou união em uma operação UML na classe UML correspondente. A operação UML gerada pela transformação tem o mesmo nome e visibilidade da função-membro C++. A tabela a seguir lista as informações adicionais geradas pela transformação para parâmetros de funções específicos.

Função do membro C++ Características adicionais da saída de transformação
Designação A transformação aplica o estereótipo «cpp_assignment»; a operação gerada tem o mesmo nome e visibilidade do operador de designação =
Const A transformação configura a propriedade isQuery como true
Construtor A transformação aplica o estereótipo «cpp_constructor». Se os métodos do construtor no código C++ forem sobrecarregados, para cada método do construtor no código, a transformação gera um método de construtor correspondente no modelo de destino.

Se a transformação encontrar métodos de construtor duplicados no código, a transformação gerará um método do construtor para o primeiro que encontrar.

CopyConstructor A transformação aplica o estereótipo «cpp_copy_constructor». Se os métodos do construtor de cópias no código C++ forem sobrecarregados, para cada método do construtor de cópias no código, a transformação gerará um método de construtor de cópias correspondente no modelo de destino.

Se a transformação encontrar métodos de construtor de cópias duplicados no código, a transformação gerará um método do construtor de cópias para o primeiro que encontrar.

Destrutor A transformação aplica o estereótipo «cpp_destructor». Se os métodos do destruidor no código C++ forem sobrecarregados, para cada método do destruidor no código, a transformação gera um método de destruidor correspondente no modelo de destino.

Se a transformação encontrar métodos do destruidor duplicados no código, a transformação gerará um método do destruidor para o primeiro que encontrar.

Amigo A transformação aplica-se ao estereótipo «cpp_operation» e configura a propriedade isFriend para true.
Sequencial A transformação aplica-se ao estereótipo «cpp_operation» e configura a propriedade isInline para true.
Virtual inalterado A transformação configura a propriedade isAbstract como true
Estático A transformação configura a propriedade isStatic como true
Virtual A transformação aplica-se ao estereótipo «cpp_operation» e configura a propriedade isVirtual para true.

Parâmetros da função C++

A transformação transforma os parâmetros da função C++ em parâmetros UML que possuem as seguintes características:
  • O parâmetro gerado possui o mesmo nome do parâmetro C++. Se o parâmetro C++ for um parâmetro de retorno, a transformação gerará um parâmetro que tem o nome do tipo de parâmetro.
  • A transformação configura a propriedade Type do parâmetro com um tipo primitivo ou com um elemento UML existente no modelo.
  • A transformação configura o valor padrão do parâmetro UML com o mesmo valor do parâmetro C++. Considere o seguinte código C++:
    class one{
        int op(int  x=5);
    }
    A transformação configura o valor padrão do parâmetro UML gerado x na operação op como 5.
A tabela a seguir lista as informações adicionais geradas pela transformação para parâmetros de funções específicos.
Parâmetro da função C++ Saída da Transformação
Referência A transformação configura a propriedade Direction como inout
Retornar A transformação configura a propriedade Direction como return
Regular (sem os parâmetros reference ou return) A transformação configura a propriedade Direction como in

Modificadores de Tipo

Variáveis de membros, funções-membros e parâmetros C++ podem especificar modificadores de tipo, como ponteiros para tipos, tipos de referência e tipos de matrizes. Esses modificadores de tipo não podem ser representados em UML. A tabela a seguir lista como a transformação transforma modificadores de tipo.

Modificador de tipo Saída da Transformação
Ponteiro para um tipo C++ A transformação aplica o estereótipo «cpp_type» ao parâmetro ou propriedade UML gerada e configura o atributo qualifier com um operador ponteiro. Considere o seguinte código C++:
class MyClass {
	private: char* name;
};

A transformação gera uma classe UML chamada MyClass contendo uma variável de nome com as seguintes propriedades:

Esta imagem mostra que a propriedade qualifier está configurada com um operador ponteiro, representado por um asterisco.
Referência a um tipo C++ A transformação configura o atributo qualifier com um operador de referência.

A transformação só aplica o estereótipo «cpp_type» ao transformar vários tipos de referência no código-fonte.

Se a transformação transformar um parâmetro C++ que é um tipo de referência, ela configurará o atributo direction do parâmetro UML como inout.

Considere o seguinte código C++:

class MyClassClone {
	private:
	MyClassClone clone(MyClassClone& copy);
};

A transformação gera uma classe UML chamada MyClassClone contendo um parâmetro return com as seguintes propriedades:

Esta imagem mostra que a propriedade qualifier está configurada com um operador de referência, representado por um e comercial.
Matriz

Para uma matriz de dimensão simples, a transformação configura a multiplicidade do parâmetro ou propriedade UML com o mesmo valor da dimensão simples.

A transformação só aplica o estereótipo «cpp_type» ao transformar várias matrizes dimensionais no código-fonte.

O exemplo a seguir mostra como a transformação configura a multiplicidade de um atributo do tipo int x[10]:

Esta imagem mostra a página Geral da visualização Propriedades. A multiplicidade da propriedade chamada x está configurada como 10.

A transformação configura os limites inferior e superior da propriedade multiplicity com o valor da dimensão simples do atributo.


Feedback