projeto orientado a objetos renata araujo projeto e construção de aplicaçôes com ambiente de...
TRANSCRIPT
Projeto Orientado a Objetos
Renata Araujo
Projeto e Construção de Aplicaçôes com Ambiente de ProgramaçãoUNIRIO2002.1
Projeto Orientado a Objetos
Ciclo de Vida de Desenvolvimento de Software – Principais atividades
Definição de RequisitosDefinição de Requisitos
AnáliseAnálise
ProjetoProjeto
ImplementaçãoImplementação
TestesTestes
Projeto Orientado a Objetos
Análise de Requisitos Objetivos
Definição de RequisitosDefinição de Requisitos
AnáliseAnálise
ProjetoProjeto
Durante a fase de análise é dada prioridade ao conhecimento: do domínio do problema dos requisitos, conceitos e
operações relacionadas com o sistema.
As questões da análise se concentram em o que é o software.
Projeto Orientado a Objetos
Análise Orientada a Objetos - UML
Conjunto de artefatos UML gerados na fase de análise:
Casos de Uso Quais são os processos do domínio da aplicação
Modelo Conceitual/Classes & Objetos Quais são os conceitos e termos
Diagramas de Sequência Quais são os eventos e operações do sistema
Projeto Orientado a Objetos
Projeto – Objetivo e Resultados
Conceber uma solução lógica para o sistema
Adaptar os resultados da análise às restrições impostas pelo ambiente de implementação
Refinamento dos modelos para adequarem-se a requisistos de desempenho
AnáliseAnálise
ProjetoProjeto
ImplementaçãoImplementação
Projeto Orientado a Objetos
Projeto Orientado a Objetos
Objetivos Refinamento dos modelos obtidos na fase de análise e
construção de outros modelos para comportar decisões quanto a:
Arquitetura
Interface
Persistência
Colaboração entre objetos
Requisitos não funcionais (desempenho, segurança, confiabilidade ...)
Projeto Orientado a Objetos
Arquitetura
Decomposição do sistema em subsistemas/módulos estrutura e interface entre os subsistemas
Subsistema OO/Pacote: Conjunto de classes que agem como uma unidade e provêem
um comportamento específico para o sistema
Subsistemas podem ser alocados a diferentes processadores, facilitando o processo concorrente
Projeto Orientado a Objetos
Arquitetura em três camadas – Visão clássica
Interface de Apresentação
Lógica da Aplicação
Armazenamento
Janelas, relatórios
etc
Tarefas e regras de governam o processamento
Mecanismo de persistência
Objetos de interface
Objetos do domínio da aplicação
Objetos persistentes
Projeto Orientado a Objetos
Arquitetura multicamadas
Decomposição mais fina das camadas anteriores
Acréscimo de camadas adicionais
Administração da complexidade na implementação
Pagamento Venda
Interface com o BD Gerador de Relatório
Lógica da Aplicação
Conceitos do domínio
Serviços
Projeto Orientado a Objetos
Disposição física
As camadas podem ser dispostas fisicamente em várias configurações
Interface - Cliente Lógica e Armazenamento – Servidor
Interface e Lógica – Cliente Armazenamento - Servidor
Projeto Orientado a Objetos
Definição da Arquitetura em UML
Diagrama de Pacotes
Elementos Centrais Vendas
Conceitos do Domínio
Projeto Orientado a Objetos
Projeto Orientado a Objetos
Conjunto de artefatos gerados na fase de projeto
Descrição de Casos de Uso “reais” Projeto concreto de como o caso de uso será realizados Detalhamento da interface com o usuário
Diagramas de Colaboração Comunicação entre objetos para atender aos casos de uso
Diagramas de Classes de Projeto Detalhamento das classes do sistema com definições que
permitam sua implementação Tipos de atributos, detalhamento de serviços etc
Projeto Orientado a Objetos
Interface com Usuário
Identificação dos elementos da interface a partir dos casos de uso especificados para o sistema
Definição de Casos de Uso “Reais” A descrição de um caso de uso “real” descreve o projeto real em
termos da tecnologia de entrada e saída e sua implementação em geral.
“Design” da interface visando a usabilidade do sistema
Projeto Orientado a Objetos
Casos de Uso “reais”Caso de Uso: Comprar itens – versão 1 (pagamento somente com dinheiro)Objetivo: Capturar uma venda e seu pagamento em dinheiro.Atores: Cliente (iniciador), Caixa.Pré-condição: ... Pós-Condição: ...Descrição: Um cliente chega a um ponto de venda, trazendo vários itens que deseja comprar. O Caixa registra os itens da compra e recebe um pagamento em dinheiro. Ao término, o Cliente sai com os itens comprados. Sequência típica de eventos: Ator1. Este caso de uso começa quando um Cliente chega a um ponto de venda equipado com um POST, trazendo vários itens que deseja comprar.2. Para cada item, o Caixa registra o Código Universal de Produto (UPC) em A da Janela1. Se houver mais de um exemplar do item, a quantidade pode ser entrada opcionalmente em E. O Caixa pressiona H após cada entrada do item.4. No término da entrada de itens, o Caixa indica para o POST que a entrada de itens está completa, apertando I.
Sistema3. Acrescenta informação sobre o item à transação de vendas em andamento. A descrição e o preço do item corrente são apresentados em B e F da Janela-1.5.Calcula e exibe o total da venda em C.
A
B
C
D
E
F
G
H I J
Projeto Orientado a Objetos
Diagramas de Colaboração
Mostra como os objetos (pertencentes às classes identificadas no modelo de classes&objetos) interagem através de mensagens para cumprir tarefas (em geral definidas nos casos de uso)
:POSTentrarItem(upc,qtd)
:Venda
1:[new venda] criar()3: criar ItemdeLinha(espec, qtd)
2: espec:=especificação (upc)
:Catálogode Produtos
:EspecificaçãodeProduto
2.1: espec:=enontrar (upc)
:LinhadeItemdeVenda
1.1: criar()
3.2: adicionar(lv)
:LinhadeItemdeVenda
3.1: criar(espec, qtd)
Primeira mensagem Primeira mensagem interna
Direção da mensagem
instância
Projeto Orientado a Objetos
Diagramas de Colaboração - Notação
:VendaVenda v1:Venda
Classe: Instância: Instância nomeada:
Ligações (caminhos/associações de comunicação):
:POST :Venda
:POST :Venda
1: acrescentarPagamento( quantia:int)
Mensagens, parâmetros e valores de retorno:
:POST :Venda
1: tot := total( ) : integer
:POST
1: limpar()
Projeto Orientado a Objetos
Diagramas de Colaboração - Notação
:POST :Venda
Iteração:
:POST :Venda
1*: li := proximaLinhadeItem() : LinhadeItemdeVenda
1*: [i :=1..10] li := proximaLinhadeItem() : LinhadeItemdeVenda
:POST:Venda
Criação de instâncias:1: criar(caixa)
Projeto Orientado a Objetos
Diagramas de Colaboração - Notação
Número de sequência de mensagens:
:ClasseA :Classe B
Msg1()
:Classe C
1: Msg2()
1.1: Msg3()
1: Msg4()2.1: Msg5()
:Classe D
2.2: Msg6()
Projeto Orientado a Objetos
Diagramas de Colaboração - Notação
Mensagens condicionais:
:POSTentrarItem(upc,qtd)
:Venda1:[nova venda] criar()
:LinhadeItemdeVenda
1.1: criar()
Caminhos condicionais:
:ClasseA :Classe B
Msg1()
:Classe C
1a: [test1] Msg2()
1a.1: msg3()
1b.1: msg5()
:Classe D
:ClasseE
1b: [not test1] Msg4()
2: Msg6()
Projeto Orientado a Objetos
Diagramas de Colaboração - Notação
Coleções de objetos:
:Venda
:LinhadeItemdeVenda
1: s:= tamanho() : int
Projeto Orientado a Objetos
Conectando a Camada de Apresentação à camada de Domínio
venda:Vendapost:POST
:POSTWindow
EntrarItem()
1: entrarItem(upc, qtd)
2: [nenhuma venda] venda := getVenda() : Venda
3: t := total() : Float Classes de Apresentação/Interface
Classes de Domínio
Projeto Orientado a Objetos
Determinando Visibilidade
Para um objeto enviar uma mensagem a outro objeto, o objeto receptor deve ser visível pelo objeto emissor.
O objeto emissor deve ter algum tipo de referência ao objeto receptor para enviar sua mensagem.
:POST
prodCatalogo:CatalogodeProdutos
1: espec := especificação(upc)
No exemplo ao lado, para enviar a mensagem especificação() para o
objeto de CatalogodeProdutos, oobjeto da classe POST necessita tê-lo
visível.
Class POST {... private prodCatalago CatalogodeProdutos;...}
entrarItem(upc, qtd))
Projeto Orientado a Objetos
Tipos de Visibilidade
Visibilidade por atributo
:POST
prodCatalogo:CatalogodeProdutos
1: espec := especificação(upc)
Class POST {... private prodCatalago CatalogodeProdutos;...
entrarItem( upc, qtd ){ ... espec = prodCatalogo.especificação(upc); ... }}
entrarItem(upc,qtd)
Projeto Orientado a Objetos
Tipos de Visibilidade
Visibilidade por parâmetro
:POST
prodCatalogo:CatalogodeProdutos
1: espec := especificação(upc)
Class Venda {... construirLinhadeItem( Especificação espec, qtd ){ ... lv = new LinhadeItemdeVenda(espec, qtd); ... }}
venda:Venda2: construirLinhadeItem(espec, qtd)entrarItem(upc,qtd)
Projeto Orientado a Objetos
Tipos de Visibilidade
Visibilidade localmente declarada
:POST
prodCatalogo:CatalogodeProdutos
1: espec := especificação(upc)
Class POST {... entrarItem( upc,qtd ){ ... Venda venda = new Venda(); ... venda.construirLinhadeItem( espec, wtd ); ... }}
venda:Venda3: construirLinhadeItem(espec, qtd)
1: [nova venda] criar()entrarItem(upc,qtd)
Projeto Orientado a Objetos
Tipos de Visibilidade
Visibilidade global
Atribuir uma instância a uma variável global
Projeto Orientado a Objetos
Diagramas de Classes de Projeto
Algumas estratégias para detalhar o diagrama de classes na fase de projeto:
Identificar todas as classes participantes da solução de software. Tanto de domínio como de interface.
Identifique métodos, com seus parâmetros e tipos de retorno. Métodos necessários em todas as classes:
Construtores Métodos de Acesso aos atributos: consultar e modificar valores.
Identifique novos atributos e seus tipos. Acrescente associações necessárias para se suportar a
visibilidade entre objetos
Projeto Orientado a Objetos
Diagramas de Classes de Projeto
Métodos de Acesso
LojaString: endereçoString: nomecriarLoja()informarNome():stringintormarEndereço():stringatribuirNome( string ) atribuirEndereço( string )...
Projeto Orientado a Objetos
Diagramas de Classes de Projeto
Algumas estratégias para detalhar o diagrama de classes na fase de projeto:
Identificar todas as classes participantes da solução de software. Tanto de domínio como de interface.
Identifique métodos, com seus parâmetros e tipos de retorno. Identifique novos atributos e seus tipos. Acrescente associações necessárias para se suportar a
visibilidade entre objetos
Projeto Orientado a Objetos
Persistência
Armazenamento e recuperação de objetos
Soluções: Arquivos sequenciais – Serialização de objetos Bancos de dados orientados a objetos – Jasmine, O2 Bancos de dados relacionais – Oracle, MsAccess Outros bancos de dados: Objeto/Relacional
Dependendo da solução, haverá maior ou menor esforço para construção da interface para mapeamento dos dados para a camada de persistência.
Projeto Orientado a Objetos
Persistência
Domínio
Interface para Banco de Dados Relacional
BDOO
Banco Relacional
Arquivos
Projeto Orientado a Objetos
Persistência
A forma mais fácil de resolver o problema é a utilização dos Sistemas Gerenciadores de Bancos de Dados Orientados a Objetos (SGBDOO) Ex: O2, Ontos, ObjectStore, Jasmine, etc.
Com SGBDOOs, os objetos são transparentemente transientes quanto persistentes
Projeto Orientado a Objetos
O Problema da Persistência
Ex: Classes GerenteMatrícula e Alunoint GerenteMatrícula::IncluirNovoAluno(String nome, Date dtNascimento) {
Aluno novoAluno;int ultimoCodMatricula;
OODBMS->StartTransaction();ultimoCodMatricula = (int)OODBMS->ExecOQL(“select max(matricula) from Aluno”);Aluno novoAluno = new Aluno(ultimoCodMatricula + 1, nome, dtNascimento); OODBMS->Commit();
}
Problemas: SGBDOOs são caros e não tem o mesmo desempenho que SGBDs Relacionais
Projeto Orientado a Objetos
O Problema de Persistência
Outras Estratégias:
Serialização É basicamente um DUMP da memória para o disco. Interessante para aplicações de pequeno porte e de um usuário.
Mapeamento OO – Relacional Muito utilizado Existência de pacotes de comunicação com bancos relacionais em
linguagens OO Ex: JDBC (Java Database Connectivity)
Problema: Como fazer o Projeto da Aplicação???
Mapeamento OO – SGBDs Objeto-Relacional Raro, mas promissor se os SGBDs evoluirem.
Projeto Orientado a Objetos
Estratégias de Implementação:Ambiente O.O.
Armazenamento
Classes da Aplicação ou (Transientes)
Classes de Interface (Transientes)
Mensagens
Mensagens
Projeto Orientado a Objetos
Estratégias de Implementação:Ambiente O.O. - Relacional (1)
Classes da Aplicação ou (Transientes)
Classes de Interface (Transientes)
Mensagens
Interação com o SGBD
Tabelas Relacionais
Projeto Orientado a Objetos
Estratégias de Implementação:Ambiente O.O. - Relacional (2)
Classes do Domínio (Transientes) c/ Métodos paraManipulação do Banco
Classes da Aplicação ou (Transientes)
Classes de Interface (Transientes)
Mensagens
Mensagens
Tabelas Relacionais
Interação com o SGBD
Projeto Orientado a Objetos
Estratégias de Implementação
A escolha da estratégia de persistência com SGBDs Relacionais vai depender de decisões do projeto baseadas principalmente nos diagramas de casos de uso e de classes. Existem métodos importantes no domínio da aplicação? O volume de objetos é crítico na aplicação? Desempenho é um aspecto crítico?
Projeto Orientado a Objetos
Mapeamento OO – RelacionalRegras GeraisRegras Gerais
Para cada classe instanciável criamos uma tabela dentro do SGBD Relacional.
Os atributos de cada classe também tornam-se atributos da tabela Exceções: Atributos Implícitos (destinados à implementação de
relacionamentos) e Arrays (se não for possível)
Adicione uma chave primária em cada tabela (adote sempre o mesmo tipo, ex: LONGINT)
Os relacionamentos 1 1..* (implementados por atributos implícitos) tornam-se chave estrangeira.
Projeto Orientado a Objetos
Mapeamento OO – RelacionalRegras GeraisRegras Gerais
Os relacionamentos 1..* 1..* requerem a implementação de tabelas para associação.
Classes não-instanciáveis devem ser implementadas como visões, onde a consulta que define a visão utiliza um UNION entre as tabelas que representam especializações.
As regras podem ser mudadas caso encontre-se uma solução particular que traga benefícios de desempenho ou legibilidade.
Projeto Orientado a Objetos
Mapeamento OO – RelacionalRegras GeraisRegras Gerais
Ex:
Pessoa
nome : String
<<abstract>>
Aluno
Matricula : integer
Funcionário
MatrFuncional : Integer
Departamento
Nome : String
1..1
1..*
1..1
1..*
Curso
1..*
1..*
1..*
1..*
está matriculado em ->
1..* 1..1
É Administrado por -->
1..* 1..1
Projeto Orientado a Objetos
Mapeamento OO – RelacionalRegras GeraisRegras Gerais
Solução:Aluno(IdAluno, Nome, Matrícula)Funcionario(IdFuncionario, Nome, MatrFuncional)Curso(IdCurso, Nome, IdDepartamento)Departamento(IdDepartamento, Nome)Matriculado_em(IdAluno, idCurso)View Pessoa as
Select IdAluno, Nome, “ ALUNO ” from Aluno UNION
Select IdFuncionario, Nome, “FUNCIONARIO” from Funcionario
Projeto Orientado a Objetos
Serialização
Serialização: Acomodação dos dados de objetos em arquivos sequenciais
Streams definidas no pacote java.io especiais para persistência de objetos: ObjectInputStream ObjectOutputStream
Projeto Orientado a Objetos
Serialização
Gravando objetos...
// cria um stream the saída para um arquivo FileOutputStream out = new FileOutputStream("theTime.dat"); //associa o stream the saída a um stream de objetos (serializado) ObjectOutputStream s = new ObjectOutputStream(out); //escreve um objeto da classe string no stream (dado primitivo) s.writeObject("Today"); //escreve um objeto da classe Date no stream (dado estruturado) s.writeObject(new Date()); //libera stream para arquivo s.flush();
Ao se gravar um objeto em arquivo através da serialização, todos os seus dados (atributos) são armazenados recursivamente, inclusive se forem outro objetos.
Projeto Orientado a Objetos
Serialização
Recuperando objetos...
// cria um stream the entrada para um arquivo FileInputStream in = new FileInputStream("theTime.dat"); //associa o stream the entrada a um stream de objetos
(serializado) ObjectInputStream s = new ObjectInputStream(in); //Lê um objeto da classe String String today = (String)s.readObject(); //Lê um objeto da classe Date Date date = (Date)s.readObject();
Ao se recuperar um objeto em arquivo através da serialização, todos os seus dados (atributos) são recuperados recursivamente, inclusive se forem outro objetos.
Projeto Orientado a Objetos
Serialização
Determinando a serialização de objetos em suas classes Um objeto é serializável somente se sua classe implementa a
interface Serializable
public class MySerializableClass implements Serializable { ... }
Não é preciso definir nenhum método A serialização das instâncias desta classe é garantida pelos métodos
da classe ObjectOutputStream Estes métodos escrevem automaticamente todas as informações que
são necessárias para se gravar um objeto
Projeto Orientado a Objetos
Serialização
Em alguns casos, é preciso que o programador customize a serialização de um objeto
Para isso, há que criar os métodos writeObject e readObject para a classe que se deseja serializar os objetos:
private void writeObject(ObjectOutputStream s) throws IOException { s.defaultWriteObject(); // customized serialization code }
private void readObject(ObjectInputStream s) throws IOException {
s.defaultReadObject(); // customized deserialization code ... // followed by code to update the object, if necessary }