Baixe o app para aproveitar ainda mais
Prévia do material em texto
1 1 TÉCNICAS DE PROGRAMAÇÃO 1 Fernando Albuquerque Tópicos Decomposição de problemas usando classes e objetos. Técnicas de desenho e programação orientada a objetos. Reuso com herança e composição de classes. Polimorfismo por subtipos/parametrizado. Tratamento de exceções. Tópicos especiais (distribuição, concorrência). Técnicas avançadas de modularização. 2 2 CONCEITOS DE BASE 3 4 Introdução Decomposição de um sistema: 1. Sistema 2. Subsistema 3. Programa 4. Módulo 5. Classe 6. Função 7. Bloco de código 8. Linha de código Complexidade decrescente. 3 5 Introdução Sistema: • Composto por um conjunto de elementos. • Elementos são conectados. • Elementos conectados compõem um todo. • Um sistema pode ser descrito por um ou mais modelos. • Sistema computacional composto por hardware e software. • Sistema computacional processa dados com um objetivo bem definido. 6 Introdução Subsistema: • Um sistema que é parte de um outro sistema. • Possibilita a decomposição de sistemas complexos. Programa: • Lista organizada de instruções passo-a-passo. • Escrito para uma arquitetura de computador. • Escrito em uma linguagem de programação. • Faz o computador se comportar de uma certa forma. • É composto por um ou mais módulos. 4 7 Introdução Módulo: • Elemento auto-contido de um programa. • Implementa conceitos lógicos bem delimitados. • Tem interfaces bem definidas. • Agrupa partes de programas e estruturas de dados. • É uma unidade de compilação independente. • Pode ser independentemente desenvolvido. • É combinado com outros módulos na ligação (link). • É composto por um ou mais arquivos. • Pode conter várias rotinas e classes. • Promove o encapsulamento. 8 Introdução Interface: • Expressa elementos providos e requeridos. • Elementos em uma interface são visíveis externamente. • Implementação contém código que realiza a interface. • Estabelece-se um relacionamento entre cliente e servidor. • Uma interface possui sintaxe. • A sintaxe são as regras e restrições aplicáveis. • Uma interface possui semântica. • Semântica é o significado da interface.. • Um protocolo de uso determina como usar uma interface. 5 9 Introdução Programas Interfaces Módulos 10 Introdução Encapsulamento: • Aspectos internos escondidos do mundo externo. • Maior controle sobre os efeitos das manutenções. • Unidades podem ser alteradas sem afetar seus usuários. • Os dados são escondidos dentro das unidades. • Os acessos aos dados ocorrem via códigos apropriados. 6 11 Introdução A decomposição dos módulos em funções apresenta alguns inconvenientes: dados e códigos são fracamente acoplados, isso pode dificultar a construção e a manutenção do software. 12 Introdução MÓDULO variáveis globais função ( ) { variáveis locais código } função ( ) { variáveis locais código } 7 13 Introdução VARIÁVEIS GLOBAIS Função 1 ( ) { variáveis locais código } Função N ( ) { variáveis locais código } As variáveis não estão encapsuladas 14 Introdução A orientação a objetos existe há décadas. É considerado um paradigma fundamental no desenvolvimento de softwares. Softwares desenvolvidos segundo a orientação os módulos são decompostos de tal modo que variáveis e códigos relacionados são mantidos acoplados. 8 15 Introdução MÓDULO VARIÁVEIS função ( ) { variáveis locais código } função ( ) { variáveis locais código } VARIÁVEIS função ( ) { variáveis locais código } função ( ) { variáveis locais código } 16 Classes Introdução: • Padrões a partir dos quais objetos são criados • Especificam comportamento comum aos objetos • Descrevem a estrutura de um objeto • Objetos de uma mesma classe são idênticos • Contém a declaração de atributos e métodos Responsabilidades de uma classe: • Comportamento estático. • Comportamento dinâmico. 9 17 Classes 18 Classes Atributos: • Definem o comportamento estático das instâncias. • Apresentam nome e valor. • Tem os seus valores restritos à uma faixa. • Podem ter valores default iniciais. • Podem ter valores fixos ou variáveis. • Podem ter valores diferentes para cada instância. • Podem ter valores iguais para cada instância. 10 19 Classes Métodos: • Definem o comportamento dinâmico de uma classe. • Controlam o acesso aos atributos. • Atributos são encapsulados. • Se diz que os métodos são invocados. • Métodos podem ser públicos ou privados. • Métodos privados são de uso interno. • Métodos públicos definem serviços. 20 Classes VARIÁVEIS Método 1 ( ) { variáveis locais código } Método N ( ) { variáveis locais código } As variáveis estão encapsuladas 11 21 Classes Erros comuns: • Classes que modificam atributos de outras classes. • Classes com muitas responsabilidades. • Classes sem responsabilidades. • Classes com responsabilidades não utilizadas. • Nomes que levam à uma incorreta interpretação. • Classes com responsabilidades não relacionadas. • Uso não apropriado de herança. • Responsabilidades replicadas em classes. 22 Classes Recomendações quanto aos métodos: • Implementar o código visando facilitar o entendimento. • Usar nomes de métodos e atributos significativos. • Evitar abreviações confusas. • Realizar uma atividade claramente definida. • Métodos devem ser pequenos. • Centralizar código comum. • Centralizar métodos comuns e herdar. • Esconder a estrutura interna de uma classe. • Esconder as estruturas de dados usadas pelos métodos. • Classificar os métodos como públicos ou privados. 12 23 Classes Métodos abstratos: • Compostos por uma assinatura sem implementação. • Classes com métodos abstratos são abstratas. • Não podem haver instâncias de uma classe abstrata. • Sub-classes podem prover a implementação. • Sub-classes sem implementação são abstratas. 24 Objetos Introdução: • São instâncias das classes. • Classes descrevem estruturas das instâncias. • Podem existir múltiplos objetos de mesma classe. • Estado do objeto escondido do mundo exterior. • Estado definido pelas operações anteriormente executadas. • Métodos determinam a interface com o objeto. • A um objeto tem-se associado um identificador (uoid). 13 25 Objetos VARIÁVEIS 1 Método 1 ( ) { variáveis locais código } Método N ( ) { variáveis locais código } VARIÁVEIS 2 Objetos 26 Objetos As informações em um sistema orientado a objetos são armazenadas dentro de objetos e são manipuladas quando o objeto é ordenado a executar uma ação. 14 27 Interações entre objetos Alternativas de interação: • Produtor-consumidor apresenta apenas comunicação em uma única direção, por exemplo, quando o usuário seleciona uma opção em um menu. • Cliente-servidor apresenta comunicação em duas direções, um cliente solicita um serviço e espera por uma resposta. • Metodologias usam diagramas de interação de modo a descrever os padrões de interação entre instâncias das classes. 28 Interações entre objetos Mensagem: • Possibilita a interação entre os objetos • Ocorre via chamadas a métodos. • Contém nome do objeto, do método e parâmetros. cliente servidorsolicitação resposta produtor consumidor mensagem 15 29 Interações entre objetos xxx xxxxxx xxxx xxxxxx Modelo conceitual Modelo conceitual Implementação convencional Implementação orientada a objetos 30 Interações entre objetos Polimorfismo: • Diferentes reações à um mesmo nome de mensagem. • Mesmo identificador para mesma ação lógica. • Nomes de operadores e funções sobrecarregados. Métodos similares devem ter: • Os mesmos nomes. • A mesma ordem dos argumentos. • Os mesmos tipos dos argumentos. • Os mesmos tipos de valores retornados. • As mesmas notificações de erros. 16 31 Interações entre objetos Static binding: • Mais seguro. • Erros identificados em tempo de compilação. • Mais eficiente. • Resolução é executada apenas uma vez. Dynamic binding: • Mais flexível. • Modificações podem ser facilmente adaptadas. 32 Interações entre objetos Sobrecarga: • Podem existir métodos com um mesmo nome. • Cada método deve ter uma assinatura diferente. • Compilador compara as assinaturas. Exemplo: public CalculaMedia ( ); public CalculaMedia ( int e ); public CalculaMedia ( int e , int f ); Diferentes quantidades ou tipos de parâmetros. 17 33 Estados e eventos Estados: • Durante a execução de um programa, alguns objetos de comportamento dinâmico complexo passam por diversos estados • O estado de um objeto é definido pelos valores dos seus atributos e ligações • Uma transição entre estados ocorre após a conclusão de operações ou em resposta a eventos • Estados e transições são representados através de diagramas de estados 34 Estados e eventos Inicializa Inat S1 S2 S3 Menu Ejeta cartão Lê cartão Lê senha Apresenta Menu Fim 18 35 Estados e eventos Eventos: • São descritos por classes. • Quando o evento ocorre a classe é instanciada. • Cada classe contém os atributos que descrevem o evento. • Classes que descrevem eventos semelhantes são agrupadas em hierarquias. • Quando um evento ocorre, é comunicados ao interessado. 36 Herança entre classes Introdução: • Possibilita reutilização de classes. • Classes podem herdar variáveis e métodos. • Possibilita especialização e generalização. • Podem haver múltiplos níveis. • Classes são organizadas em hierarquias. • Herança definida em tempo de compilação. • Declaração de uma classe pode incluir as classes das quais são herdados atributos e métodos. • Métodos e atributos da super-classe devem ser aplicáveis às subclasses. 19 37 Herança entre classes 38 Herança entre classes Situações de generalização e especialização: • Atributo adicional. • Restrições quanto ao valor do atributo. • Atributo passando a ter valor constante. • Método adicional. • Redefinição de método. 20 39 Herança entre classes BASE DERIV 1 ativar () DERIV 2 ativar () a.ativar () b.ativar () c.ativar () BASE DERIVADA DERIVADA 40 Herança entre classes Herança simples e múltipla: A B C D E A B C D E 21 41 Herança entre classes Ambigüidade em herança múltipla: A - f ( ) ? O método é herdado via os dois ramos da hierarquia. Algumas linguagens contém operadores para resolução de escopo. 42 Herança entre classes Inserindo na hierarquia: A A B - f ( ) C - f ( ) D - f ( ) B - f ( ) C - f ( ) A D B - f ( ) C - f ( ) D E 22 43 Herança entre classes Alterando a hierarquia: A A BC B D E C F D E DESEJA-SE ABF 44 Herança entre classes Bibliotecas: • Depósitos de classes reutilizáveis. • Objetivo é programar reutilizando classes. • Classes organizadas em hierarquias. • Compartilhamento determinado pela herança. Exemplos de bibliotecas: • Interface com o usuário. • Gráficas. • Comunicação de dados. 23 45 Herança entre classes 46 Herança entre classes Desenvolvimento de bibliotecas: • Estudar o domínio da aplicação. • Definir as interfaces com as classes. • Ajustar interface de modo a torná-la intuitiva. • Refinar interface facilitando reutilização. • Verificar possibilidade de derivação. • Verificar impacto sobre classes na hierarquia. • Codificar e integrar à hierarquias já existentes. • Testar e documentar a implementação. 24 Persistência Objetos são copiados de uma memória rápida e volátil para uma memória secundária lenta e não volátil. Usado um SGBD de modo a tornar transparente ao desenvolvedor os detalhes envolvidos no armazenamento. 47 Persistência Responsabilidades do SGBD : • Controle de concorrência. • Manutenção da consistência em caso de erros. • Método para acesso fácil aos dados. Necessário SGBD quando : • Existem informações persistentes. • Diferentes aplicações compartilham os dados. • Pesquisas e relatórios complexos envolvendo dados. • Aplicação apresenta característica transacional. • Número de instâncias é muito elevado. 48 25 Persistência A especificação e os modelos gerados na análise devem ser estudados de modo a se identificar que objetos precisam ser persistentes. 49 Persistência APLICAÇÃO CLASSES CONTAINERS BANCO TECNOLOGIA INTERFACE DADOS PROTOCOLO DE ACESO 50 26 Persistência Bancos de dados orientados a objetos : • Armazenam objetos. • Simplifica o uso de bancos de dados em projetos orientados a objetos. • Facilita persistência de objetos complexos. • Maioria dos produtos comerciais não utilizam uma linguagem específica para acesso aos dados. • Usam diretamente uma linguagem de programação. • O projeto da base de dados é integrada à análise e ao projeto da aplicação. 51 Persistência Requisitos de um ODBMS : • Suporte à noção de objetos complexos. • Cada objeto deve ter uma identidade. • Suporte ao encapsulamento dos dados. • Suporte ao comportamento dos objetos. • Suporte à implementação de hierarquias e herança. • Possibilidade de definição de novas classes. 52 27 MODELAGEM 53 Linguagens de modelagem A Unified Modeling Language: • É uma popular linguagem de modelagem. • O desenvolvimento da UML foi iniciado em 1994 e 1995 quando Booch, Rumbaugh e Jacobson passaram a trabalhar na Rational. • A UML pode ser usada para especificar as decisões tomadas nas fases de análise, projeto e implementação. 28 Linguagens de modelagem Diagramas na UML : • Diagramas de classes • Diagramas de objetos • Diagramas de casos de uso • Diagramas de seqüências • Diagramas de colaborações • Diagramas de atividades • Diagramas de componentes • Diagramas de implantação Organização de modelos Pacotes na UML : • Mecanismo para organizar elementos relacionados. ContaEspecial ContaInvestimento ContaCorrente Cliente ControleContas 29 Organização de modelos Relacionamentos entre pacotes : • Importação • Generalização Importação : Sensores Controlador Gerente <<import>> <<import>> +Temperatura +Volume #Alarme + MonitorTemperatura + MonitorVolume + SupervisorGeral + SupervisorAlarmes Organização de modelos • A importação possibilita o acesso aos elementos públicos em um outro pacote. • Os elementos no pacote que importou tem acesso aos elementos no pacote importado. • A parte pública de um pacote contém os elementos exportados. • A importação não é transitiva , os elementos de um pacote só tem acesso aos elementos dos pacotes que tiverem sido explicitamente importados. • Se os elementos de um pacote A são visíveis aos elementos de um pacote B, são também visíveis aos elementos dos pacotes contidos em B. 30 Organização de modelos Generalização : • Pacotes podem herdar elementos públicos e protegidos de outros pacotes. • Pacotes podem substituir ou acrescentar elementos. GuiXWin Gui + Radio + Formulario + CheckBox + Botao + Formulario Representando classes Classes : Nome Atributos Métodos Pessoa nome nascimento endereço telefone RG CPF Pessoa -nome:String -nascimento:Date -endereço:String -telefone:Integer -RG:Integer -CPF:Integer 31 Representando classes Nomes das classes : • Nome simples Button • Nome de trajeto java::awt::Button • Texto composto por letras, números e alguns caracteres de pontuação Motor ContaCorrente java :: awt :: Button Representando classes Nomes dos atributos : • Texto como no caso dos nomes das classes. • Pode ser especificado o tipo do atributo e um valor inicial. Propriedades : • changeable • addOnly • frozen [visibilidade] nome[multiplicidade][ [: tipo][ = valor_inicial] [{propriedades}] 32 Representando classes Nomes dos métodos : • Texto como no caso dos nomes das classes. • Pode ser especificado o nome, o tipo e o valor default dos parâmetro e um tipo de retorno. • Os parâmetros tem a sintaxe seguinte. [visibilidade] nome [(parametros)] [: tipo-retorno][ {propriedades}] [direção] nome : tipo [ = valor-default ] Representando classes Direções : • in parâmetro de entrada não modificável • out parâmetro de saída, modificável • inout parâmetro de entrada modificável Propriedades : • isQuery estado do objeto não é modificado • sequential execução tem que ser seqüêncial • guarded • concurrent possibilita a execução concorrente 33 Representando classes Visibilidade : • público + • protegido # • privado - Pessoa -nome:String -nascimento:Date -endereço:String -telefone:Integer -RG:Integer -CPF:Integer Conta Corrente -cliente:String -endereço:String -telefone:Integer -RG:Integer -CPF:Integer -saldo:Real = 0 + depositar ( valor : Real ) + sacar ( valor : Real ) : Real + obterExtrato ( ) : Real Representando classes Escopo : • instance • classifier Conta Corrente -cliente:String -endereço:String -telefone:Integer -RG:Integer -CPF:Integer -codigoBanco Atributos de instância Atributo de classe 34 Representando classes Multiplicidade de um atributo : 1 ControladorComunicação -portaSerial [2..*] Multiplicidades Representando objetos Objetos : Autor : Pessoa -nome = “Pedro Silva” -endereço = “Brasilia” -telefone = 2733589 -RG = 5889993 -CPF = 23887877 O nome de uma instância é sublinhado. Os nomes dos objetos e das classes são opcionais. 35 Representando objetos Nomes para as instâncias : • nomes simples a:Botao • nomes de trajeto b:java::awt::Botao Alternativas para nomes nos diagramas : BotaoOK a : CheckBox : CampoTexto : Cliente Instâncias anônimas Instâncias com nomes Múltiplas instâncias Representando objetos Pedro : Cliente nome = “Pedro Silva” idade = 45 CPF = 445633 Artur : Gerente nome = “Artur Araujo” idade = 56 agencia = 101 matricula = 234432 Ligações são instâncias de relacionamentos entre classes 36 Relacionamentos entre classes Dependência: DriverManager OracleConnection PBancoDadosJdbc OracleDriver Relacionamentos entre classes Associação: Empregado Empresa Trabalha para Carro Pessoa Pertence a Carro Pessoa dono 37 Relacionamentos entre classes Multiplicidade na associação : • Muitos para um • Um para muitos • Muitos para muitos A B * 1 A B 1 * A B * * Relacionamentos entre classes Navegabilidade na associação : LinhaPedido Produto ContaUsuario Senha - chave acesso Indica a visibilidade 38 Relacionamentos entre classes Visibilidade na associação : • Pode-se limitar a visibilidade relativa a objetos que não façam parte da associação. • A visibilidade relativa a uma associação pode ser pública, privada ou protegida. ContaUsuario Senha - chave acesso Indica a visibilidade Relacionamentos entre classes Classes de associações: Assinatura Pessoa Revista 0..*0..* 0..*0..* Classe de associação 39 Relacionamentos entre classes Agregação e composição: Composição ( partes não existem sem o todo ) Agregação PessoaEquipe * ** Barra Manu ItemMenu 1 * 1 ** * * 1 1 Relacionamentos entre classes Herança: Conta Especial Conta Investimento Conta Corrente Cliente1 1..*1..* 1 Generalização 40 Relacionamentos entre classes Conta Especial + sacar ( valor : Real ) : Real Conta Investimento + sacar ( valor : Real ) : Real Conta Corrente + sacar ( valor : Real ) : Real Classe e método abstratos Relacionamentos entre classes Conta Especial {leaf} + sacar ( valor : Real ) : Real Conta Investimento + sacar ( valor : Real ) : Real Conta Corrente {root} + sacar ( valor : Real ) : Real Classe base Classe final 41 Diagrama de classes Conceitos : • Diagramas de classe são representações gráfica que descrevem objetos e seus relacionamentos. • Diagramas de instância contém apenas objetos, links e valores. • Diagramas de instância são usados para facilitar o entendimento de diagramas de classe. • Diagramas de classes podem ser desenhados segundo diferentes perspectivas : conceitual, especificação ou implementação. Diagrama de classes Usuario {persistent} nome senha endereco telefone cpf Emprestimo {persistent} dataDevolucao tombo Identifica classe persistente 42 Diagrama de objetos Conceitos : • Apresenta um conjunto de objetos e seus relacionamentos estáticos em um determinado instante. • Um diagrama de objetos expressa ao parte estática de uma interação. • Um diagramade objetos é composto por objetos que colaboram, mas não são apresentadas as mensagens trocadas. • Diagramas de objetos contém principalmente objetos e links. • Um diagrama de objetos é uma instância de um diagrama de classes ou a parte estática de um diagrama de interação. Diagrama de objetos r : Robot [ movendo ] a1 : Area a2 : Area p1 : Parede p2 : Parede Relacionamentos entre os objetos em um determinado instante. 43 Interações Ligações : • Mensagens podem ser trocadas entre objetos se existirem ligações entre os objetos. • Uma ligação é um caminho através do qual uma mensagem pode ser enviada. • A multiplicidade não é aplicável a uma ligação. Cliente Gerente * 1 a : Cliente : Gerente obterSaldo ( ) Interações Diagramas de seqüência : :Tela Autenticação : Usuário 1 : autenticar ( nome , senha ) Objeto Ativação Mensagem Linha da vida 44 Interações :Tela Autenticação : Usuário : Tela Saque : ContaCorrente 1 : autenticar ( nome , senha ) 2 : criar Tela Saque ( nome ) 3 : obter valor 4 : sacar ( nome , valor ) Interações Diagramas de colaboração : Sensor Temperatura Monitor Temperatura Motor 1: analisar ( Temperatura ) 2: desligar ( ) Mensagem enviada entre objetos Ligações que são instâncias de relacionamentos entre classes 45 Diagrama de atividades Conceitos : • Descreve o fluxo de controle entre atividades. • Modela os passos em um processo computacional. • Enfatizam o fluxo de controle entre atividades. • Enfatizam as atividades realizadas ao longo do tempo. • É um tipo de diagrama de estados. • Estados podem representar atividades ou ações. • Atividades são não atômicas. • Ações são atômicas. Diagrama de atividades Transições : • A transição ocorre assim que a ação ou atividade é concluída. • O fluxo de controle continua até que seja encontrado um estado final. Estado inicial Transições Estado final 46 Diagrama de atividades Saltos : • Descrevem trajetos alternativos. • Controle de fluxo baseado em um teste. • A cada transição é associado um teste. • Os testes podem ser especificados usando-se texto ou a sintaxe de uma linguagem de programação. [ alarme ativado ] [ alarme desativado ] Diagrama de atividades Fork e join : • Fluxos de atividades podem ser concorrentes. • Barras de sincronização são usadas. • Fork usado para dividir em fluxos concorrentes. Fork 47 Diagrama de atividades • Join usado para sincronizar fluxos concorrentes. • Atividades em fluxos concorrentes podem se comunicar através de sinais. Join Eventos Conceitos : • Um evento é a especificação de uma ocorrência significativa. • Eventos podem ser síncronos ou assíncronos. • Eventos podem ser internos ou externos. Exemplos de eventos : • Sinais. • Chamadas às operações. • Passagem do tempo. • Mudança de estado. 48 Eventos Sinais : • Um sinal é enviado por um objeto e recebido por outro. • Os sinas internos mais comuns são as exceções. • Sinais podem ser organizados em hierarquias. • Sinais podem ter atributos e operações. • Os sinais que podem ser enviados pelas operações são especificados na modelagem da classe ou interface. Chamado abrir ( ) <<signal>> ConexãoEstabelecida <<send>> Eventos • Sinais não devem ser usados em substituição ao fluxo normal de controle. • Deve-se analisar quais os possíveis sinais que um objeto pode receber. • Eventos similares devem ser organizados em hierarquias. • Os sinais que um objeto pode receber são listados em um compartimento da classe. Motor Sinais AlarmeTemperatura ( t : float ) AlarmeVelocidade ( v : float ) AlarmeChuva ( ) 49 Eventos Exceções : • São tipos de sinais. • As exceções são enviadas quando da execução de operações. • Para cada operação é necessário identificar as exceções que podem ser originadas. • As exceções que podem ser originadas devem ser documentadas. Chamado abrir ( ) <<exception>> ErroComunicação <<send>> Eventos Famílias de sinais e de exceções: • Devem ser identificadas as propriedades comuns e organizadas hierarquias. <<signal>> MouseMove <<signal>> MouseDrag <<signal>> MouseEvent <<exception>> EnunciadoSQL <<exception>> Conexão <<exceptionl>> BancoDados 50 Máquina de estados Notação UML: desligado acelerando movendo desacelerando alarme temperatura ligar desligar desligar Interfaces Dependência : Tela Saque ContaEspecial ContaCorrente << interface >> ContaCorrente depositar ( ) sacar ( ) ContaEspecial Tela Saque Dependência 51 Interfaces Realizações : • Especifica o relacionamento entre uma interface e a classe que provê as operações ou serviços. • Uma interface pode ser realizada por diferentes classes. • Uma classe pode realizar diferentes interfaces. ContaEspecial ContaCorrente << interface >> ContaCorrente depositar ( ) sacar ( ) ContaEspecial Realização Implementação Conceitos : • Um componente é uma parte física de um sistema e provê a realização de um conjunto de interfaces. • São usados para modelar executáveis, bibliotecas, tabelas, arquivos e documentos. • Nomes podem incluir o pacote no qual se encontra o componente. Tela.java interface::Tela.java 52 Implementação Características dos componentes : • Provê uma abstração de um aspecto físico do sistema. • Provê serviços definidos em um conjunto de interfaces. • Implementa um conjunto de classes que colaboram de modo a prover os serviços definidos nas interfaces. • São fracamente acoplados em relação aos outros componentes. Implementação Classes e componentes: • Classes representam abstrações lógicas. • Componentes representam coisas físicas. • Componentes são a implementação física de elementos lógicos como classes. Classes 53 Localização Conceitos : • Componentes podem ser distribuídos entre os nós de um sistema. • Diferentes instâncias de um componente podem estar em diferentes nós. : ServidorTransacao {location = servidor } antares:servidor Deploys servtrans.exe Localização Servidor transação c1.exe c2.exe Nó Componentes 54 Localização Diagramas de implantação : <<100BASET>> <<RS232>> Terminal Cliente Servidor Padrões de projeto Conceitos : • Desenvolvimento de software é uma atividade complexa e desenvolvimento de software reutilizável é uma atividade ainda mais complexa. • Patterns e frameworks possibilitam a melhora da qualidade do software. • Patterns capturam estruturas identificadas nas soluções dadas na implementação de aplicações em um domínio. • Frameworks são conjuntos de componentes que colaboram para prover uma arquitetura reutilizável em uma família de aplicações relacionadas. 108 55 Padrões de projeto • Sistemas bem estruturados apresenta diversos patterns. • Um pattern soluciona um problema freqüente em um determinado contexto. • Patterns são aplicáveis em diferentes níveis de abstração. • Patterns de projeto, especificam a estrutura e o comportamento de conjuntos de classes.• Patterns de arquitetura , especificam a estrutura e o comportamento de um sistema. • Patterns auxiliam no entendimento, na especificação, na construção e na documentação de um sistema. • O uso de patterns é útil, mas não é uma solução milagrosa. 109 Padrões de projeto Características de um pattern : • Resolve um problema real. • Não captura apenas princípios abstratos ou estratégias. • Captura soluções comprovadas. • Não descreve teorias ou especulações. • A solução não é trivial. • A solução para o problema normalmente é obtida indiretamente. • Descreve estruturas e mecanismos que estão presentes em diversos sistemas. 110 56 Padrões de projeto Coleções de patterns : • Catálogos ou sistemas de patterns. Catálogos de patterns : • Coleções de patterns relacionados. • Patterns divididos em um pequeno número de categorias. Sistemas de patterns : • Conjunto de patterns relacionados que em conjunto possibilitam a construção e evolução de arquiteturas completas. • Descrevem como os patterns podem ser combinados. 111 Padrões de projeto Documentação de um pattern : • Descrição resumida e visão geral. • Nome composto por uma palavra ou frase curta. • Outros nomes pelos quais o pattern é conhecido. • Problema e objetivo. • Contexto no qual o problema e solução ocorrem. • Cenário que descreve a motivação. • Descrição da solução com aspectos estáticos e dinâmicos. • Exemplos que ilustrem a aplicação do pattern. • Contexto resultante e conseqüências do uso do pattern. 112 57 Padrões de projeto • Patterns relacionados. • Usos conhecidos em sistemas existentes. • Situações nas quais o pattern pode ser utilizado. • Representação gráfica. • Responsabilidades de classes e objetos no pattern. • Descrição de como os participantes colaboram. • Detalhes envolvidos na implementação. 113 Padrões de projeto Tipos de patterns : • Patterns de arquitetura, de projeto, idiomas e anti- patterns. • Diferença está nos níveis de abstração e de detalhamento. Patterns de arquitetura : • Estratégia de alto nível. • Descreve a estrutura do sistema. • Afeta a estrutura do sistema como um todo. • Provê um conjunto predefinido de subsistemas. • Especifica as responsabilidades dos subsistemas. • Organiza os relacionamentos entre subsistemas. 114 58 Padrões de projeto Patterns de projeto : • Tática de nível médio. • Provê um esquema para refinar os subsistemas ou componentes de um sistema ou os relacionamentos entre os mesmos. • Descreve a estrutura de um subsistema ou componente que se repete freqüentemente na solução de projetos em um determinado contexto. • Não afeta a estrutura do sistema como um todo. • Define uma micro-arquitetura de um subsistema ou componente. 115 Padrões de projeto Idiomas : • Pattern de baixo nível. • Específico de uma linguagem de programação. • Descreve como implementar aspectos particulares de componentes ou relacionamentos em uma determinada linguagem de programação. • Descreve uma técnica de programação específica de uma linguagem. • Detalhes de baixo nível da estrutura ou comportamento de um componente. 116 59 Padrões de projeto Anti- patterns : • Representa uma “lição aprendida”. • Pode descrever uma solução ruim para problema. • Pode descrever como migrar de uma situação ruim para uma situação boa. 117 Padrões de projeto Um catálogo de patterns [Gamma]: • Abstract Factory, provê uma interface para criar famílias de objetos relacionados ou dependentes sem ser necessário especificar as classes concretas. • Adapter, converte a interface de uma classe em uma outra interface esperada pelos clientes, torna as interfaces compatíveis. • Bridge, desacopla uma abstração da sua implementação de modo que possam variar independentemente. • etc. 118 60 Padrões de projeto Padrões para criar objetos: • Patterns usados para possibilitar que o processo de instanciação seja abstraído. • Ajudam a tornar o sistema independente de como os objetos são criados, compostos e representados. • Um pattern usado na criação de classes usa herança para variar a classe instanciada. • Um pattern usado na criação de objetos delega a instanciação para outros objetos. • São patterns importantes pois aumentam o uso de composição de objetos. 119 Padrões de projeto • Os patterns encapsulam o conhecimento a respeito das classes concretas que o sistema usa. • Patterns escondem como as instâncias das classes são criadas e colocadas em conjunto. • O sistema apenas conhece sobre os objetos as interfaces definidas. 120 61 Padrões de projeto Abstract Factory: • Provê uma interface para a criação de famílias de objetos relacionados ou dependentes sem especificar as classes concretas. Aplicabilidade : • Quando o sistema deve ser independente de como os seus produtos são criados, compostos e representados. • Quando o sistema deve ser configurado com uma entre múltiplas famílias de produtos. • Quando se deseja revelar apenas as interfaces de uma biblioteca e não a sua implementação. 121 Padrões de projeto Singleton: • Garantir que uma classe só tenha uma instância. • Prover um ponto de acesso global à mesma. Aplicabilidade: • Quando só pode existir uma única instância de uma classe que precisa estar acessível aos clientes de um ponto de acesso conhecido. • Quando a única instância pode ser estendida por herança e clientes devem ser capazes de usar uma instância estendida sem modificar o código. 122 62 Padrões de projeto Padrões estruturais: • Descrevem como classes e objetos são compostos para formar estruturas maiores. • Patterns de estruturas de classes usam herança para compor interfaces ou implementações. • Patterns de estruturas de objetos descrevem como objetos podem ser compostos de modo a se obter uma nova funcionalidade. • A composição de objetos possibilita a mudança da composição em tempo de execução, o que é impossível com a composição de classes. 123 Padrões de projeto Facade: • Provê uma interface unificada para um conjunto de interfaces em um subsistema. • Define uma interface de mais alto nível que facilita o uso do subsistema. Aplicabilidade : • Quando é necessário prover uma interface simples para um subsistema complexo. • Quando existe um número elevado de dependências entre clientes e as implementações de uma abstração. • Quando se deseja organizar os subsistemas em camadas. 124 63 Padrões de projeto Proxy: • Provê um intermediário para controlar acesso ao objeto. Aplicabilidade : • Quando é necessária uma referência mais sofisticada para um objeto do que um ponteiro. • Quando é necessário prover um representante local para um objeto em um outro espaço de endereçamento. • Quando é necessário criar objetos complexos sob demanda. • Quando é necessário controlar o acesso ao objeto original. 125 Padrões de projeto Padrões de comportamento: • Preocupam-se com algoritmos e atribuições de responsabilidades entre objetos. • Caracterizam fluxos de controle complexos difíceis de seguir em tempo de execução. • Patterns de comportamento de classe usam herança para distribuir comportamento entre classes. • Patterns de comportamento de objetos usam composição para distribuir comportamento. 126 64 Padrões de projeto Observer: • Define uma dependência de um para muitos entre objetos, quando um objeto muda de estado, todos os dependentes são notificados e atualizados. Aplicabilidade : • Quando uma abstração tem dois aspectos, um dependentedo outro. • Quando uma mudança em um objeto requer mudar outros e não se sabe quantos objetos precisam ser mudados. • Quando um objeto precisa notificar outros sem fazer suposições a respeito de quem são os objetos. 127 Padrões de projeto Strategy: • Define uma família de algoritmos, encapsula cada um e possibilita a substituição dos mesmos e a variação independente dos clientes que os utilizam. Aplicabilidade : • Quando diversas classes relacionadas diferem apenas no seu comportamento. • Quando são necessárias diversas variantes de um algoritmo. • Quando um algoritmo usa dados que o cliente não deve saber a respeito. 128 65 LINGUAGEM C++ 129 CLASSES E OBJETOS 130 66 Tópicos Declaração e definição de classes. Atributos de instância e de classe. Métodos de instância. Métodos de classe. Métodos amigos. Visibilidades dos atributos e métodos. Criando objetos. Ponteiros e alocação dinâmica de objetos. Construtores e destrutores. Tratamento de erros e exceções. 131 A linguagem C++ Introdução: • Desenvolvida por Bjarne Stroustrup na AT&T. • Linguagem híbrida. • Possibilita introdução gradual de novos conceitos. • Extensão da linguagem C. • Mantém compatibilidade com a linguagem C. • Sem proprietário. • Diversos fornecedores de compiladores. • Forte verificação de tipos. • Sintaxe considerada complexa. 132 67 A linguagem C++ • Parcialmente padronizada. • Código compilado para uma plataforma específica. • Gerado código executável para uma plataforma. • Migração requer recompilação. • Código tipicamente executado com alto desempenho. • Interfaces de programação parcialmente padronizadas. • Mudança nas bibliotecas tipicamente requer manutenção. 133 Espaço de nomes Conceitos: • Particiona o espaço de nomes. • Evita a ocorrência de conflitos entre nomes. • Agrupa elementos relacionados. • Podem existir declarações e definições em um namespace. • Definições podem ser feitas fora do corpo do namespace. • Usado o operador de resolução de escopo ::. • Espaços de nomes podem ser aninhados. • Podem existir múltiplas ocorrências de um namespace . • Diretiva using identifica o namespace usado. 134 68 Espaço de nomes namespace string { void strcpy(char* source, char* from); void strcat(char* source, char* from); int strlen(char* source); } void string::strcpy(char* source, char* from) { ... } void string::strcat(char* source, char* from) { ... } int string::strlen(char* source) { ... } 135 Espaço de nomes namespace nameSpaceA { int var = 5; } namespace nameSpaceB { double var = 3.1416; } ... cout << nameSpaceA::var; cout << nameSpaceB::var; ... namespace nameSpaceA { int var = 5; } namespace nameSpaceB { double var = 3.1416; } ... using namespace nameSpaceB; cout << var; cout << (var*2); ... 136 69 Espaço de nomes Declaração de um namespace: 137 Espaço de nomes Definição do namespace: 138 70 Espaço de nomes Informando o namespace: Declarando um sinônimo: 139 Espaço de nomes O namespace std: • Espaço de nomes da biblioteca padrão. • Funções, classes e templates declarados no namespace. • Existem várias formas de se informar o espaço de nomes. #include <iostream> #include <iostream> #include<iostream> ... ... ... using namespace std; using std::cin; std::cin >> i; using std::cout; std::cout << j; 140 71 Classes Declaração: • Palavra-chave class. • Nome da classe. • Lista de atributos e métodos colocados entre chaves. Visibilidade: • Aceso aos métodos e aos atributos pode ser público, privado ou protegido. • A visibilidade default é private. private public protected Especificadores da visibilidade de acesso. 141 Classes class nome_da_classe { especificador_acesso_1: membro1; ... especificador_acesso_2: membro2; ... }; Palavra-chave. 142 72 Classes Classes aninhadas: • Uma classe pode ser declarada dentro de uma outra classe. • Uma classe aninhada é visível dentro da classe externa. class Retangulo { class Coordenada { int x, y; }; Coordenada pt1, pt2, pt3, pt4; }; 143 Atributos Tipos dos atributos: • Valor inicial dos atributos é aleatório. • Atributos podem ser de instância ou de classe. • Atributos de classe identificador pelo modificador static. • Atributos constantes identificados pelo modificador const. class nome_da_classe { tipo nome_da_variável; static tipo nome_da_variável; const tipo nome_da_variável; }; 144 73 Atributos • Atributos de instância. class nome_da_classe { tipo nome_da_variável; }; • Atributos de classe via modificador static. class nome_da_classe { static tipo nome_da_variável; }; • Atributos constantes via modificador const. class nome_da_classe { const tipo nome_da_variável; }; 145 Atributos class Aluno { // Lista dos atributos. string nome; int matricula; int telefone; } alunoA; class Disciplina { // Lista dos atributos. private : string nome; int codigo; }; 146 74 Atributos • Constantes com escopo de classe. // Declaração de uma constante. class CntrComunicacao { static const int LIMITE; . . . }; // Definição de uma constante. const int CntrComunicacao::LIMITE = 10; 147 Atributos • Alternativamente para int, bool, char, etc. // Declaração de uma constante. class CntrComunicacao { static const int LIMITE = 10; . . . }; // Definição de uma constante. const int CntrComunicacao::LIMITE; 148 75 Métodos Declaração e definição: • Os métodos são declarados na declaração da classe. • Declaração informa a assinatura do método. • A definição pode ocorrer quando da declaração. • A definição pode ocorrer posteriormente. • Definição posterior usa operador de resolução de escopo. 149 Métodos class Aluno { // Lista dos atributos. private: string nome; int matricula; int telefone; // Lista dos métodos. public: void setNome(string nome) { // Código do método. } }; Método declarado e definido. 150 76 Métodos class Aluno { // Lista dos atributos. private: string nome; int matricula; int telefone; // Lista dos métodos. public: void setNome(string nome); void setMatricula(int matricula); void setTelefone(int telefone); }; Métodos declarados mas não definidos. 151 Métodos // Definições dos métodos. void Aluno::setNome(string nome) { this->nome = nome; } void Aluno::setMatricula(int matricula) { this->matricula = matricula; } void Aluno::setTelefone(int telefone) { this->telefone = telefone; } Operador de resolução de escopo. Ponteiro para o objeto. 152 77 Métodos Exemplo: 153 Métodos 154 78 Métodos Sobrecarga e polimorfismo: • Métodos podem ser sobrecarregados. • Métodos sobrecarregadostem o mesmo nome. • Métodos sobrecarregados podem ter a mesma assinatura se forem de diferentes classes. class Horario { . . . void obterHorario ( long* ticks ); void obterHorario ( int* hours, int* minutos, int* segundos ); }; 155 Métodos • Facilita desenvolvimento de aplicações portáveis. • Facilita o entendimento das aplicações. • Ao nível de métodos. class nome_da_classe { tipo nome_do_método ( parâmetros ); tipo nome_do_método ( parâmetros ); }; • Ao nível dos operadores tipo nome_da_classe::operator símbolo (param) { . . . } 156 79 Métodos Argumentos default: • Usados quando parâmetros atuais não são informados. • Informados nas declarações dos métodos. class SymTable { . . . public : SymTable ( int sz = 16 ); }; Construtor com um valor default para o argumento. 157 Métodos Métodos inline : • Métodos pequenos e freqüentemente chamados. • Código inserido toda vez que o método é chamado. • Usada a palavra chave inline ou o método é definido dentro do corpo da classe. class ContaCorrente { // . . . public: void sacar ( float valor ) { // . . . } }; Método definido na declaração da classe 158 80 Métodos class ContaCorrente { public: void sacar (float valor); ... }; inline void ContaCorrente::sacar(float valor) { ... } 159 Métodos Métodos amigos: • Podem acessar membros privados de uma classe. • São úteis em alguns padrões de projeto. • Usada a palavra-chave friend. • Toda uma classe pode ser declarada como amiga de outra. class nome_da_classe { public: friend tipo nome_da_classe::nome_método(param); friend class nome_da_classe; ... }; 160 81 Métodos class IntSet { // . . . public : friend void RealSet::SetToInt ( IntSet * ); }; class RealSet { // . . . public : friend void IntSet::SetToReal ( RealSet * ); }; Métodos amigos. 161 Métodos Exemplos: class Horario { // . . . void obterHorario ( long* ticks ); void obterHorario ( int* hours, int* minutos, int* segundos ); }; class Conjunto { // . . . public : friend Bool operator & ( int , Conjunto ); friend Bool operator < (Conjunto , Conjunto); }; Sobrecarga de métodos Sobrecarga de operadores 162 82 Métodos Métodos e atributos estáticos: • Atributo relacionado a uma classe e não às instâncias. • Atributo identificado via palavra-chave static. • Um atributo estático é declarado na classe. • Um atributo estático é definido fora da classe. • Atributo pode ser acessado por qualquer método da classe. • Método estático pode ser invocado sem se informar o alvo. • Um método estático só pode acessar membros estáticos. • Um método estático é identificado por static. 163 Métodos class Aluno { // Lista dos atributos. private: static int numeroAlunos; ... } int Aluno::numeroAlunos = 0; ... Declaração. Posterior definição. 164 83 Métodos class Aluno { ... private: static int numeroAlunos; ... public: static int getNumeroAlunos(); ... }; ... int Aluno::getNumeroAlunos() { return numeroAlunos; } ... int Aluno::numeroAlunos = 0; n = alunoA.getNumeroAlunos(); ... n = alunoB->getNumeroAlunos(); ... n = Aluno::getNumeroAlunos(); Formas de invocar um método estático. 165 Métodos Métodos e objetos constantes: • Os objetos constantes são identificados via const. • Objetos constantes são alterados apenas via construtores. • Um método constante não pode alterar o estado do objeto. • Métodos constantes são identificados via const. • Métodos constantes podem ser invocados sobre objetos constantes. 166 84 Métodos class Aluno { ... // Lista dos métodos. public: string getNome() const; ... }; ... string Aluno::getNome() const { return nome; } const Aluno alunoE("jose"); ... nome = alunoE.getNome(); Declaração de um objeto constante e acesso ao mesmo via método constante. 167 Métodos Atributos modificáveis: • Pode-se ter atributos modificáveis em objeto constante. • Os atributos modificáveis são identificados via mutable. • Atributos mutable são modificáveis via método const. class Aluno { private: ... mutable string nome; public: ... static int getNumeroAlunos(); }; void Aluno::setNome(string nome) const { this->nome = nome; } ... const Aluno alunoE; ... alunoE.setNome("Maria"); 168 85 Objetos Como criar objetos: • Quando da declaração da classe. • Estaticamente após a declaração da classe. • Dinamicamente após a declaração da classe. class Aluno { private: string nome; int matricula; int telefone; // Lista dos métodos. ... } alunoA, alunoB; Objetos criados quando da declaração da classe. 169 Objetos class Aluno { // Lista dos atributos. private: string nome; int matricula; int telefone; // Lista dos métodos. ... }; int main(int argc, char *argv[]) { Aluno alunoA, alunoB; ... } Objetos posteriormente criados de forma estática. 170 86 Objetos Alocação dinâmica dos objetos: • Usados os operadores new e delete. • Ao usar new, aloca memória e depois invoca o construtor. • Ao usar delete, chama o destrutor e depois libera memória. • Importante ficar claro se é uma matriz de objetos. • Se foi alocada uma matriz, deve ser destruída uma matriz. • Funções malloc e free não invocam construtor e destrutor. ptrA = new NomeClasse; ptrB = new NomeClasse(argumentos); ptrC = new NomeClasse[tamanho]; 171 Objetos Alocação dinâmica : nome_da_classe *nome_do_objeto = new nome_da_classe ( ); delete ( nome_do_objeto ); Ponteiros : • Para uma classe nome_da_classe *nome_do_ponteiro ; • Para membros de uma classe tipo nome_da_classe :: *nome_do_ponteiro; 172 87 Objetos class Aluno { // Lista dos atributos. ... // Lista dos métodos. ... }; int main(int argc, char *argv[]) { Aluno *alunoA, *alunoB; alunoA = new Aluno(); alunoB = new Aluno(); ... } Objetos dinamicamente criados. 173 Objetos string *stringPtr1 = new string; string *stringPtr2 = new string[100]; ... delete stringPtr; // Destrói um objeto. delete [] stringPtr2; // Destrói uma matriz de objetos. typedef string SociosFirma[2]; string *socios = new SociosFirma; ... delete [] socios; 174 88 Objetos Exemplo: class Coordenada { public : int x,y; ... }; ... Coordenada coordA; int valor; int Coordenada::*ptr; // Ponteiro para atributo da classe. ptr = &Coordenada::x; // Obtém endereço do atributo. coordA.*ptr = 10; // Acessa o membro. valor = coordA.*ptr; // Acessa o membro. Visibilidade pública para possibilitar o acesso.175 Objetos class Coordenada { ... public: void setX(int x){this->x = x;} int getX(){return x;} }; Coordenada coordA; int valor; void (Coordenada::*ptrA)(int); // Ponteiro para método. int (Coordenada::*ptrB)(); // Ponteiro para método. ptrA = &Coordenada::setX; // Obtém endereço. ptrB = &Coordenada::getX; // Obtém endereço. (coordA.*ptrA)(10); // Invoca via ponteiro. valor = (coordA.*ptrB)(); // Invoca via ponteiro. 176 89 Objetos Referências para objetos: • Sinônimos para objetos. • Similar ao uso de ponteiros. • Usado o símbolo & em vez do símbolo * . Point pt1 ( 10 , 10 ); Point& pt2 = pt1; • Pode-se usar referências como argumentos de métodos. • Argumento é passado por referência e não por valor. Conjunto operator * (Conjunto& cnj1 , Conjunto& cnj2) { // . . . } 177 Objetos Envio de mensagens: • Usando o nome do objeto. nome_do_objeto.nome_do_método (param); • Usando um ponteiro para o objeto. nome_do_ponteiro->nome_do_método (param); Exemplo: ContaCorrente a = new ContaCorrente ( ); ContaCorrente b; a->sacar ( 100 ); b.depositar ( 200 ); 178 90 Construtores e destrutores Método construtor: • Automaticamente invocado quando um objeto é criado. • Garante que as inicializações não serão esquecidas. • Tem o mesmo nome da classe da qual é um membro. • O tipo do retorno é implícito. • O retorno é um ponteiro para uma instância da classe. • Construtores podem ser sobrecarregados e ter argumentos. Construtor default: • Construtor para o qual não há argumentos . • Construtor para o qual há defaults para todos argumentos. 179 Construtores e destrutores class Aluno { // Lista dos atributos. private: string nome; int matricula; int telefone; // Lista dos métodos. public: Aluno(); Aluno(string, int, int); void setNome(string nome); void setMatricula(int matricula); void setTelefone(int telefone); }; 180 91 Construtores e destrutores // Definições dos construtores. Aluno::Aluno() { nome = ""; matricula = 0; telefone = 0; } Aluno::Aluno(string nome, int matricula, int telefone) { this->nome = nome; this->matricula = matricula; this->telefone = telefone; } Construtores tem o mesmo nome da classe 181 Construtores e destrutores Aluno alunoA("Fernando", 1234, 5678); Aluno alunoB("Felipe", 8901, 2345); Aluno *alunoC, *alunoD; alunoC = new Aluno("Margarida", 6789, 1234); alunoD = new Aluno("Claudia", 5678, 9012); Os objetos são inicializados quando são criados. 182 92 Construtores e destrutores Lista de inicialização: • Forma de inicializar os membros. • Lista separada por vírgulas. class ElementoGrafico { int coordX, coordY; public : ElementoGrafico(int, int); ... }; ElementoGrafico::ElementoGrafico(int x, int y):coordX(x), coordY(y) { } 183 Construtores e destrutores class Matricula { Aluno &aluno; Disciplina &disciplina; public: Matricula(Aluno&, Disciplina&); ... }; Matricula::Matricula(Aluno &aluno, Disciplina &disciplina): aluno(aluno), disciplina(disciplina) { } Matricula::Matricula(Aluno &aluno, Disciplina &disciplina){ this->aluno = aluno; this->disciplina = disciplina; } Inicialização de referências deve ser feita em uma lista. Não é correto inicializar no corpo. 184 93 Construtores e destrutores Método destrutor: • Programador deve destruir objetos não mais necessários. • Invocado quando objeto sai do escopo. • Invocado quando de um delete. • Tem o mesmo nome da classe precedido por ~ . • Não tem argumentos. • Não podem ser sobrecarregados. class nome_da_classe { public: tipo_retorno nome_método (param) ; }; 185 Construtores e destrutores Construtores usados para copiar objetos: • Possibilita criar uma cópia de um objeto. • O argumento referencia um objeto da classe da qual o construtor é membro. • O construtor provido pelo compilador copia membro a membro, isso causa problemas em certas situações. Quando copiar objetos: • Ao criar um objeto que usa outro objeto para inicialização. • Em uma atribuição. • Na passagem de argumentos para uma função. • No retorno de um objeto por uma função. 186 94 Construtores e destrutores Matrizes de objetos: • Definida como uma matriz convencional. • Podem ser especificados valores para a sua inicialização. • Objetos podem ser criados de forma estática ou dinâmica. Aluno graduacao[2]= {Aluno("Maria", 1234, 5678), Aluno("Roberto", 9012, 3456)}; Aluno *mestrado = new Aluno [3]; Valores iniciais não são informados. 187 Tratamento de exceção Conceito: • Mecanismo provido pela linguagem de programação que visa facilitar o tratamento de anomalias ocorridas em tempo de execução. Vantagens: • Padroniza a forma como os erros são notificados. • Torna explícita a notificação dos erros. • Aproxima a notificação do erro do tratamento do mesmo. • Melhora a documentação dos erros. 188 95 Tratamento de exceção Exemplos de exceções: • Divisão por zero. • Argumento inválido. • Overflow. • Acesso a um elemento fora dos limites de uma matriz. • Término da memória livre disponível. 189 Tratamento de exceção exception bad_alloc bad_cast bad_typeid logic_error domain_error invalid_argument length_error out_of_range runtime_error overflow_error range_error underflow_error ios_base::failure Algumas funções da biblioteca padrão lançam exceções. A classe base std::exception é definida em <exception>. As exceções padrões podem ser lançadas por funções na aplicação ou novas classes podem ser derivadas. 190 96 Tratamento de exceção Tratamento de exceções: • Bloco try - Contém código que pode lançar exceções • throw - Palavra-chave que lança uma exceção • catch - Enunciados que capturam as exceções Palavra-chave throw: // Lança objeto a ser capturado por valor ou referência. throw EIntegerRange(0, 10, userValue); // Lança objeto a ser capturado por um ponteiro. throw new EIntegerRange(0, 10, userValue); 191 Tratamento de exceção Capturando e tratando exceções: try { ... if (mystring == NULL) throw "Falha de alocacao"; ... if (n > 9) throw n; ... } catch (int i) { ... } catch (char * str) { ...} 192 97 Tratamento de exceção A captura pode englobar toda uma função: int funcao () try { // ... return 0; } catch ( pushOnFull ) { // ... } catch ( popOnEmpty ) { // ... } O bloco try está englobando todo o corpo da função. A captura está ocorrendo fora do corpo da função. 193 Tratamento de exceção Capturando qualquer exceção: Especificando as possíveis exceções: void f1(); // Pode lançar qualquer exceção. void f2() throw(); // Não pode lançar exceções. void f3() throw( A, B ); // Pode lançar exceções derivadas// das classes A ou B. try { ... } catch (...) { ... } Os três pontos indicam a captura de qualquer classe de exceção. 194 98 Tratamento de exceção class iStack { public: // ... void pop( int &value ) throw(popOnEmpty); void push( int value ) throw(pushOnFull); private: // ... }; Classes das exceções que podem ser lançadas pelos métodos. 195 Tratamento de exceção Aninhando blocos: • Blocos try-catch podem ser aninhados. • As exceções podem ser relançadas a partir de um catch. try { try { ... } catch (int n) { throw; } } catch (...) { ... } Exceção relançada via throw sem argumentos. 196 99 Tratamento de exceção Exceções não capturadas: • Exceções não capturadas chamam a função terminate . • A função tipicamente encerra o processo corrente e informa que ocorreu um término anormal. Lidando com a falta de memória: • new retorna um ponteiro para void em caso de sucesso. • new lança exceção quando não há memória para objeto • No C++ padrão é lançada a exceção bad_alloc. void terminate( ); 197 Tratamento de exceção • Versões do C++ sem tratamento de exceção retornam 0. • Pode-se também retornar 0 no C++ padrão. • Usada a palavra nothrow. if (int *ptr = new (nothrow) int[100]){ // Sucesso na alocação. } else { // Falha na alocação. } 198 100 HERANÇA, POLIMORFISMO E TEMPLATES 199 Tópicos Sobrecarga de operadores. Herança. Herança simples e múltipla. Exemplos de hierarquias. Ligação estática e dinâmica. Métodos virtuais e virtuais puros. Classes template. Classes containers. 200 101 Sobrecarga de operadores Conceitos: • Possibilita a redefinição do comportamento de operadores. • Uso dos objetos torna-se similar ao dos tipos primitivos. A sobrecarga de um operador deve conter: • Tipo do dado a ser retornado. • Nome da classe da qual a função é membro. • Palavra-chave operator. • Símbolo que identifica o operador. • Tipos e identificadores dos parâmetros. 201 Sobrecarga de operadores Número de argumentos: • 0 se operador for unário e função definida como membro. • 1 se operador for unário e função definida como amiga. • 1 se operador binário e função definida como membro. • 2 se operador binário e função definida como amiga. Operadores que podem ser sobrecarregados: • Unário + - * ! ~ & ++ -- ( ) -> new delete • Binário + - * / % & | ^ << >> = += -= /= %= &= |= ^= <<= >>= == != < > <= >= && || [ ] ( ) 202 102 Sobrecarga de operadores Exemplos de restrições quanto à sobrecarga: • Apenas símbolos existentes podem ser sobrecarregados. • Não podem ser sobrecarregados ::, .*, . e ?: • Não podem ser funções globais =, [ ], ( ) e -> • Operadores ( ) [ ] e -> sobrecarregados como membros. • Pelo menos um operando é uma classe ou enumeração. • Não pode-se modificar o número de operandos original. • Não pode-se mudar a precedência dos operadores. 203 Sobrecarga de operadores class Ponto { private: int x, y; public: Ponto operator + (Ponto p); Ponto operator - (Ponto p); ... }; Ponto Ponto::operator + (Ponto p) { return Ponto(x + p.x, y + p.y); } Ponto Ponto::operator - (Ponto p) { return Ponto(x - p.x, y - p.y); } ... Ponto a(1,2), b(3,4), c; c = a + b; Uso do operador sobrecarregado. Funções são membros da classe. 204 103 Sobrecarga de operadores class Ponto { private: int x, y; public: friend Ponto operator + (Ponto, Ponto); friend Ponto operator - (Ponto, Ponto); ... }; Ponto operator + (Ponto p1, Ponto p2) { return Ponto(p1.x + p2.x, p1.y + p2.y); } Ponto operator - (Ponto p1, Ponto p2) { return Ponto(p1.x - p1.x, p1.y - p2.y); } ... Funções são amigas da classe 205 Sobrecarga de operadores class Complexo { private: float r; float i; public: Complexo operator = (Complexo x); Complexo operator + (Complexo x); }; Complexo Complexo::operator = (Complexo x) { r = x.r; i = x.i; return *this; } Complexo Complexo::operator + (Complexo x) { Complexo tmp; tmp.r = r + x.r; tmp.i = i + x.i; return tmp; } Retorno de referência this. Retorno de cópia do objeto local. 206 104 Sobrecarga de operadores Sobrecarga de new e delete: • Situações onde é necessário controlar a alocação. • Sobrecarga pode ser relativa a uma classe se a função for membro da classe. • Sobrecarga pode ser global se não for função membro. void *operator new(long bytes) { ... return ponteiro_para_memória; } void nome_classe::operator delete(void *p) ... } Sobrecarga global. Sobrecarga relativa a uma classe. 207 Sobrecarga de operadores Operadores de inserção << e extração >> : • Preferível esses operadores do que as função em stdio.h. • Funções printf e scanf não são extensíveis. • Funções separam das variáveis as formatações. int i; cin >> i; // Extração. cout << i; // Inserção. 208 105 Sobrecarga de operadores class Coordenada { int x, y; public: friend ostream& operator << (ostream &str, Coordenada coord); ... }; ostream &operator << (ostream &str, Coordenada coord) { str << "Coordenada x : " << coord.x; str << "Coordenada y : " << coord.y; } ... cout << coordA; Operador de inserção. 209 Herança Conceitos: • Permite a reutilização do código. • Pode ser simples ou múltipla. Declaração de herança deve conter: • Palavra-chave class. • Nome da nova classe. • Operador : • Nomes da classe herdada e do modo de acesso. class nome_classe:modo_acesso nome_classe_base { }; 210 106 Herança Herança simples: class nome_da_classe_A { // . . . }; class nome_da_classe_B:nome_da_classe_A { //... }; class nome_da_classe_C:nome_da_classe_A { //... }; A B C D E 211 Herança Modo de acesso: • No modo public, os membros públicos na classe base permanecem públicos na classe derivada e os membros protegidos permanecem protegidos. • No modo private, os membros públicos e protegidos na classe base se tornam privados na classe derivada. • No modo protected, os membros públicos e protegidos podem ser usados somente por membros e friends da classe derivada e de classes que venham a ser derivadas dessa. 212 107 Herança • O modo de acesso default é private na herança entre classes, restringindo automaticamente a visibilidade dos membros nas classes derivadas. • O modo de acesso default é public na herança entre structs. class A : public B { ... } class C : protected B { ... } class D : private B { ... } class E : B { ... } // Privado. 213 Herança Sobrecarga: BASE DERIV 1 ativar () DERIV 2 ativar () a.ativar () b.ativar () c.ativar () 214 108 Herança Métodos e atributos sobrecarregados: • Podem ser acessados a partir das classes derivadas. • Usado o operador de resolução de escopo.• Necessário especificar a visibilidade como protected. cadastrar( ) cadastrar( ) 215 Herança class Aluno { ... protected: void cadastrar(); ... }; class AlunoEspecial:public Aluno { ... public: void cadastrar(); ... }; void AlunoEspecial::cadastrar() { ... Aluno::cadastrar(); ... } 216 109 Herança Herança múltipla: class nome_da_classe_A { // . . . }; class nome_da_classe_B { //. . . }; class nome_da_classe_C:nome_da_classe_A , nome_da_classe_B {//...}; A B C D E 217 Herança Ambigüidades na herança múltipla: • Diferentes classes base tendo membros com mesmo nome. • Uma mesma classe base mais de uma vez na hierarquia. Solução da ambigüidade: • Necessário identificar a classe com o membro. • Especifica-se a classe do membro. • Usa-se o operador de resolução de escopo. NomeClasseA::NomeMetodo(); NomeClasseB::NomeMetodo(); NomeClasseA::NomeAtributo; NomeClasseB::NomeAtributo; 218 110 Herança Resolução de ambigüidade: class ProfessorOrientador:public Docente, public Funcionario { ... }; class ProfessorCoordenador:public ProfessorOrientador { ... ProfessorOrientador::Docente::cadastrar(); Docente::cadastrar(); Funcionario::cadastrar(); cadastrar(); ... }; Procura em ProfessorCoordenador depois em ProfessorOrientador depois em Docente e depois em Funcionario. 219 Herança Herança e declaração using: class Docente { ... void cadastrar(int); }; class Funcionario { ... void cadastrar(float); }; class Professor:public Docente, public Funcionario { ... cadastrar(123); ... } As ambigüidades entre métodos de diferentes classes base não são resolvidas com base nos tipos dos argumentos. Ambigüidade. 220 111 Herança class Docente { ... void cadastrar(int); }; class Funcionario { ... void cadastrar(float); }; class Professor:public Docente, public Funcionario { ... using Docente::cadastrar; using Funcionario::cadastrar; ... cadastrar(123); // Invoca Docente::cadastrar cadastrar(1.2); // Invoca Funcionario::cadastrar ... } Declarações using trazem os métodos para o mesmo escopo possibilitando a resolução a partir dos tipos dos argumentos. 221 Herança Replicação de classes base: class Profissional { Profissional *primeiro; ... }; class Docente:public Profissional { ... }; class Funcionario:public Profissional { ... void cadastrar(float); }; class Professor:public Docente, public Funcionario { ... } Instâncias da classe Professor terão duas listas de profissionais. 222 112 Herança class Profissional { Profissional *primeiro; ... }; class Docente:public virtual Profissional { ... }; class Funcionario:public virtual Profissional { ... void cadastrar(float); }; class Professor:public Docente, public Funcionario { ... } As instâncias da classe Professor terão uma lista de profissionais devido ao uso de classes base virtuais. 223 Herança Construtores e destrutores: • Podem existir construtores e destrutores em uma classe base e nas suas derivadas. • O construtor na classe base é invocado primeiro. • O destrutor de uma classe derivada é executado antes do destrutor da sua classe base. • Se um construtor de uma classe base requer argumentos, devem ser providos pela classe derivada. • Se houver herança múltipla, os construtores são invocados seguindo-se a ordem da esquerda para a direita e os destrutores da direita para a esquerda. 224 113 Herança class ElementoGrafico { ... public : ElementoGrafico(int, int); ~ElementoGrafico(); }; class Retangulo:public ElementoGrafico { ... public : Retangulo(int, int, int); ~Retangulo(); }; Retangulo::Retangulo(int x, int y, int z):ElementoGrafico(x,y) { ... } Construtor que requer parâmetros sendo explicitamente invocado. 225 Herança A B C D E Ordem de execução dos métodos construtores. Ordem de execução dos métodos destrutores. 226 114 Herança class ElementoGrafico { public : ElementoGrafico(); ~ElementoGrafico(); ... }; ... class Retangulo:public ElementoGrafico { public : Retangulo(); ~Retangulo(); ... }; ... { ... ElementoGrafico elemento; Retangulo retangulo; ... } ElementoGrafico() ~ElementoGrafico() ... ElementoGrafico() Retangulo() ~Retangulo() ~ElementoGrafico() 227 Herança class ElementoGrafico { public : ElementoGrafico(); ~ElementoGrafico(); ... }; ... class Retangulo:public ElementoGrafico { public : Retangulo(); ~Retangulo(); ... }; ... ElementoGrafico *ptrA; ... ptrA = new ElementoGrafico(); delete ptrA; ... Retangulo *ptrB; ptrB = new Retangulo(); delete ptrB; ... ElementoGrafico() ~ElementoGrafico() ... ElementoGrafico() Retangulo() ~Retangulo() ~ElementoGrafico() 228 115 Herança Método virtual: • Definido em uma classe. • Pode se redefinido em classes derivadas. • Identificado pela palavra-chave virtual. • Novas declarações são feitas nas classes derivadas. • Pode facilitar a evolução futura. • Possibilita a especificação de interfaces. Classes sem métodos virtuais: • Classe tipicamente projetadas para não serem classes base em hierarquias. 229 Herança class Lista { public : virtual Bool inserir (int); ... }; class Conjunto : Lista { public : Bool inserir (int); ... }; Declaração de um método virtual. Presença do método em uma subclasse. 230 116 Herança Construtores e destrutores: • Os métodos construtores não podem ser métodos virtuais. • Os métodos destrutores podem ser virtuais. Destrutores não virtuais e virtuais: • Quando é destruído um objeto de uma classe derivada referenciado por um ponteiro para a classe base, o resultado é indefinido se o destrutor na classe base for não virtual. Tipicamente o destrutor da classe derivada não é invocado. 231 Herança class ElementoGrafico { public : ElementoGrafico(); ~ElementoGrafico(); ... }; ... class Retangulo:public ElementoGrafico { public : Retangulo(); ~Retangulo(); ... }; ... ElementoGrafico *ptr; ... ptr = new ElementoGrafico(); delete ptr; ... ptr = new Retangulo(); delete ptr; ElementoGrafico() ~ElementoGrafico() ... ElementoGrafico() Retangulo() ~ElementoGrafico() 232 117 Herança class ElementoGrafico { public : ElementoGrafico(); virtual ~ElementoGrafico(); ... }; ... class Retangulo:public ElementoGrafico { public : Retangulo();
Compartilhar