1
Programação com Objectos
Processamento de Dados I
Programação com Objectos / Processamento de Dados I 2
3. UML (Unified Modeling Language)
|
Modelo
| UML
Programação com Objectos / Processamento de Dados I 3
3. UML (Unified Modeling Language)
|
Modelo
z O desenvolvimento de programas orientados aos objectos assenta na construção de um modelo.
z O modelo é uma abstracção dos aspectos essenciais do problema.
z O modelo estrutura o problema e permite detectar omissões e inconsistências.
z O modelo é um passo intermédio entre o enunciado do problema e a solução.
z Um sistema de análise descreve os modelos (i.e., representações limitadas) da aplicação a desenvolver.
z Aumenta a legibilidade (menos informação que o código, permitindo visualizar globalmente a aplicação).
z Mostra a estrutura da aplicação, sem detalhes de implementação. z A representação gráfica incrementa a clareza semântica.
z Devido à complexidade, a abordagem OO é descrita por vários modelos, onde cada modelo aborda um aspecto particular.
Programação com Objectos / Processamento de Dados I 4
3. UML (Unified Modeling Language)
|
UML
| UML - Unified Modeling Language resulta da fusão de vários
sistemas de análise:
z Booch (G. Booch) z OOSE (I. Jacobson) z OMT (J. Rumbaugh)
| 1ª proposta divulgada em 1997 (1999 -v1.1, 2000 -v1.3, 2001 -v1.4, 2003 -v1.5, Abril 2004 -v2.0)
| Ferramentas de desenho UML:
z Rational Rose
Programação com Objectos / Processamento de Dados I 5
3. UML (Unified Modeling Language)
|
UML
z Em UML os modelos de software são representados por um conjunto de diagramas
z Estes são criados e utilizados durante a fase de análise e, posteriormente, como ferramenta de comunicação com os programadores
z Os modelos são constituídos por objectos (com os seus atributos e comportamentos) que interactuam entre si através do envio de mensagens
Programação com Objectos / Processamento de Dados I 6
3. UML (Unified Modeling Language)
|
UML
z UML v2 disponibiliza 13 diagramas, agrupados em:
• Modelação estrutural (pacotes, classes, objectos, estrutura
composicional, componentes, aplicação física).
• Modelação de comportamento (use case, actividade, máquina
de estados, comunicação, sequência de mensagens, temporização, enquadramento das interacções).
Programação com Objectos / Processamento de Dados I 7
3. UML (Unified Modeling Language)
|
Diagrama de classes
z Um diagrama de classes dá uma panorâmica geral do sistema, mostrando as suas classes e as relações entre elas.
z Os diagramas de classe são estáticos, ou seja mostram o que interage, mas não o que acontece quando a interacção acontece
z Apenas relações estáticas: que classes constituem outra, que classes uma dada classe conhece e usa, etc.
z A identificação dessas classes e suas relações no enunciado do problema tem de ser feita previamente.
z O diagrama de classes é um grafo: • Os nós são classes de objectos
Programação com Objectos / Processamento de Dados I 8
3. UML (Unified Modeling Language)
|
Diagrama de classes
|Representação das classes
z Uma classe é representada por um rectângulo dividido em três secções:
• Identificador (nome da classe); • Atributos; • Métodos. getNome (): String getNumTelefone (): long getNumBI (): long setNome (nome:String) setNumTelefone (numTelefone:long) setNumBI (numBI: long)
nome: String numTelefone: long numBI: long Pessoa Identificador Atributos Métodos
Programação com Objectos / Processamento de Dados I 9
3. UML (Unified Modeling Language)
|
Diagrama de classes
| Representação dos membros da classe
z Especificação dos atributos:
[visibilidade] nome :tipo [multiplicidade] [=valor por omissão]
• + public
• - private
• # protected
• ~ package
z Especificação dos métodos:
[visibilidade] nome (lista dos argumentos:tipo) [:tipo de retorno]
Programação com Objectos / Processamento de Dados I 10
3. UML (Unified Modeling Language)
|
Diagrama de classes
| Representação da classe Conta+ setTitular (titular: Pessoa) + setSaldo (saldo: float) + getTitular (): Pessoa
+ levantamento (valor: float) + deposito (valor: float)
+ consultarSaldo (): float - incNumContas () - decNumContas() - saldo: float - titular: Pessoa - numContas: int Conta
Programação com Objectos / Processamento de Dados I 11
3. UML (Unified Modeling Language)
|
UML
| Representação dos objectos da classe
z Um objecto de uma classe é representado por um rectângulo dividido em duas secções:
• Nome_do_objecto: nome_da_classe • Valores_dos_atributos
nome: Ana Maria
numTelefone: 296123456 numBI: 123456789
Programação com Objectos / Processamento de Dados I 12
3. UML (Unified Modeling Language)
|
Exercício
Observe com atenção a seguinte sequência de
imagens
Programação com Objectos / Processamento de Dados I 20
Algumas questões
|
O que visualizamos nas imagens anteriores?
Portas
•Como podemos caracterizar então uma porta?
Atributos
•Para além das suas características o que
diferencia as portas apresentadas?
Programação com Objectos / Processamento de Dados I 21
Estados de uma porta
Aberta Fechada Trancada fechar abrir trancar destrancar
Programação com Objectos / Processamento de Dados I 22
Solução 1: Classe Porta
Porta
- aberta: boolean
-- fechada: boolean -- trancada: boolean
+ Porta (open: boolean, closed:boolean, locked:boolean)
+ setEstado (open: boolean, closed:boolean, locked:boolean): void + isAberta():boolean
+ isFechada(): boolean +isTrancada():boolean
Programação com Objectos / Processamento de Dados I 23
Solução 2: Classe Porta
Porta
- aberta: boolean
-- fechada: boolean -- trancada: boolean
+ Porta (open: boolean, closed:boolean, locked:boolean) + abrir (): void + fechar(): void + trancar(): void + isAberta():boolean + isFechada(): boolean +isTrancada():boolean
Programação com Objectos / Processamento de Dados I 24
Solução 3: Classe Porta
Porta
- estado: String
+ Porta (estado: String)
+ setEstado (estado: String): void + getEstado(): String
+ isAberta():boolean + isFechada(): boolean +isTrancada():boolean
Programação com Objectos / Processamento de Dados I 25
Solução 4: Classe Porta
Porta
- estado: int
+ Porta (estado: int) + abrir() :void + fechar() :void + trancar() :void + destrancar():void + isAberta(): boolean + isFechada(): boolean +isTrancada():boolean
Programação com Objectos / Processamento de Dados I 26
3. UML (Unified Modeling Language)
|
UML
|
Relações entre objectos
z Os objectos não vivem isolados e nos programas são estabelecidas relações de cooperação.
z Uma relação não é mais do que uma conexão entre elementos.
z Existem diferentes tipos de relações:
• Associação: relaciona objectos entre si.
• Composição/Agregação: relação que denota o todo constítuido
por partes.
• Herança: mecanismo de generalização – especialização de
classes.
• Realização: uma classe implementa a funcionalidade definida
Programação com Objectos / Processamento de Dados I 27
3. UML (Unified Modeling Language)
|
UML
|
Associação
z Uma associação representa uma relação semântica entre as classes participantes da relação:
• Podem ter um nome (etiqueta) - pode ter uma seta que indica a direcção em que o nome deve ser lido
• O número de objectos que podem participar na associação
• O papel que cada classe desempenha na associação
z Uma associação entre classes é representada através de uma linha.
Programação com Objectos / Processamento de Dados I 28
3. UML (Unified Modeling Language)
|
UML
|
Especificação da associação
z Cada associação tem dois papéis;
z Os papéis fazem parte da associação e não da classe, porque uma mesma classe pode ter diferentes papéis em diferentes associações
Classe A etiqueta Classe B
papel de B papel de A
Empresa Trabalha para Pessoa
empregado empregador
Programação com Objectos / Processamento de Dados I 29
3. UML (Unified Modeling Language)
|
UML
|
Especificação da associação
z A multiplicidade de uma associação traduz o nº de instâncias de uma classe que se podem associar com uma única instância das restantes classes.
• 1: Uma única instância
• 0..1: zero ou uma instância
• * ou 0..*: zero ou mais instâncias
• n..*: n ou mais instâncias
• 5..10: 5 a 10 instâncias (temos instâncias mais complexas)
Classe A etiqueta Classe B
papel de B papel de A multiplicidade de A multiplicidade de B
Empresa Trabalha para Pessoa
empregado empregador
Programação com Objectos / Processamento de Dados I 30
3. UML (Unified Modeling Language)
|
UML
|
Classes de associações
z Uma associação pode ser ela própria descrita como uma classe –
classe associativa.
z O identificador da associação para a ser o nome da classe.
1 1..*
Programação com Objectos / Processamento de Dados I 31
3. UML (Unified Modeling Language)
|
UML
|
Associações reflexivas
z São associações entre objectos da mesma classe.
z Os papéis são fundamentais neste caso pois são eles que permitem perceber a associação existente.
Programação com Objectos / Processamento de Dados I 32
3. UML (Unified Modeling Language)
|
UML
|
Agregação/Composição
z A agregação é uma associação, que denota uma relação do todo ser formado por partes.
z A agregação é dita como sendo uma relação de “has-a”.
z Representada como uma associação com um pequeno diamante não preenchido no extremo relativo ao todo.
Programação com Objectos / Processamento de Dados I 33
3. UML (Unified Modeling Language)
|
UML
|
Agregação/Composição
z Na composição, o desaparecimento do todo conduz ao desaparecimento das partes.
z Representada como uma associação com um pequeno diamante preenchido no extremo relativo ao todo.
Programação com Objectos / Processamento de Dados I 34
3. UML (Unified Modeling Language)
|
UML
|
Agregação/Composição
z De uma maneira geral tanto a agregação como a composição não têm identificador, pois o significado destas relações está representada pelo próprio par todo-partes.
z A multiplicidade deve aparecer em ambos os extremos.
z Quando a multiplicidade é omitida, considera-se que é exactamente 1.
Programação com Objectos / Processamento de Dados I 35
|
Exercício
Considere a seguinte situação:
“1 banco tem vários clientes. Cada cliente pode
ter 1 ou várias contas, sendo o cliente o seu titular.
Para existir uma conta deve de estar sempre
afecta a um cliente (o seu titular), podendo no
entanto ter outros dois clientes como titulares
secundários.
Descreva um diagrama de classes e inclua as
suas relações.
Programação com Objectos / Processamento de Dados I 36
3. UML (Unified Modeling Language)
|
UML
|
Herança
z Princípio Aberto-Fechado
• Fecho: devem estar desenvolvidos para que o programa possa ser usado sem alterações.
• Abertura: classes devem estar abertas para extensão, por forma a incorporar alterações com o mínimo impacto no sistema.
Programação com Objectos / Processamento de Dados I 37
3. UML (Unified Modeling Language)
|
UML
|
Herança
z A herança é um mecanismo em que a subclasse constitui uma especialização da superclasse. A superclasse pode ser vista como generalização das subclasses.
z A herança é dita como uma relação “is-a”.
z As subclasses herdam os atributos e métodos das superclasses. Novos atributos e métodos podem ser adicionados às subclasses.
z O polimorfismo é a redefinição de métodos, da superclasse nas subclasses, com a mesma assinatura.
z Em POO o polimorfismo é normalmente implementado através de
ligação dinâmica (o método a ser executado é determinado
Programação com Objectos / Processamento de Dados I 38
3. UML (Unified Modeling Language)
|
UML
|
Herança
| Vantagens da herança:
z Maior legibilidade, pois as superclasses descrevem os aspectos comuns.
z Facilita alterações, porque normalmente estas incidem apenas nos aspectos particulares.
z Promovem a reutilização do código das superclasses.
| Inconvenientes da herança:
Programação com Objectos / Processamento de Dados I 39
3. UML (Unified Modeling Language)
|
UML
|
Herança
z Na herança simples cada subclasse tem apenas uma superclasse (directa).
z Na herança múltipla uma subclasse pode ter mais do que uma superclasse (directa).
Programação com Objectos / Processamento de Dados I 40
3. UML (Unified Modeling Language)
|
UML
|
Herança
| A herança simples é representada por uma seta não preenchida das
Programação com Objectos / Processamento de Dados I 41
3. UML (Unified Modeling Language)
|
UML
|
Herança
| A herança múltipla é representada por uma seta não preenchida da
Programação com Objectos / Processamento de Dados I 42
3. UML (Unified Modeling Language)
|
UML
|
Herança
| Classe não extensível
z Classe sem superclasses: representada com a propriedade {root}
escrita por baixo do identificador da classe.
z Classe sem subclasses: representada com a propriedade {leaf}
Programação com Objectos / Processamento de Dados I 43
3. UML (Unified Modeling Language)
|
UML
|
Herança
| O UML permite ainda especificar que um determinado método que
não pode ser redefinido em subclasses. Tais métodos são representados com a propriedade {leaf} escrita depois da assinatura do método.
Programação com Objectos / Processamento de Dados I 44
EXERCÍCIO:
Venda de bebidas
Considere uma loja cuja área de negócio é a venda de
bebidas. A loja vende dois tipos de bebidas:
cerveja
e
whisky
. Estas bebidas são engarrafadas pela própria loja,
sendo a loja responsável por manter a quantidade
disponível de cada bebida para vender.
Para cada tipo de bebida as garrafas comercializadas
poderão ser de:
- Cerveja: 25 cl, 33 cl e 1 L.
- Whisky: apenas de 75 cl.
Programação com Objectos / Processamento de Dados I 45
EXERCÍCIO:
Funcionalidade da loja
Quando se cria uma nova loja é necessário indicar o seu nome, e as capacidades iniciais (em litros) disponíveis de cerveja e whisky, respectivamente.
A qualquer momento é possível saber as quantidades disponíveis para venda de qualquer uma das bebidas através dos seguintes métodos:
capCerveja e capWhisky. Também é possível obter o nome da loja
através do método nomeLoja.
A loja permite a venda de garrafas de cerveja (método vendeCerveja, o qual devolverá a garrafa de cerveja pretendida), tendo que ser indicada a capacidade pretendida da garrafa a vender. Deve imprimir a seguinte mensagem: Loja <nome da loja> vendeu garrafa de cerveja de " <capacidade da garrafa> " cl.
A loja permite também a venda de garrafas de whisky (método
vendeWhisky, o qual devolverá a garrafa de whisky pretendida). Deve
imprimir a seguinte mensagem: Loja <nome da loja> vendeu garrafa de whisky.
Programação com Objectos / Processamento de Dados I 46
EXERCÍCIO:
Funcionalidade da loja
Em qualquer um dos casos, se a capacidade disponível da bebida escolhida for inferior à quantidade a vender, então o método de venda invocado deve retornar a referência para objecto null.
Finalmente, a loja pode comprar mais cerveja e whisky de forma a aumentar o stock de bebida disponível na loja. Esta funcionalidade deve ser representado pelos métodos: compraCerveja e compraWhisky, que irão aumentar a quantidade de bebida disponível na loja. Ambos os métodos recebem como argumento o número de litros de bebida a adicionar ao stock de loja.
Programação com Objectos / Processamento de Dados I 47
EXERCÍCIO:
Funcionalidade da garrafa de cerveja
Uma garrafa de cerveja tem uma dada quantidade de cerveja. É
possível saber se está cheia (através do valor booleano retornado
pelo método estaCheia) ou vazia (através do valor booleano
retornado pelo método estaVazia) e qual a quantidade bebida ainda
presente na garrafa (através do método quantGarrafa).
Tem ainda a funcionalidade de se poder beber uma dada
quantidade da garrafa (representado pelo método bebeCerveja). Se
se pretender uma quantidade maior que a presente na garrafa, este
método deve devolver false e deixar a garrafa com a quantidade
inalterada. Se a quantidade presente na garrafa for maior ou igual à
que se quer beber então este método deve devolver true.
Programação com Objectos / Processamento de Dados I 48
EXERCÍCIO:
Funcionalidade da garrafa de whisky
Uma garrafa de whisky tem uma dada quantidade de whisky.
É possível saber se está cheia (através do valor booleano retornado pelo método estaCheia) ou vazia (através do valor booleano retornado pelo método estaVazia) e qual a quantidade bebida ainda presente na garrafa (através do método quantGarrafa).
Tem ainda a funcionalidade de se poder beber, de cada vez, 15 cl da garrafa (representado pelo método bebeWhisky). Se se pretender uma quantidade maior que a presente na garrafa, este método deve devolver
false e deixar a garrafa com a quantidade inalterada. Se a quantidade
presente na garrafa for maior ou igual à que se quer beber então este método deve devolver true.
Programação com Objectos / Processamento de Dados I 49
EXERCÍCIO:
Outras funcionalidades
| Para a classe Loja deverá implementar o método equals que deverá
comparar duas lojas. Considere que as lojas serão iguais se tiverem o mesmo nome.
| Para uma garrafa deve ser implementado o método toString que
deverá devolver a seguinte String: “Garrafa de <tipo_de_bebida> ainda com <quantidade_de_bebida_disponível>”
Programação com Objectos / Processamento de Dados I 50
EXERCÍCIO:
Objectivos
| Especifique em UML o diagrama de classes referente à situação descrita acima. | Implemente, em Java, as classes participantes do sistema declarando os seus
atributos e os métodos necessários para o seu correcto funcionamento.
| Implemente a classe Java de execução DemoLojas que execute os seguintes passos:
z Crie uma loja com o nome "Bar Académico" e com uma quantidade inicial de 5L de
cerveja e 3L de whisky.
z Vende 4 garrafas de cerveja de 1L, 2 de 33 cl e uma de 25 cl.
z Invoque o método toString sobre cada uma destas garrafas.
z Beba 33cl de todas as garrafas criadas.
z Invoque novamente o método toString sobre cada uma destas garrafas.
z Vende mais uma garrafa de cerveja de 25cl.
z Vende 4 garrafas de whisky.
z Invoque o método toString sobre cada uma destas garrafas.
z Bebe uma vez das primeiras três garrafas de whisky e duas vezes da quarta
garrafa.
z Invoque novamente o método toString sobre cada uma destas garrafas.
z Vende mais uma garrafa de whisky.
z Compre 5L de whisky.
z Vende mais uma garrafa de cerveja de 25cl.