














Estude fácil! Tem muito documento disponível na Docsity
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Prepare-se para as provas
Estude fácil! Tem muito documento disponível na Docsity
Prepare-se para as provas com trabalhos de outros alunos como você, aqui na Docsity
Os melhores documentos à venda: Trabalhos de alunos formados
Prepare-se com as videoaulas e exercícios resolvidos criados a partir da grade da sua Universidade
Responda perguntas de provas passadas e avalie sua preparação.
Ganhe pontos para baixar
Ganhe pontos ajudando outros esrudantes ou compre um plano Premium
Comunidade
Peça ajuda à comunidade e tire suas dúvidas relacionadas ao estudo
Descubra as melhores universidades em seu país de acordo com os usuários da Docsity
Guias grátis
Baixe gratuitamente nossos guias de estudo, métodos para diminuir a ansiedade, dicas de TCC preparadas pelos professores da Docsity
a) Plana Bidirecional b) Agregação Bidirecional. Figura 6-Exemplo de Associação. Quadro 3a) – Códigos C++ e Java do Exemplo da Figura 7a). Saxofonista.
Tipologia: Exercícios
1 / 22
Esta página não é visível na pré-visualização
Não perca as partes importantes!
Tema: Relacionamento entre Classes
Prof. Robinson Vida Noronha Tema: Relacionamento entre Classes
Classes são representações de elementos, conceitos, idéias, grupo de objetos ou qualquer outra entidade conhecida. Para o engenheiro, Classes são peças de um quebra-cabeça, ou engrenagens. Essas peças devem ser “juntadas” ou “associadas” de tal forma a solucionar uma questão ou problema. Outra forma de visualizar Classes é imaginar que elas definem um vocabulário básico. Esses elementos do vocabulário, por sua vez, necessitam ser estruturados ou relacionados de tal forma a representar uma ou mais idéias. Podendo as Classes serem consideradas engrenagens ou peças de um quebra-cabeça, uma questão surge naturalmente: Como essas peças poderiam ser relacionadas? Este material procura descrever, de maneira reduzida, como as classes podem ser relacionadas. O que é apresentado não é um conjunto de regras que busque delimitar a criatividade do engenheiro, mas sim, orientações ou recomendações. Nesse contexto, analisam-se relacionamentos entre duas classes. Apesar dessa limitação, os conceitos apresentados neste material podem ser aplicados para definir relacionamentos entre três ou mais classes. Este material utiliza a linguagem UML e códigos C++ e Java para representar os relacionamentos entre as classes. Os exemplo foram produzidos na ferramenta ArgoUML. De maneira geral, espera-se desenvolver no aluno a habilidade de ser capaz de traduzir uma representação gráfica de um modelo para uma linguagem de programação.
Prof. Robinson Vida Noronha Tema: Relacionamento entre Classes
Figura 1- Representação de Dependência
Figura 2-Relação de Generalização
Figura 3-Relação de Associação
Prof. Robinson Vida Noronha Tema: Relacionamento entre Classes
Duas classes possuem um relacionamento de Dependência quando uma alteração em uma dessas classes poder afetar a outra classe. O inverso não é verdade. Nesse contexto, diz-se que uma classe utiliza a outra como argumento em sua assinatura. Representa-se uma relação de Dependência apontando de uma classe que possui um método ou operação para a classe que é utlizada como um parâmetro para essa operação. Por exemplo, na Figura 4, as classes DVD-PLAYER e DVD-MIDIA apresentam um relacionamento de dependência. A assinatura do método play da classe DVD-PLAYER recebe como parâmetro um objeto ou instância da classe DVD-MIDIA. Nesse exemplo da Figura 4, esse objeto é rotulado por “filme”. O sentido da seta indica quem depende de quem.
Figura 4-Exemplo de Dependência No quadro a seguir, as duas classes e seu relacionamento representadas na Figura 4 são codificadas ou traduzidas para as linguagens C++ (arquivos “.cpp” e “.h”) e Java (arquivo “.java”). Esse código gerado é representado nos arquivos .h e .cpp dessas duas classes.
Prof. Robinson Vida Noronha Tema: Relacionamento entre Classes
A relação de Generalização é identificada por meio do texto “ é um “. Na Figura 5, a seguir, simplifica-se um modelo genérico de generalização. Nesse exemplo, a seta terminadora aponta sempre para a classe mais genérica.
Figura 5 -Relacionamento de Generalização
O Quadro 2 apresenta os arquivos gerados para as classes C1 e C2 da Figura 5. Destaca-se que no código de definição da classe C2, informa-se de maneira explicita qual é a classe Pai. Na linguagem C++ isso é feito por meio do caracter “ : ”, da forma de acesso ( public nesse caso) e do nome da classe genérica. Por outro lado, na linguagem Java, utiliza-se apenas a palavra reservada “ extends ” seguida do nome da classe genérica ou classe-pai.
Quadro 2 – Código C++ e Java do Exemplo da Figura 6 C1 C
#define C1_h
class C1 {};
#endif // C1_h
#ifndef C2_h #define C2_h
#include "C1.h"
class C2 : public C1 {};
#endif // C2_h
Prof. Robinson Vida Noronha Tema: Relacionamento entre Classes
Como outro exemplo de generalização, a Figura 6 a seguir, três classes são representadas: Pessoa, Engenheiro e Musico. Nessa representação, a generalização permite dizer “Engenheiro é um(a) Pessoa” e “Musico é um(a) Pessoa”. Ou seja, os objetos do mundo real representados pela classe Engenheiro e pela classe Pessoa, possuem algumas características comuns ( atributos e método ). Essas características comuns são os atributos e métodos da classe Pessoa.
Figura 5-Exemplo de Generalização
Prof. Robinson Vida Noronha Tema: Relacionamento entre Classes
A Figura 7b) representa que “Musico toca_em Orquestra”. Nesse contexto, deseja-se destacar que a classe Orquestra é “mais importante ou maior” que a classe Músico. Os Quadros 3a) e 3b), apresentam respectivamente os códigos Java e C++ dessas classes representadas respectivamente nas Figuras 7a) e 7b).
a) Plana Bidirecional b) Agregação Bidirecional Figura 6-Exemplo de Associação
Quadro 3a) – Códigos C++ e Java do Exemplo da Figura 7a) Saxofonista Baterista
#define Saxofonista_h
class Baterista;
class Saxofonista {
public: *Baterista toca_com; }; #endif // Saxofonista_h
#ifndef Baterista_h #define Baterista_h
class Saxofonista;
class Baterista {
public: *Saxofonista toca_com; }; #endif // Baterista_h
public class Saxofonista { public Vector toca_com; }
import java.util.Vector;
public class Baterista { public Vector toca_com; }
Prof. Robinson Vida Noronha Tema: Relacionamento entre Classes
Quadro 3b) – Códigos C++ e Java do Exemplo da Figura 7b) Musico Orquestra
#define Musico_h
class Orquestra;
class Musico {
public:
*Orquestra toca_em; };
#endif // Musico_h
#ifndef Orquestra_h #define Orquestra_h
class Musico;
class Orquestra {
public:
Musico toca_em;* };
#endif // Orquestra_h
public class Musico { public Vector toca_em; }
import java.util.Vector;
public class Orquestra { public Vector toca_em; }
Nos quadros 3 a) e b), pode-se observar a referência cruzada entre as duas classes da relação. A classe Baterista possui uma referência para a classe Saxofonista e vice e versa no Quadro 3a). A classe Musico possui uma referencia para a classe Orquestra e vice e versa. Por padrão, a relação de Associação é bidirecional. Apesar disso, pode-se também definir relações de Associação unidirecional. O que significa ser bidirecional? No exemplo apresentado na Figura 3a), significa que a classe Saxofonista tem registrado com quem o saxofonista toca e
Prof. Robinson Vida Noronha Tema: Relacionamento entre Classes
Caso seja necessário especificar uma quantidade mínima diferente de um, é só informar. Por exemplo, pode-se especificar que a relação deve ser delimitada entre 4 e 8 integrantes. Nesse caso, ao invés de registrar “1..*”, seria “4..8”.
Quadro 4 a) – Código C++ e Java do Exemplo da Figura 8 a) Saxofonista Baterista
#define Saxofonista_h
class Baterista;
class Saxofonista {
public:
*Baterista toca_com; };
#endif // Saxofonista_h
#ifndef Baterista_h #define Baterista_h
#include
class Saxofonista;
class Baterista {
public:
std::vector< Saxofonista > toca_com;* };
#endif // Baterista_h
{ public Baterista toca_com; }
import java.util.Vector;
public class Baterista { public Vector toca_com; }
Prof. Robinson Vida Noronha Tema: Relacionamento entre Classes
Quadro 4 b) – Código C++ e Java do Exemplo da Figura 8 b) Musico Orquestra
#define Musico_h
class Orquestra;
class Musico {
public:
*Orquestra toca_em; };
#endif // Musico_h
#ifndef Orquestra_h #define Orquestra_h #include
class Musico;
class Orquestra {
public:
std::vector< Musico > toca_em;* };
#endif // Orquestra_h
public class Musico { public Orquestra toca_em; }
import java.util.Vector;
public class Orquestra { public Vector toca_em; }
Relações Unidirecionais de Associação
As relações de Associação apresentadas até o presente momento são bidirecionais. Ou seja, todas as classes que participam da relação tem a consciência disso. Em algumas situações, pode-se desejar que uma das classes que participa da relação não tenha consciência disso. Nesses casos, têm-se uma relação Unidirecional.
Prof. Robinson Vida Noronha Tema: Relacionamento entre Classes
Composição ( “...pertence exclusivamente a ...” )
A Agregação Simples possui uma variante, a Composição. Essa variação adiciona um grau de importância semântica à relação. Ela define a relação de posse ou possessão. Isso significa que um objeto da classe pertence apenas e exclusivamente ao objeto da outra classe. Como a classe mais importante (ou todo) é responsável pela disposição das partes. Isso significa que ela precisa gerenciar a criação e destruição das partes que a compõe. Por exemplo, na Figura 10, a seguir, representa-se a classe TabuleiroDeXadrez que deve conter instâncias da classe Casa. A classe Casas, que pode ter o atributo cor como sendo “preta” ou “branca”, compõe um Tabuleiro de Xadrez. Mais especificamente, um tabuleiro de Xadrez é formado, composto por 32 casas pretas e 32 casas brancas.
Figura 9-Exemplo de Relacionamento de Composição No Quadro 6, os respectivos códigos das classes da Figura 10 são apresentados. Destaca-se nesse relacionamento, a inexistência de ponteiro na classe TabuleiroDeXadrez. Como os elementos da classe Casa compõe apenas a classe TabuleiroDeXadrez e existem apenas com essa principal finalidade, não há a necessidade de ponteiro. A classe TabeuleiroDeXadrez deverá instanciar os 64 elementos dessa classe.
Prof. Robinson Vida Noronha Tema: Relacionamento entre Classes
Quadro 6 – Códigos C++ e Java do Exemplo da Figura 10 TabuleiroDeXadrez Casa
#define TabuleiroDeXadrez_h
#include "Casa.h"
class TabuleiroDeXadrez {
public:
Casa contem[64]; };
#endif // TabuleiroDeXadrez_h
#ifndef Casas_h #define Casas_h
class TabuleiroDeXadrez;
class Casa {
public:
*TabuleiroDeXadrez contem; };
#endif // Casa_h
{ Casas contem = new Casa[64]; }
public class Casa { TabuleiroDeXadrez contem; }
De maneira similar aos outros relacionamentos, a Composição também pode ser unidirecional. Nesse caso, a classe que desconhece a relação nãofaz referência à ela em seu código.
Em algumas situações, a relação entre duas classes possui propriedades. Por exemplo, a relação entre a classe Paciente e AgendaDoMédico é a Consulta. Essa classe só existe para representar as propriedades da relação entre as duas classes Paciente e AgendoDoMedico. Nesses casos, representa-se em UML as três classes, conforme exemplifica a Figura 11 a seguir.
Prof. Robinson Vida Noronha Tema: Relacionamento entre Classes
#define PropriedadesDaRelacao_h
#include "C1.h" #include "C2.h"
class PropriedadesDaRelacao { public: C1 myC1; C2 myC2; };
#endif // PropriedadesDaRelacao_h
#define C2_h
class PropriedadesDaRelacao;
class C2 { public: PropriedadesDaRelacao *PropriedadesDaRelacaoAssoc; };
#endif // C2_h
Ao modelar relações em UML:
Prof. Robinson Vida Noronha Tema: Relacionamento entre Classes
Programar de maneira orientada a objetos, consiste, entre outras coisas, definir classes e seus relacionamentos. Classes se relacionam com outras Classes com a finalidade de representar objetos e sistemas do mundo real. Em resumo, os relacionamentos apresentados neste material são:
Relacionamento Símbolo Significado Dependência A classe C1 depende da classe C2 para executar alguma tarefa. Pode-se dizer que: “C1 precisa de C2”. Generalização ou Herança
A classe C1 é dita filha da classe C2. A classe C1 possui toda a estrutura da classe C2. Pode-se dizer: “ C1 é um tipo de C2 “. Associação Plana As classes C1 e C2 são igualmente importantes e são associadas de maneira estrutural para representar uma idéia, conceito ou um todo.