560 likes | 721 Views
Parte II Modelos Estruturais. Introdução. Questões Como representar modelos estruturais em notação UML? Qual a finalidade dos diagramas de classes UML? O que são diagramas de classes? Que elementos constituem os diagramas de classes?. Diagramas de Classes: Conceitos Básicos. Sumário.
E N D
Introdução • Questões • Como representar modelos estruturais em notação UML? • Qual a finalidade dos diagramas de classes UML? • O que são diagramas de classes? • Que elementos constituem os diagramas de classes?
Sumário • Finalidade dos diagramas de classes • Objectos, classes, atributos e operações • Relações entre classes: • Associação • Multiplicidade de associações binárias • Navegabilidade de associações • Classe-Associação • Associações n-árias • Agregação • Multiplicidade da agregação • Hierarquias de objectos • Generalização • Hierarquias de classes • Herança de propriedades • Polimorfismo
Finalidade dos Diag. de Classes • Um diagrama de classes serve para modelar o vocabulário de um sistema, do ponto de vista do utilizador/problema ou do implementador/solução • Ponto de vista do utilizador/problema – na fase de captura e análise de requisitos, em paralelo com a identificação dos casos de uso • Vocabulário do implementador/solução – na fase de projecto (design) • Construído e refinado ao longo das várias fases do desenvolvimento do software, por analistas, projectistas (designers) e implementadores • Também serve para: • Especificar colaborações • Especificar esquemas lógicos de bases de dados
Objectos do Mundo Real e Objectos Computacionais • No desenvolvimento de software orientado por objectos, procura-se imitar no computador o mundo real visto como um conjunto de objectos que interagem entre si • Alguns objectos computacionais são imagens de objectos do mundo real • Dependendo do contexto (análise ou projecto) podemos estar a falar em objectos do mundo real, em objectos computacionais ou nas duas coisas em simultâneo • Exemplos de objectos do mundo real: • o Sr. João • o carro com matrícula ES-00-01 • a aula de ES no dia 11/10/2000 às 11 horas • Exemplos de objectos computacionais: • o registo que descreve o Sr. João (imagem de objecto do mundo real) • uma árvore de pesquisa binária (objecto puramente computacional)
Noção de Objecto • Um objecto é algo • com fronteiras bem definidas • relevante para o problema em causa • com estado, comportamento e identidade • estado: valores de atributos (tamanho, forma, peso, etc.) e ligações com outros objectos • identidade no espaço: é possível distinguir dois objectos mesmo que o seu estado seja idêntico • exemplo: podemos distinguir duas folhas de papel A4, mesmo que tenham os mesmos valores dos atributos • identidade no tempo: é possível saber que se trata do mesmo objecto mesmo que o seu estado mude • exemplo: se pintarmos um folha de papel A4 de amarelo, continua a ser a mesma folha de papel • comportamento: um objecto exibe comportamentos invocáveis (por resposta a mensagens) ou reactivos (por resposta a eventos)
Noção de Classe • Uma classe é um descritor de um conjunto de objectos que partilham as mesmas propriedades (atributos, operações, relações e semântica) • Trata-se de uma noção de classe em compreensão, no sentido detipo de objecto, por oposição a uma noção de classe em extensão, como conjunto de objectos do mesmo tipo • Um objecto de uma classe é uma instânciada classe • A extensão de uma classe é o conjunto de instâncias da classe • Em Matemática, uma classe é um conjunto de “objectos” com uma propriedade em comum, podendo ser definida em compreensão ou em extensão C = {x |N : x mod 3 = 2} = {2, 5, 8, 11, 14, ...}
Noção de classe (cont.) • Em UML, é habitual escrever os nomes das classes no singular (nome de uma instância da classe), com a primeira letra em maiúscula • Exemplos de classes: • Coisas concretas: Pessoa, Turma, Carro, Imóvel, Factura, Livro • Papéis: Aluno, Professor, Piloto • Eventos: Curso, Aula, Acidente • Tipos de dados: Data, Intervalo de Tempo, Número Complexo, Vector • Para se precisar o significado pretendido para uma classe, deve-se explicar o que é (e não é ...) uma instância da classe • Exemplo: “Um aluno é uma pessoa que está inscrita num curso ministrado numa escola. Uma pessoa que esteve no passado inscrita num curso, mas não está presentemente inscrita em nenhum curso, não é um aluno.” • Em geral, o nome da classe não é suficiente para se compreender o significado da classe
Noção de classe (cont.) • O conjunto de todos os objectos num determinado contexto/domínio/aplicação forma um universo • numa fase de análise, é habitual falar em universo de discurso (UoD - Universe of Discourse) • As classes (em extensão) são subconjuntos do UoD UoD Aluno x João Curso x Maria x Informática classe x Rui x Electrotecnia Funcionário objecto x Dª Rita x Sr. Silva
Aluno Funcionário Curso Representação de classes e objectos • Nos diagramas (de classes), uma classe é representada por um rectângulo com o nome da classe • Nos diagramas (de objectos), um objecto é representado por um rectângulo com o nome sublinhado João: Aluno : Aluno João: ou ou objecto anónimo classe não especificada nome do objecto separador nome da classe
Noção de atributo • Um atributo é uma propriedade com nome de uma classe que descreve uma gama de valores que as instâncias da propriedade podem tomar • Exemplos: • atributos de Pessoa: nome, data de nascimento, peso, etc. • atributos de Carro: matrícula, ano, peso, etc. • Um atributo de uma classe tem um valor (possivelmente diferente) em cada instância (objecto) da classe • Exemplo: João é uma pessoa com nome “João Silva”, data de nascimento “18/3/1973” e peso “68 Kg” • Todos os objectos de uma classe são caracterizados pelos mesmos atributos • Uma classe não pode ter dois atributos com o mesmo nome • Podem existir atributos com o mesmo nome em classes diferentes (ver atributo peso definido nas classes Pessoa e Carro) • O valor de um atributo de um objecto pode mudar ao longo do tempo • O estado de um objecto num dado momento é dado (em parte) pelos valores dos seus atributos (outra parte é dada pelas ligações que tem com outros objectos)
classe objecto Pessoa João: Pessoa nome: string data de nascimento: date peso: real = 75 kg nome = “João Silva” data de nascimento = 18/3/1973 peso = 70 kg valor inicial por omissão Representação de atributos e valores • Atributos são listados num compartimento de atributos (opcional) a seguir ao compartimento com o nome da classe • A seguir ao nome de um atributo pode indicar-se o tipo de dados (ou classe) e o valor inicial por omissão • Os nomes dos tipos não estão pré-definidos em UML, podendo-se usar os da linguagem de implementação alvo compartimento de atributos
Pessoa nome: stringmorada: string mudar-morada(nova-morada:string): bool Noção de operação • “Uma operação é a implementação de um serviço que pode ser solicitado a qualquer objecto da classe” • Uma operação é algo que se pode (mandar) fazer a um objecto de uma classe • Uma operação é um serviço oferecido pelos objectos de uma classe • As operações são representadas num compartimento de operações, a seguir ao compartimento de atributos • Para cada operação pode-se indicar o nome, lista de argumentos e tipo de retorno
Nome da associação Participante-2 Participante-1 papel-2 papel-1 Associações binárias • Uma associação é uma relação estrutural (física ou lógica) entre objectos das classes participantes (um objecto de cada classe em cada ligação) • Não gera novos objectos • Matematicamente,uma associação binária é uma relação binária, i.e., um subconjunto do produto cartesiano das extensões das classes participantes • Assim como um objecto é uma instância duma classe, uma ligação é uma instância duma associação • Pode haver mais do que uma associação (com nomes diferentes) entre o mesmo par de classes
pai mãe Pessoa 0..1 0..1 Paternidade Maternidade filho filho * * Auto-associação • Pode-se associar uma classe com ela própria (em papéis diferentes)
* * Partic. 2 Partic. 1 x x x x x x 1 * Partic. 1 Partic. 2 x x x x x x 1 1 Partic. 1 Partic. 2 x x x x x x Multiplicidade de associações binárias • muitos-para-muitos • muitos-para-um • um-para-um • Notação: • * - zero ou mais • 1 - exactamente um • 0..1 - zero ou um • 1..* - um ou mais • 1, 3..5 - um ou três a 5
Class-1 Class-2 Class-1 Class-2 Trabalha-para Pessoa Empresa empregador empregado Emprega Navegabilidade de associações • As associações são classificadas quanto à navegabilidade em: • bidirecionais(normal) • unidirecionais • um objecto da classe 1 tem a responsabilidade de dar o(s) objecto(s) correspondente(s) da classe 2 (nível de especificação) ouum objecto da classe 1 tem apontador(es) para o(s) objecto(s) correspondente(s) da classe 2 (nível de implementação) • Pode-se indicar o sentido em que se lê o nome duma associação
Association Name Class-2 Class-1 Association Name link attribute ... link operation ... Classe-Associação • reúne as propriedades de associação e classe • o nome pode ser colocado num sítio ou noutro, conforme interessa realçar a natureza de associação ou de classe, mas a semântica é a mesma • o nome também pode ser colocado nos dois sítios • não é possível repetir combinações de objectos das classes participantes na associação
Association Name Class-1 Class-2 role-1 role-2 role-3 Class-3 Class-2 Class-1 0..1 Class-3 Associações n-árias • Notação • Multiplicidade a cada par de objectos das restantes classes (1 e 2), correspondem 0 ou 1 objectos da classe 3
Atributos versus Associações • Uma propriedade que designa um objecto de uma classe presente no modelo, deve ser modelada como uma associação e não como um atributo • Exemplo: • o país Canadá é um objecto cujo atributo nome tem o valor "Canadá" (cadeia de caracteres) • a capital do Canadá é um objecto cidade e não deve ser modelada como um atributo, mas antes como uma associação entre um objecto país e um objecto cidade, cujo nome é a cadeia "Otawa"
Classe de agregados Classe de componentes Texto 1 * Parágrafo 1 * Palavra Agregação • Relação semântica “part of” • Traduz a criação de objectos mais complexos a partir de objectos mais simples • Pode-se ver como uma associação com nomes pré-definidos (contém / faz parte de) • Um texto contém 0 ou mais parágrafos • Um parágrafo faz parte de um texto • Um parágrafo contém0 ou mais palavras • Uma palavra faz parte de um parágrafo
Multiplicidade da agregação • As partes (componentes) podem ser • partilhadas ou exclusivas • dependentes ou independentes • repetidas ou únicas • obrigatórias ou opcionais ..* ..1 1.. 0.. ..* ..1 1.. 0..
Pessoa Super-classe especialização generalização Aluno Sub-classe x super-classe x objecto x x x sub-classe extensão (sub-classe) extensão (super-classe) Generalização • Relação semântica “is a” (“é um” / “é uma”) : um aluno é uma pessoa • Relação de inclusão nas extensões das classes: UoD • Relação de herança nas propriedades: A sub-classe herda as propriedades (atributos, operações e relações) da super-classe, podendo acrescentar outras
Exemplo em C++ class Pessoa {private: string nome; Data dataNascimento; public: Pessoa(string, Data); string getNome() const; Data getDataNascimento() const; int getIdade() const; void setNome(string); void setDataNascimento(Data); void imprime() const;}; class Aluno : public Pessoa {private: string curso;public: Aluno(string nm, Data, string crs); string getCurso() const; void setCurso(string); void imprime() const;};
Hierarquias de classes • Em geral, pode-se ter uma hierarquia de classes relacionadas por herança / generalização • em cada classe da hierarquia colocam-se as propriedades que são comuns a todas as suas subclasses evita-se redundância, promove-se reutilização!
Pessoa Aluno Professor Pessoa Aluno Professor Notações Alternativas para Hierarquias de classes
Polimorfismo • Numa sub-classe podem-se redefinir operações da super-classe • Polimorfismo: uma operação de uma classe comporta-se de forma diferente consoante a sub-classe do objecto a que a operação é aplicada • Caso da operação imprime() no exemplo anterior • Em UML, quando se repete (a assinatura) de uma operação numa sub-classe, quer-se dizer que a operação tem uma implementação diferente (a implementação não é herdada) • chama-se método à implementação da operação
Aspectos da generalização: Subclasses sobrepostas Subclasses incompletas Herança múltipla Classificação dinâmica Classes e operações abstractas Atributos e operações do âmbito da classe Visibilidade de atributos e operações Multiplicidade de classes e atributos Restrições Elementos derivados Relações avançadas: associação qualificada composição dependência concretização ("realization") Classes avançadas: classe parametrizada ("template") metaclasse utilitário tipo interface Sumário
ou Superclass Superclass {overlapping} {overlapping} Subclass-1 Subclass-2 Subclass-1 Subclass-2 Subclasses sobrepostas ( disjuntas) • caso em que um objecto da superclasse pode pertencer simultaneamente a mais do que uma subclasse • indicado por restrição {overlapping} • o contrário é {disjoint}(situação por omissão?)
Funcionário {incomplete} Técnico Comercial Subclasses incompletas (completas) • caso em que um objecto da superclasse pode não pertencer a nenhuma das subclasses • indicado por restrição {incomplete} • o contrário é {complete} (situação por omissão?)
Herança múltipla (simples) • ocorre numa subclasse com múltiplas superclasses • geralmente suportada por linguagens de programação OO Académico pelo menos conceptualmente, existe uma superclasse comum nomee-mail {overlapping} Só faz sentido assim! Estudante Professor curso categoria herda propriedades de Estudante e Professor e, indirectamente, de Académico (uma única vez!) Professor-Estudante redução de horário
Médico Homem função Enfermeira Pessoa sexo Mulher {complete} paciente Fisioterapeuta Paciente Classificação múltipla (simples) • caso em que um objecto pode pertencer num dado momento a várias classes, sem que exista uma subclasse que represente a intersecção dessas classes (com herança múltipla) • combinações legais: {Mulher, Paciente, Enfermeira}, {Homem, Fisioterapeuta}, ... • Geralmente não suportado pelas LPOO • Pode ser simulada por agregação de papéis
Classificação dinâmica (estática) • caso em que a(s) classe(s) a que um objecto pertence pode(m) variar ao longo da vida do objecto • indicado por estereótipo «dynamic» • geralmente não suportado por LPOO atributo discriminante (atributo de pessoa que indica a subclasse a que pertence) Gestor tarefa Engenheiro Pessoa «dynamic» Vendedor Uma pessoa que num dado momento tem a tarefa de gestor, pode noutro momento ter a tarefa de vendedor, etc.
Classe abstracta: classe que não pode ter instâncias directas pode ter instâncias indirectas pelas subclasses concretas Operação abstracta: operação com implementação a definir nas subclasses uma classe com operações abstractas tem de ser abstracta função virtual pura em C++ Notação : nome em itálico ou propriedade {abstract} Classes e operações abstractas (concretas) Icon origin: Point display()getID(): Integer RectangularIcon ArbitraryIcon height: Integerwidth: Integer edge:LineCollection display()isInside(p:Point):Bool Button Fonte: The UML User Guide, Booch et al display()
Atributo do âmbito da classe: tem um único valor para todas as instâncias (objectos) da classe, o qual está definido mesmo que não exista nenhuma instância Operação do âmbito da classe: não tem como argumento implícito um objecto da classe Notação: nome sublinhado Correspondem a membros estáticos (static) em C++ e Java Factura número: Long data: Date valor: Real últimoNumero: Long = 0 criar(data:Date,valor:Real) destruir() valorTotal(): Real retorna a soma dos valores de todas as facturas cria uma nova factura com a data e valor especificados, e um número sequencial atribuído automaticamente com base em ultimoNumero Atributos e operações do âmbito da classe (instância)
Visibilidade: + (public) : visível por todos - (private) : visível só por operações da própria classe # (protected): visível por operações da própria classe e descendentes (subclasses) Devem-se esconder todos os detalhes de implementação que não interessam aos clientes (utilizadores) da classe Também aplicável aos papéis nos extremos duma associação Toolbar # currentSelection: Tool # toolCount: Integer + getTool(i: Integer): Tool+ addTool(t: Tool) + removeTool(i: Integer) - compact() usada internamente por outras operações Visibilidade de atributos e operações
Multiplicidade de classe: número de instâncias que podem existir por omissão, é 0..* Multiplicidade de atributo: número de valores que o atributo pode tomar do tipo especificado por omissão é 1 qual a diferença em relação a especificar a multiplicidade no próprio tipo de dados do atributo? NetworkController consolePort [2..*]: Port Multiplicidade de classes e atributos 1
Restrições • Uma restrição especifica uma condição que tem de se verificar • Uma restrição é indicada por uma expressão ou texto entre chavetas ou por uma nota posicionada junto aos elementos a que diz respeito, ou a eles ligada por linhas a traço interrompido (sem setas, para não confundir com relação de dependência) • OCL - "Object Constraint Language" - pode ser usada para especificar restrições mais formalmente
Pessoa nome dataNascimento localNascimento dataFalecimento {chave candidata: (nome, dataNascimento, localNascimento)} {dataFalecimento > dataNascimento} Restrições em classes LinhaFactura Factura 1 * número artigo quantidade valor número data {chave candidata: (número)} {chave candidata: (factura.número, número)}
Restrições em associações uma factura é constituída por um conjunto ordenado de 0 ou mais linhas {ordered} LinhaFactura Factura 1 * Membro-de * * Pessoa Comité {subset} 1 * Director-de Pessoa associações mutuamente exclusivas {xor} Conta Empresa empregado empregador Pessoa Empresa * 1 trabalhador chefe 0..1 * Pessoa.empregador = Pessoa.chefe.empregador
Elementos derivados • Elemento derivado (atributo, associação ou classe): elemento calculado em função doutros elementos do modelo • Notação: barra “/” antes do nome do elemento derivado • Um elemento derivado tem normalmente associada uma restrição que o relaciona com os outros elementos
Exemplo de elementos derivados 1 * Empresa Departamento 1 empregador 1 TrabalhaEmDepartamento * Pessoa * /TrabalhaEmEmpresa dataNascimento /idade {Pessoa.empregador =Pessoa.departamento.empresa} {idade = dataActual() - dataNascimento} Movimento / TotalMensal data valor mês valor {valor = (select sum(valor) from Movimento where month(data) = mês)}
Classe B Classe A qualificador Associação qualificada Associação • Qualificador: lista de um ou mais atributos de uma associação cujos valores partem o conjunto de objectos associados a um objecto do lado do qualificador no outro extremo da associação em sub-conjuntos disjuntos • Serve para navegar ("lookup") de A para B um ficheiro pode aparecer em muitos directórios (mas só pode aparecer uma vez em cada directório, por definição de associação binária) para cada par Directório + nomeFicheiro 0..1 Ficheiro * identificador internoem UNIX Directório nomeFicheiro i-node
Relação de composição • Forma mais forte de agregação aplicável quando: • existe um forte grau de pertença das partes ao todo • cada parte só pode fazer parte de um todo (i.e., a multiplicidade do lado do todo não excede 1) • o topo e as partes têm tempo de vida coincidente, ou, pelo menos, as partes nascem e morrem dentro de um todo • a eliminação do todo propaga-se para as partes, em cascata • O todo é chamado um “compósito” • Notação: losango cheio • Membros-objecto em C++
Notações alternativas para a composição Window 1 1 1 scrollbar body 2 1 title 1 Slider Header Panel Window Window scrollbar[2]: Slidertitle: Headerbody: Panel 2 scrollbar: Slider 1 title: Header 1 body: Panel (sub-objectos no compartimento dos atributos)
elemento que depende (usa) elemento de que se depende(usado) Relação de dependência • Relação de uso entre dois elementos (não necessariamente classes), em que uma mudança na especificação do elemento usado pode afectar o elemento utilizador • Exemplo típico: classe-1 que depende de outra classe-2 porque usa operações ou definições da classe-2 • Estereótipos comuns: • «bind» - com "templates" • «derive» - com elementos derivados (dependentes) • etc.
Classs A Classe B Relação de concretização ("realization") • Relação semântica entre classes, em que uma classe (A) especifica um contrato que outra classe (B) assegura • Aplicável em geral entre classificadores (classes, casos de uso, componentes, etc.) • Normalmente usada para relacionar um interface (A) com uma classe ou componente (B) que proporciona as operações ou serviços especificados no interface
Classes parametrizadas (templates) classe parametrizada Tk: Integer parâmetros formais FArray diferente da generalização, porque não se podem acrescentar propriedades! data [k] : T parâmetros actuais «bind» (Point,3) ou ThreePoints Farray<Point,3> classe ligada ("bound") • C++: template <class T, int k> class FArray { public: T[k] data; }; typedef Farray<Point,3> ThreePoints;