Este é o reestruturado UML na Prática. Este é o primeiro post da série que vai apresentar as Entidades mais comuns encontradas nos Diagramas de Classes. Vamos utilizar nos exemplos a modelagem da SGE (Simple Game Engine), aplicando a modelagem de dados para jogos.
Nomenclatura
Antes de começar a falar das entidades, vamos falar um pouco sobre a nomenclatura das classes. Como padrão vamos utilizar classes com a estrutura NomeClasse. A primeira letra de cada nome que compõe o nome da classe sempre será com letra maiúscula e todas as outras com minúscula.
No caso de siglas, todas as iniciais serão em maiúsculas, então no caso das nossas classes da Simple Game Engine vamos usar a sigla SGE. Como exemplo, seguindo nosso padrão, a classe de video terá o nome SGEVideo.
Para os métodos das classes vamos seguir a mesma idéia, mas com um diferencial. O primeiro nome de cada método, salvo construtores de destrutores, irão começar com a letra minúscula. Então nosso método para exibir alguma imagem seria mostrarImagem(std::string nome).
Classe Concreta
Esta é a entidade mais comum no Diagrama de Classes. Representada pelo desenho da Figura 1, as classes concretas são aquelas onde todos os métodos são implementados e instanciamos objetos em nosso código.
O retângulo que representa a classe é dividido por 3 linhas, a primeira parte é apresentado apenas o nome da classe. Em seguida, no segundo retângulo, são listados os atributos das classes (as variáveis que fazem parte do seu escopo). Perceba que antes de cada nome um sinal (+ ou -) aparece antes dos atributos, isto significa sua visibilidade, no caso do sinal de + ele é um atributo do tipo público, podendo ser acessado diretamente. Quando temos um sinal de – antes do nosso atributo, significa que este atributo é privado e pode ser acessado apenas pelos métodos da classe.
O último retângulo da classe contém os métodos que pertencem a classe. E novamente temos a mesma definição dos sinais, indicando a visibilidade dos métodos. O Código abaixo tem o exemplo da declaração da classe vista na Figura 1.
#include
#ifndef SGEVIDEO_H
#define SGEVIDEO_H
class SGEVideo {
private:
boolean draw;
SGETimeControl drawTime;
SGETimeControl nowTime;
public:
void update();
std::string blitScene();
};
#endif
Classe Abstrata
Outra entidade muito comum em nossos projetos é a classe abstrata. Uma classe abstrata é uma representação de algum conceito ou objeto mais genérico. No c++, dizem alguns, as classes abstratas são definidas através de gambiarras. Na UML uma classe abstrata é identifica com o seu nome em itálico, a Figura 2 apresenta a representação gráfica da classe abstrata.
Como pode ser visto na Figura 2, a representação UML da classe abstrata é igual a da classe concreta, com o diferencial que o nome da classe aparece em itálico. Antes de exibir o código da classe abstrata devemos saber como declarar este tipo de classe no C++. Não existe como declarar uma classe abstrata no C++. Mas lembra da gambiarra? No lugar de declarar a classe abstrata vamos declarar os métodos abstratos, e podemos fazer isto de duas formas.
Na primeira, podemos deixar os métodos das classes em branco, sem implementação. Isto deixa aberto para que as classes concretas façam a implementação destes objetos. Perceba, a implementação dos métodos pelas classes concretas é opcional.
Na segunda opção, podemos obrigar que as classes tenham que implementar os métodos abstratos, para isto igualamos os mesmos à zero. Para saber qual forma utilizar devemos verificada a necessidade da aplicação e definir se um método é obrigatório ou não.
#include
#ifndef SGESINGLETON_H
#define SGESINGLETON_H
class SGESingleton {
private:
SGESingleton instance = NULL;
SGESingleton(){}
~SGESingleton(){}
public:
SGESingleton getInstance()=0;
};
#endif
No código acima definimos que toda classe filha de SGESingleton deve implementar o método getInstance(), mas o construtor e destrutor da classe é algo opcional.
Interface
As interfaces são um conjunto de operações que definem os serviços de uma classe, ou de um componente. No nosso caso as interfaces existirão em cada módulo. Video, Som, Data, Core, Rede e todos os outros módulos possuirão suas interfaces, e estas serão as portas de comunicação entre os módulos e o jogo
Esta entidade possui duas representações visuais. As Figuras 3 e 4 são o mesmo exemplo de como a interface pode ser representada em UML.

Figura 3: Interface
Na Figura 3, a interface tem a mesma estrutura e desenho que uma classe concreta, a diferença está na indicação <<interface>> antes do nome da interface. No C++ uma interface nada mais é do que uma classe, como mostra o Código abaixo:
#include
#ifndef SGESystemManager_H_
#define SGESystemManager_H_
class SGESystemManager {
bool startSystem(std::string name);
bol stopSystem(std::string name)
int getError();
};
#endif
Na Figura 4, a interface é representada por um circulo, a principal característica desta representação é a falta dos métodos. Esta forma mais simples de representação pode ser utilizada no diagrama de outras interfaces. No nosso caso, o Diagrama de Classes do jogo pode conter esta representação, deixando o diagrama menos poluído, e em caso de dúvida o diagrama do módulo pode ser consultado.
Figura 4: Outra Forma de Representação de Interface
Bom, existem outras entidades em diagramas uml, mas para quem esta começando estas são as principais e mais utilizadas. até a próxima.
ciao



