UML - Diagrama de Classes Este é um dos mais importantes e utilizados diagramas da UML, cujo objetivo principal é apresentar as classes que compõem o sistema com seus respectivos atributos e métodos, assim como as classes se relacionam, complementam e transmitem informações entre si. Portanto, o diagrama de classes é composto basicamente pelas classes e pelas possíveis associações entre elas. 1. Atributos, métodos e visibilidades. 1.1. Atributos e tipos: Os atributos podem ser considerados como detalhes ou peculiaridades que permitem a caracterização dos objetos (de alguma forma, comparáveis aos campos em estruturas de arquivos, ou títulos de colunas em planilha eletrônica, por exemplo), através dos quais permite-se que tal objeto seja reconhecido como tal, o que permite que seja identificado como distinto de outros de outra classe, além de também permitir que seja observado como distinto de outros da mesma classe. Exemplo: Margarida Noriana Kremoza Semçal, representando um objeto da classe Aluno, por permitir homônimos, além do nome, precisa de outros para identificá-lo como Pessoa, tais como endereço, data de nascimento, sexo, nome do pai, nome da mãe, cpf, rg, etc., porém tais atributos o professor e o funcionário também possuem. O Registro Acadêmico (RA) é propositalmente adicionado, tanto para tornar o Aluno diferente de Professor e de Funcionário, quanto para tornar um aluno distinto de outro (esta é a chave primária). Os tipos definem os gêneros de conteúdos que cada atributo pode conter, restringindo-os ao gênero que o define. Os tipos, aqui, são gerais, mas serão posteriormente determinados pelas linguagens (de programação, como Java, C, Pascal, SQL, etc.) a serem utilizadas no desenvolvimento. Exemplos: Nome, endereço, cidade e descrição são literais (String, Char, Varchar, a depender da linguagem). Ano, dia, idade e quantidade são valores numéricos inteiros (Integer, int, smallint ). Data (date, timestamp ). Valor, preço, taxa, altura, peso são numéricos com ponto flutuante (float, double, real, number, numeric ), etc.
1.2. Métodos Diferentemente do paradigma estruturado, quando define-se a classe (em O.O.), esta já deverá referir as ações (métodos) que contêm os códigos que as desempenham sobre ela. Portanto, o método corresponde à escrita de código de programação que determina o que ocorrerá com a classe em questão, e sem limites de quantos métodos aplicam-se à classe. No diagrama, isto é brevemente descrito na terceira sessão da classe. Esta descrição apresenta apenas o nome do método e os argumentos de entrada (que correspondem a valores que são absorvidos pelo método, a partir dos quais quaisquer decisões são tomadas) e de saída (que correspondem aos valores resultantes). Exemplo: Para se cadastrar o produto, sua identificação e a data atual (IDProduto e Data) devem ser inicialmente informados ao sistema e, assim que ocorrer, deve-se responder se houve ou não sucesso (true ou false). Observe, sobretudo, o método Cadastrar() na classe: 1.3. Visibilidades Ao se definir a classe, torna-se importante, senão fundamental, considerar se um determinado objeto (cada um de seus atributos e de seus métodos) pode ser visto ou executado por outro, tanto pertencente à mesma classe, quanto por outro de classe distinta, ou mesmo para um conjunto definido de classes. A visibilidade, portanto, é o que define esta capacidade e, no diagrama, é expressa apenas por símbolos. Vis. Inglês Português Objeto visto por: - private privado Objetos da mesma classe + public público Objetos de quaisquer outras classes # protected protegido Objetos das classes-filhas (subclasses, item 2.7) ~ package pacote Objetos de um conjunto restrito de classes Se o conteúdo deste atributo for derivado (resultante de cálculo, comparação, geração pelo Sistema Operacional ou outro, etc.), acrescenta-se uma barra à direita da visibilidade ( -/ ou +/, p.ex.).
2. Associações (relacionamentos). No processo de abstração, as classes são definidas como distintas umas das outras, porém estas podem se relacionar de alguma forma (p. ex. um funcionário efetua a venda de produto para um cliente, o que requer a definição de uma classe para cada e uma ligação entre cada classe distinta). As associações são representadas por linhas que ligam uma classe a outra, todavia, algumas requerem uma expressão mais detalhada, o que definirá o comportamento de uma classe em relação à outra. 2.1. Multiplicidade (cardinalidade) Um objeto pode se relacionar com outros, e, no projeto é necessário denotar a quantidade de objetos à qual este se associa. A notação mínima compreende a definição de valores mínimo e máximo ao qual o objeto se relaciona ( um objeto relaciona-se a, no mínimo tantos e, no máximo, outros tantos objetos da outra classe ), e, portanto, mais evidente e como maior possibilidade de acerto na definição dos relacionamentos entre as classes. mín..máx Significado 1 Um: Apenas um objeto da classe está envolvido na associação (não deixa claro a quantos associa-se, no mínimo). * Muitos: Muitos objetos da classe estão envolvidos na associação (não deixa claro a quantos no mínimo pode se associar). 0..1 No mínimo zero e no máximo um: Um objeto de uma classe pode se relacionar a nenhum ou a um único objeto da outra classe. 0..* No mínimo zero e no máximo muitos: Um objeto de uma classe pode se relacionar a nenhum ou a muitos objetos da outra classe. 1..1 No mínimo um e no máximo um: Um objeto de uma classe pode se relacionar a apenas um único objeto da outra classe. 1..* No mínimo um e no máximo muitos: Um objeto de uma classe pode se relacionar a apenas um ou a muitos objetos da outra classe. 2..6 No mínimo dois e no máximo seis: Um objeto de uma classe pode se relacionar a no mínimo dois, ou a no máximo seis objetos da outra classe (estes valores servem apenas de exemplo). Por exemplo, um item de pedido pode se referir a exclusivamente um produto e um produto, por sua vez, pode ser adicionado no mínimo nenhum e no máximo muitos itens de pedido:
2.2. Associação unária (reflexivas ou auto associação) Representa a associação de um objeto de uma classe com outros da mesma classe. Por exemplo, um funcionário pode chefiar um ou mais funcionários (só há a classe funcionário). 2.3. Associação binária Tipo de associação que certamente mais ocorre, pois refere-se ao relacionamento possível entre objetos de uma classe com outros de outra classe. Por exemplo, um funcionário (vendedor), e somente este, pode retirar de nenhum a muitos pedidos (as classes envolvidas são Vendedor e Pedido ). 2.4. Associação n-ária Corresponde à representação de relacionamento mais complexo, em que há três ou mais classes envolvidas (em relacionamentos muitos para muitos para muitos, ou N:N:N, ou mais, às vezes denominada como ternária, porém pode haver mais que três classes envolvidas). Sua representação é simples, com um losango (há ferramentas que não o disponibiliza e, neste caso, pode-se utilizar uma classe como intermediária em substituição ao losango) que concentra as relações entre as classes envolvidas, todavia a compreensão pode ser difícil e, por este motivo, deve ser evitada, através de outras soluções. Um exemplo comum é Um professor leciona para no mínimo uma turma e no máximo para muitas, cada qual com no mínimo um professor e no máximo muitos e este, ao lecionar para uma turma, utiliza no mínimo uma sala de aula e no máximo muitas as três classes são de certa forma interdependentes. Observe que a classe Assoc_n_aria substituiu o losango, porém a sua função na definição do sistema, comportará objetos que vinculem as três classes envolvidas (normalmente as chaves-primárias das três em Banco de Dados).
2.5. Agregação Tipo de associação que demonstra que um determinado objeto (chamado objeto-todo), para ser compreendido, precisa ser complementado pelas informações do outro objeto (objeto-parte). Por exemplo, para conhecer as informações de um cliente de uma instituição financeira, é necessário que sejam complementadas pelos da conta corrente. 2.6. Composição É uma variação da agregação, com um vínculo mais forte entre o objeto-todo e o objeto-parte, em que demonstra-se que os objetos-parte têm de estar associados a um único objeto-todo, e os objetos-parte só podem ser destruídos por um objeto do objeto-todo ao qual estão relacionados. Como exemplo, uma revista científica publica ao menos uma edição e pode publicar muitas, sendo que, como norma, cada edição deve conter de 6 a 10 artigos exclusivos. Um reflexo desta composição é que se uma edição for eliminada, automaticamente todos os seus artigos também serão. 2.7. Generalização / Especialização Este tipo de associação é exclusivo para representar herança, ou seja, é utilizado quando há duas ou mais classes muito semelhantes que compartilham características comuns (atributos e métodos), mas que também mantêm outras características particulares. Assim sendo, aquela classe que contém as características comuns será considerada a classe-mãe (ou superclasse) e as classes, mesmo que semelhantes à mãe, mas com características peculiares, serão chamadas de classes-filhas (ou subclasses).
Por exemplo, tanto uma conta especial (em que há limite de crédito), quanto uma conta poupança (em que há rendimento mensal) são, primeiramente, uma conta comum, a qual contém atributos comuns aos três gêneros de conta, e da qual derivam ambas, distintas entre si (estas têm as mesmas características da conta comum, mais suas características peculiares) 1. Para uma definição mais exata, pode-se se tornar necessário definir algumas restrições quanto à herança, que determinam se a especialização já está completa ou não (se a classe-mãe pode ter mais classes-filhas ou não), ou se um objeto de uma classe filha pertence exclusivamente a esta ou se pode fazer parte de outra classe filha simultaneamente. Esta representação é textual, e indicada logo abaixo do símbolo de generalização/especialização. 1 Torna-se necessário evidenciar que, visto de cima para baixo (top-down), o símbolo deve ser lido como uma especialização (p. ex., uma conta-comum pode ser especial ou uma poupança, ou seja, a conta especial e a poupança têm características próprias e distintas), e, visto de baixo para cima (bottom-up), o mesmo lê-se como uma generalização (assim como toda conta especial, toda conta poupança é uma conta comum, pois ambas compartilham características da classe-mãe).
2.7.1. Restrição completa incompleta Completa: Da superclasse não há mais como derivar outras subclasses (esta classe-mãe não pode ter mais filhas). Incompleta: Mesmo que futuramente, há possibilidade de mais derivações de filhas desta classe-mãe. 2.7.2. Restrição separada sobreposta Separada: Também intitulada como disjunta, e representa exclusão mútua, ou seja, a impossibilidade de um objeto estar contido em duas ou mais classes-filhas. Sobreposta: Representa o fato de que uma instância (objeto) pode pertencer a mais que uma das classes-filhas. Anote as restrições corretas no diagrama do exemplo anterior (pessoas físicas e jurídicas). Represente com diagramas as situações de restrições (completa, separada), (completa, sobreposta), (incompleta, separada) e (incompleta, sobreposta). 2.8. Classe Associativa É produzida quando há associações que tenham multiplicidade muitos em todas as extremidades. Elas são necessárias nos casos em que existem atributos relacionados à associação que não podem ser armazenados por qualquer das classes envolvidas (p. ex., um ator pode atuar em muitos filmes e cada filme pode contar com vários atores, o que cria, portanto, uma classe associativa "atua", com o atributo "papel", semelhante ao M:N em BD). 2.9. Classe Intermediária Semelhantemente à classe associativa, é produzida quando há associações que tenham multiplicidade muitos em todas as extremidades, mas os atributos relacionados à associação podem ocorrer mais que uma vez para cada evento de associação (neste caso, o ator pode interpretar mais que um papel em cada filme em que atue).
Bons costumes: Defina quaisquer identificadores apenas com caracteres alfabéticos, numéricos e o sublinhado (underline), sem espaços em branco ou caracteres especiais, sempre iniciados por uma letra. Os identificadores e métodos das classes devem iniciar-se com uma letra maiúscula e o restante em minúsculas. Os atributos devem ser sempre identificados com caracteres minúsculos. Exercícios 2.10. Uma conta comum pode ser classificada como Especial ou Poupança, sendo que a Especial se caracteriza pelo fato de haver uma anotação de limite de crédito, o que permite ao cliente fazer uso de um valor adicional quando não houver saldo, e a Poupança é um gênero de conta que contabiliza juros mensais ao saldo positivo. 2.11. Para isto, primeiramente crie a classe "Conta comum", que tem todos os atributos e métodos visíveis às classes filhas (Especial e Poupança). Seus atributos são nro_conta (inteiro longo), dt_abertura e dt_encerramento (data, advinda do S.O.), situacao e senha (inteiros), e saldo (ponto flutuante longo). Os métodos são Abrir_conta (parâmetro de entrada nro_conta, e retorna um valor inteiro longo), Consultar_conta (a entrada é o número da conta e saída inteira), Validar_senha (senha como entrada, e retorna verdadeiro se senha validada, senão, falso), Emitir_saldo (devolve o saldo), Gerar_extrato (lê as datas do período pretendido, e devolve um valor literal longo), Depositar_valor (input número da conta e valor de depósito, e avisa 1, se OK, e 0, se não), e Encerrar_conta (informa-se qual conta e avisa se encerrada, com true).