470 likes | 609 Views
Projeto e Construção de Aplicaçôes com Ambiente de Programação UNIRIO 2002.1. Projeto Orientado a Objetos. Renata Araujo. Ciclo de Vida de Desenvolvimento de Software – Principais atividades. Definição de Requisitos. Análise. Projeto. Implementação. Testes.
E N D
Projeto e Construção de Aplicaçôes com Ambiente de Programação UNIRIO 2002.1 Projeto Orientado a Objetos Renata Araujo
Ciclo de Vida de Desenvolvimento de Software – Principais atividades Definição de Requisitos Análise Projeto Implementação Testes Projeto Orientado a Objetos
Análise de Requisitos Objetivos Definição de Requisitos • 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. Análise Projeto 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 Análise Projeto Implementação • 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 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 Janelas, relatórios etc Interface de Apresentação Objetos de interface Lógica da Aplicação Tarefas e regras de governam o processamento Objetos do domínio da aplicação Armazenamento Objetos persistentes Mecanismo de persistência 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 Conceitos do domínio Venda Pagamento Lógica da Aplicação Interface com o BD Gerador de Relatório 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 Conceitos do Domínio Elementos Centrais Vendas 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: Ator 1. 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. Sistema 3. 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 E B F C G D 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) Primeira mensagem interna Primeira mensagem 1:[new venda] criar() entrarItem(upc,qtd) 3: criar ItemdeLinha(espec, qtd) :POST :Venda 1.1: criar() 2: espec:=especificação (upc) 3.2: adicionar(lv) Direção da mensagem :Catálogode Produtos 3.1: criar(espec, qtd) :LinhadeItemdeVenda 2.1: espec:=enontrar (upc) :EspecificaçãodeProduto :LinhadeItemdeVenda instância Projeto Orientado a Objetos
Diagramas de Colaboração - Notação Classe: Instância nomeada: Instância: v1:Venda :Venda Venda Ligações (caminhos/associações de comunicação): :POST :Venda Mensagens, parâmetros e valores de retorno: 1: tot := total( ) : integer :POST :POST :Venda 1: acrescentarPagamento( quantia:int) 1: limpar() :POST :Venda Projeto Orientado a Objetos
Diagramas de Colaboração - Notação Iteração: 1*: li := proximaLinhadeItem() : LinhadeItemdeVenda :POST :Venda 1*: [i :=1..10] li := proximaLinhadeItem() : LinhadeItemdeVenda :POST :Venda Criação de instâncias: 1: criar(caixa) :Venda :POST Projeto Orientado a Objetos
Diagramas de Colaboração - Notação Número de sequência de mensagens: Msg1() 1: Msg2() :Classe B :ClasseA 1.1: Msg3() 2.1: Msg5() 1: Msg4() :Classe C 2.2: Msg6() :Classe D Projeto Orientado a Objetos
Diagramas de Colaboração - Notação Mensagens condicionais: 1:[nova venda] criar() 1.1: criar() entrarItem(upc,qtd) :LinhadeItemdeVenda :Venda :POST Caminhos condicionais: :ClasseE 2: Msg6() 1a: [test1] Msg2() Msg1() :Classe B :ClasseA 1a.1: msg3() 1b: [not test1] Msg4() 1b.1: msg5() :Classe D :Classe C Projeto Orientado a Objetos
Diagramas de Colaboração - Notação Coleções de objetos: :Venda 1: s:= tamanho() : int :LinhadeItemdeVenda Projeto Orientado a Objetos
Conectando a Camada de Apresentação à camada de Domínio EntrarItem() 3: t := total() : Float Classes de Apresentação/Interface :POSTWindow 1: entrarItem(upc, qtd) 2: [nenhuma venda] venda := getVenda() : Venda Classes de Domínio post:POST venda:Venda 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. No exemplo ao lado, para enviar a mensagem especificação() para o objeto de CatalogodeProdutos, o objeto da classe POST necessita tê-lo visível. Class POST { ... private prodCatalago CatalogodeProdutos; ... } entrarItem(upc, qtd)) :POST 1: espec := especificação(upc) prodCatalogo:CatalogodeProdutos Projeto Orientado a Objetos
Tipos de Visibilidade • Visibilidade por atributo entrarItem(upc,qtd) :POST 1: espec := especificação(upc) Class POST { ... private prodCatalago CatalogodeProdutos; ... entrarItem( upc, qtd ){ ... espec = prodCatalogo.especificação(upc); ... } } prodCatalogo:CatalogodeProdutos Projeto Orientado a Objetos
Tipos de Visibilidade • Visibilidade por parâmetro entrarItem(upc,qtd) 2: construirLinhadeItem(espec, qtd) venda:Venda :POST 1: espec := especificação(upc) Class Venda { ... construirLinhadeItem( Especificação espec, qtd ){ ... lv = new LinhadeItemdeVenda(espec, qtd); ... } } prodCatalogo:CatalogodeProdutos Projeto Orientado a Objetos
Tipos de Visibilidade • Visibilidade localmente declarada 1: [nova venda] criar() entrarItem(upc,qtd) 3: construirLinhadeItem(espec, qtd) venda:Venda :POST 1: espec := especificação(upc) Class POST { ... entrarItem( upc,qtd ){ ... Venda venda = new Venda(); ... venda.construirLinhadeItem( espec, wtd ); ... } } prodCatalogo:CatalogodeProdutos 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 Loja String: endereço String: nome criarLoja() informarNome():string intormarEndereço():string atribuirNome( 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
Domínio Persistência Interface para Banco de Dados Relacional BDOO Arquivos Banco Relacional 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 Aluno int 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. Classes de Interface (Transientes) Mensagens Classes da Aplicação ou (Transientes) Mensagens Armazenamento Projeto Orientado a Objetos
Estratégias de Implementação:Ambiente O.O. - Relacional (1) Classes de Interface (Transientes) Mensagens Classes da Aplicação ou (Transientes) Interação com o SGBD Tabelas Relacionais Projeto Orientado a Objetos
Estratégias de Implementação:Ambiente O.O. - Relacional (2) Classes de Interface (Transientes) Mensagens Classes da Aplicação ou (Transientes) Mensagens Classes do Domínio (Transientes) c/ Métodos paraManipulação do Banco Interação com o SGBD Tabelas Relacionais 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 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 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 Gerais • Ex: <<abstract>> Pessoa nome : String Funcionário Aluno Matricula : integer MatrFuncional : Integer 1..* 1..* 1..* 1..* está matriculado em -> 1..1 1..1 1..* 1..* É Administrado por --> Departamento Curso Nome : String 1..* 1..* 1..1 1..1 Projeto Orientado a Objetos
Mapeamento OO – RelacionalRegras 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 } Projeto Orientado a Objetos