Baixe o app para aproveitar ainda mais
Prévia do material em texto
14 4.2.2 Agregação Agregação é um tipo especial de associação onde se tenta demonstrar que as informações de um objeto (chamado objeto-todo) precisam ser complementadas pelas informações contidas em um ou mais objetos de outra classe (chamados objetos-parte). Esse tipo de associação tenta demonstrar uma relação todo/parte entre os objetos associados. O símbolo de agregação difere do de associação por conter um losango na extremidade da classe que contém os objetos-todo. A figura 9 demonstra um exemplo de agregação. Figura 9 - Agregação Esse exemplo demonstra uma associação de agregação existente entre uma classe Pessoa e uma classe Conta_Comum, o que determina que os objetos da classe Pessoa são objetos-todo que precisam ter suas informações complementadas pelos objetos da classe Conta_Comum, que nessa associação são objetos-parte. Dessa maneira, sempre que uma pessoa for consultada, além de suas informações pessoais, serão apresentadas todas as contas que ela possui. Ao observarmos as multiplicidades dessa associação perceberemos que, da mesma forma que uma pessoa pode possuir muitas contas, uma conta pode ser possuída por muitas pessoas, como no caso de uma conta conjunta. Isso é característico das agregações nas quais os objetos-parte podem ser compartilhados por mais de um objeto-todo. A associação de agregação pode, em muitos casos, ser substituída por uma associação binária simples, dependendo da visão de quem faz a modelagem. A função principal de uma associação do tipo agregação é identificar a obrigatoriedade de uma complementação das informações de um 15 objeto-todo por seus objetos-parte, quando este for consultado. Já em uma associação binária essa obrigatoriedade não está explícita. 4.2.3 Composição Uma associação do tipo composição constitui-se em uma variação da agregação, onde é apresentado um vínculo mais forte entre os objetos-todo e os objetos-parte, procurando demonstrar que os objetos-parte têm de estar associados a um único objeto-todo. Em uma composição os objetos-parte não podem ser destruídos por um objeto diferente do objeto-todo ao qual estão relacionados. O símbolo de composição diferencia-se graficamente do símbolo de agregação por utilizar um losango preenchido. Da mesma forma que na agregação o losango deve ficar ao lado do objeto-todo. A figura 10 apresenta um exemplo de composição. Figura 10 - Composição Observando-se a figura 10 é possível perceber que um objeto da classe Revista_Cientifica refere-se a, no mínimo, um objeto da classe Edicao, podendo se referir a muitos objetos dessa classe, e que cada instância da classe Edicao relaciona-se única e exclusivamente a uma instância específica da classe Revista_Cientifica, não podendo relacionar-se com nenhuma outra. Ainda nesse exemplo, percebemos que um objeto da classe Edicao deve se relacionar a no mínimo seis objetos da classe Artigo, podendo se 16 relacionar com até 10 objetos da já citada classe. Esse tipo de informação torna-se útil como documentação e serve como uma forma de validação, que impede que uma revista seja publicada sem ter no mínimo seis artigos, ou mais do que 10. No entanto, um objeto da classe Artigo refere-se unicamente a um objeto da classe Edicao. Isso é também uma forma de documentação, pois uma edição de uma revista científica só deve publicar trabalhos inéditos. Assim, é lógico que não é possível a um mesmo objeto da classe Artigo relacionar-se a mais de um objeto da classe Edicao. 4.2.4 Generalização/Especialização O objetivo dessa associação é representar a ocorrência de herança entre as classes, identificando as classes-mãe (ou superclasses), chamadas gerais, e classes-filhas (ou subclasses), chamadas especializadas, demonstrando a hierarquia entre as classes e possivelmente métodos polimórficos nas classes especializadas. Como no diagrama de casos de uso, a generalização/especialização ocorre quando existem duas ou mais classes com características muito semelhantes. Assim, para evitar ter de declarar atributos e/ou métodos idênticos e como uma forma de reaproveitar código, cria-se uma classe geral em que são declarados os atributos e métodos comuns a todas as classes envolvidas no processo e, então, declaram-se classes especializadas ligadas à classe geral, que herdam todas as suas características, podendo ter atributos e métodos próprios. Além disso, métodos podem ser redeclarados em uma classe especializada, com o mesmo nome, mas comportando-se de forma diferente, não sendo, portanto, necessário modificar o código-fonte do sistema em relação às chamadas de métodos das classes especializadas, pois o nome do método não mudou, somente foi redeclarado em uma classe especializada, e só se comporta de maneira diferente quando for chamado por objetos dessa classe. A figura 11 apresenta um exemplo de generalização/especialização. O símbolo de generalização/especialização é o mesmo do diagrama de casos de uso. 17 Figura 11 - Generalização/Especialização no Diagrama de Classes No exemplo da figura 11 apresenta novamente a classe Conta_Comum e a torna uma classe geral (embora ela não seja uma classe abstrata) e derivamos duas classes especializadas a partir dela, as classes Conta_Especial e Conta_Poupanca, que herdam suas características. Além dos atributos e métodos herdados, a classe Conta_Especial contém ainda o atributo limite, que determina quanto o cliente pode sacar além de seu saldo, e os métodos abrir_Conta, sacar_Valor e juros_Conta. Os dois primeiros métodos são uma redeclaração dos métodos abrir_Conta e sacar_Valor da classe Conta_Comum, pois estes precisam incluir o limite da conta. O último método calcula o valor de juros a ser cobrado pelo uso do limite. Já a classe Conta_Poupanca contém, além dos atributos e métodos herdados, o atributo dt_aniversario, que define a data em que a conta renderá 18 juros, e o método renda_Conta, cuja função é calcular os rendimentos a serem acrescidos ao saldo da conta sempre que esta fizer aniversário. Pode-se presumir que seja necessário criar uma classe Conta que fosse realmente geral, que não tivesse instâncias e servisse apenas para definir os atributos e métodos comuns a todas as contas, ou seja, uma classe abstrata e, a partir desta, derivar as classes Conta_Comum, Conta_Especial e Conta_Poupanca. Isso não estaria errado, apenas não consideramos necessário fazê-lo, por acreditarmos que todas as características de uma conta comum sejam também contidas nas outras classes. Assim, além de definir as características de uma conta comum, a classe pode servir também como classe geral, a partir da qual possam ser derivadas as classes Conta_Especial e Conta_Poupanca. No caso de realmente ser identificada uma classe abstrata, por convenção, seu nome deve ser escrito em itálico. 4.2.5 Classe Associativa Classes associativas são aquelas produzidas quando da ocorrência de associações que tenham multiplicidade muitos (*) em todas as suas extremidades. As classes associativas são necessárias nos casos em que existem atributos relacionados à associação que não podem ser armazenados por nenhuma das classes envolvidas. A figura 12 apresenta um exemplo de classe associativa. Figura 12 - Classe Associativa Nesse exemplo, uma instância da classe Ator pode se relacionar com muitas instâncias da classe Filme, e uma instância da classe Filme pode se 19 relacionar com muitas instâncias da classe Ator, ou seja, um ator pode atuar em muitos filmes, e um filme pode ter muitos atores atuando nele.Ocorre que existe a necessidade de saber qual o papel interpretado por um ator em um determinado filme, mas onde armazenar essa informação? Como existe a multiplicidade muitos nas extremidades de ambas as classes da associação, não há como reservar atributos para armazenar as informações decorrentes da associação em quaisquer das classes. Além disso, seria um desperdício de espaço fazê-lo, pois não há como determinar um limite para a quantidade de atores que poderiam atuar em um filme nem há como saber em quantos filmes um ator poderá atuar. Poderíamos reservar certo número de atributos em uma das classes para armazenar essa informação, mas, na maioria das vezes, diversos deles seriam deixados em branco e, em alguns casos, poderiam não ser suficientes. Assim, é preciso criar uma classe para guardar essa informação, representada pela classe Atua, que conterá o atributo papel, referindo-se este exclusivamente a um ator específico atuando em um determinado filme. Uma classe associativa pode perfeitamente ter métodos também. Classes associativas são válidas somente quando existe um único objeto relacionado a duas instâncias associadas, no caso do exemplo, um ator atuando em um filme terá um único papel. Caso um ator interpretasse dois papéis em um mesmo filme, o uso da classe associativa não seria o mais adequado, sendo necessário inserir uma classe normal atuando como classe intermediária da associação, conforme demonstra a figura 13. Figura 13 - Classe Intermediária Na figura 13 utilizamos o mesmo exemplo apresentado na figura 12, substituindo a classe associativa por uma classe intermediária, representando uma situação em que um ator poderia atuar em muitos filmes e um filme 20 poderia ter muitos atores, diferindo-se da situação anterior por permitir que um ator interprete mais de um papel no mesmo filme. 4.2.6 Dependência Este relacionamento, como o próprio nome diz, identifica certo grau de dependência de uma classe em relação à outra. O relacionamento de dependência é representado por uma linha tracejada entre duas classes, contendo uma seta apontando para a classe da qual a classe posicionada na outra extremidade do relacionamento é dependente. O relacionamento de dependência é utilizado também em diversos outros diagramas, tendo algumas variações definidas por estereótipos, como include ou extend no diagrama de casos de uso, instanciate no diagrama de objetos ou merge no diagrama de pacotes. 4.2.7 Realização Uma realização é um tipo de relacionamento especial que mistura características dos relacionamentos de generalização e dependência, sendo usada para identificar classes responsáveis por executar funções para outras classes. Esse tipo de relacionamento herda o comportamento de uma classe, mas não sua estrutura. O relacionamento de realização é representado por uma linha tracejada contendo uma seta vazia que aponta para a classe, que tem uma ou mais funções que devem ser realizadas por outra, enquanto na outra extremidade da linha é definida a classe que realiza esse comportamento. A associação de realização pode ser comparada à palavra- chave implements da linguagem Java, que determina que uma classe implementará os métodos definidos em outra classe, ou seja, realizará o comportamento de outra classe. A figura 14 apresenta um exemplo de relacionamento de dependência e realização. Figura 14 - Relacionamento de Dependência e Realização 21 Como podemos observar nessa figura, a classe Placa-Mae tem um relacionamento de dependência com a classe iMonitor, determinando que a classe Placa-Mae necessita, de alguma forma, dessa interface. Já a classe Monitor, por sua vez, tem um relacionamento de realização com a classe iMonitor, o que determina que a classe Monitor implementa algum dos serviços oferecidos pela classe iMonitor. Observe que a classe iMonitor tem um estereótipo «interface» para destacar sua função. Poderíamos ter colocado o estereótipo boundary, que será estudado nas próximas aulas, mas preferimos utilizar o estereótipo interface para deixar mais clara a função da classe. 22 EXERCÍCIOS 1) O que é agregação? 2) Qual é o objetivo da agregação? 3) Qual é o símbolo de agregação? 4) O que é composição? 5) Qual é a característica da associação de composição? 6) Qual é o símbolo da associação de composição? 7) O que é Generalização/Especialização? 8) Quando ocorre uma generalização/especialização? 9) Quais são as características para se declarar novamente um método em uma classe especializada? 10) O que é uma classe associativa? 11) Quando são necessárias as classes associativas? 12) O que é um relacionamento de dependência entre as classes? 13) Como é representado um relacionamento de dependência? 14) O que é o relacionamento de realização? 15) Explique o relacionamento de realização? 16) Como é representado um relacionamento de realização?
Compartilhar