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
Espaço de Nomes
  • 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
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

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

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 do modelo que instancie uma classe que não existe no projeto de origem CDT , a transformação transforma a instanciação do 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 gerada pela transformação na pasta de instanciação de modelo possui o esquema de nomenclatura mostrado no diagrama a seguir 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 de membro C++ referencia um tipo definido em um projeto 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 correspondente à 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 é definida para true
static A propriedade isStatic é true
volatile A transformação aplica o estereótipo «cpp_type» à propriedade; a propriedade isVolatile do estereótipo é definida para 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++ são 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 do construtor duplicados no código, a transformação gera um método de 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ópia no código C++ são sobrecarregados, para cada método do construtor de cópia no código, a transformação gera um método de construtor de cópia correspondente no modelo de destino.

Se a transformação encontrar métodos do construtor de cópia duplicados no código, a transformação gera um método de construtor de cópia 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++ são 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 gera um método do destruidor para o primeiro que encontrar.

Amigo A transformação aplica o estereótipo «cpp_operation» e configura a propriedade isFriend para true.
Seqüencial A transformação aplica o estereótipo «cpp_operation» e configura a propriedade isInline para true.
Virtual inalterado A transformação define a propriedadeisAbstract para true.
Estático A transformação define a propriedadeisStatic para true.
Virtual A transformação aplica o 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 qualificador para 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 de origem.

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