Orientação a Objetos (O paradigma da orientação a … · Polimorfismo: permite que novos tipos...
Transcript of Orientação a Objetos (O paradigma da orientação a … · Polimorfismo: permite que novos tipos...
Orientação a Objetos(O paradigma da orientação a objetos)
Zamir, Cap 1Taylor, Cap 1
Wirfs-Brock, Cap 1Meyer, Caps 1
Sandro Santos [email protected]
Universidade Federal da BahiaDepartamento de Ciência da Computação (DCC)
Laboratório de Sistemas Distribuídos (LaSiD)Especialização Avançada em Sistemas Distribuídos
O Paradigma OO
Permite que aplicações sejam construídos no contexto de objetos ao invés de processos
Benefícios: Qualidade do software, ganhos econômicos, ciclos de
desenvolvimento mais curtos, suporte a distribuição em ambientes heterogêneos
Mais de 80% das indústrias de desenvolvimento utilizam o paradigma OO (IDC)
É uma das quatro mais importantes áreas de interesse da indústria de TI (Gartner and Meta Groups)
Principais Conceitos
Objetos: Representações executáveis de entidades e conceitos
do mundo real
Mensagens: Disponibilizam um meio de comunicação universal para
interação entre objetos
Classes: Matrizes para a definição de objetos similares que
fornecem a base para a abstração das características comuns de objetos do mundo real
Objetos
O mundo é feito de objetos físicos e conceituais Def: um objeto é um pacote de software que inclui
todos os dados e procedimentos necessários para representar uma entidade do mundo real para um conjunto específico de propósitos
Implicações: Objetos são unidade de modularização do software Pacotes de objetos relacionam dados e procedimentos A modelagem se torna a atividade central no projeto do
software
Mensagens
Def: uma mensagem é uma requisição para que um objeto particular execute um procedimento (método) específico Ex: product.price (quantity);
A especificação da mensagem é geralmente chamada de assinatura
Uma mensagem pode ser respondida de diferentes formas por diferentes objetos
Classes
Def: uma classe é uma definição genérica que se aplica a um conjunto de objetos similares
Especifica os métodos e atributos usados por objetos que são instâncias desta classe
Instâncias mantêm valores locais e individuais dos seus atributos
Representam o mecanismo principal para o processo lógico de abstração
Estendem o mecanismo básico de tipagem das linguagens
Principais Mecanismos
Encapsulamento: Mecanismo de empacotamento de dados e
procedimentos dentro de objetos
Polimorfismo: Habilidade de implementar a mesma mensagem de
diferentes formas em diferentes objetos
Herança: Mecanismo para disseminar informações definidas em
classes genéricas para outras classes declaradas como casos especiais das classes genéricas
Encapsulamento
Objetos respondem e enviam mensagens de uma forma que não revela a sua estrutura interna
Suporta o ocultamento de informação: Previne que mudanças locais gerem impactos globais
Desenvolvedores mudam os atributos e métodos sem afetar a forma que o objeto interage Atributos privados + métodos acessores
Polimorfismo
Possibilita que objetos diferentes responstam à mesma mensagem
Simplifica a lógica de programas:
ANTES
if instrument isprivateStock then value = valuePrivateStock(instrument)publicStock then value = valuePublicStock(instrument)...Otherwise report error
DEPOIS
intrument.value()
Polimorfismo
Vantagens de mensagens polimórficas: São menores, reduzindo o tamanho e complexidade do
código-fonte Executam mais rápido visto que não requerem uma
busca para identificar qual mensagem enviar São flexíveis pois novas implementações podem ser
adicionadas ou removidas sem precisar reescrever a lógica de seleção da mensagem
Reflete a forma natural de comunicação: Ex: o gerente solicita de todos os departamentos:
“projete seu orçamento para o próximo ano fiscal”
Herança
Def: mecanismo que permite que uma classe seja definida como um caso especial, ou sub-classe, de outra (super-classe). Isto pode ocorrer em vários níveis, constituindo uma hierarquia de classes
Sub-classes automaticamente incorporam os métodos e atributos da super-classe (herança de implementação)
Uma classe pode manter a definição de um método herdado da super-classe ou pode realizar uma sobreposição (override)
Herança
Sobreposições suportam generalização / especialização
Heranças podem também ser utilizadas para categorizar tipos (herança de interface)
Algumas linguagens suportam herança múltipla. Seu melhor uso é para definir mix-ins
A Tecnologia de Objetos
Uma linguagem é OO se ela implementa os três mecanismos citados e não os conceitos: Uma linguagem pode ser OO sem ter os três conceitos Uma linguagem pode não ser OO mesmo possuindo os
três conceitos
Linguagens que suportam encapsulamento e polimorfismo mas não suportam herança são ditas baseadas em objetos
Benefícios
Produtividade: Resulta da habilidade de reusar lógica genérica
expressa em classes previamente construídas
Qualidade: Resulta da estrutura simplificada dos programas OO e
da maior oportunidade para testes de unidade extensivos
Evolução: Resulta da habilidade de alterar a estrutura e o
comportamento de objetos individuais sem afetar outros objetos do sistema
Produtividade
Manutenção representa 80% do custo total de um software
Codificação representa cerca de 20% do custo pré-manutenção
O objetivo é reuso de ciclo de vida: A análise e projeto são direcionados para valores de
longo-prazo Cada objeto irá requerer pouca ou nenhuma
modificação no futuro
Qualidade
O uso de objetos por si só não melhora a qualidade do software. Exs: mau uso de herança, altos acoplamentos
Porém: Encapsulamento: melhora a habilidade de isolar e
reparar problemas. Oferece melhor controle sobre acesso a dados
Polimorfismo: elimina as lógicas condicionais, simplificando sistemas complexos
Herança: reduz o tamanho e complexidade do software. Sobreposição elimina lógicas condicionais
Evolução
Construir sistemas que evoluem rapidamente em resposta a mudanças nos requisitos é um grande desafio
Mecanismos: Encapsulamento: permite que mudanças locais tratem
problemas que antes requeriam modificações extensivas
Polimorfismo: permite que novos tipos de objetos sejam adicionados sem modificar o código existente
Herança: permite que uma modificação local produza mudanças em larga escala no sistema
Evolução
Sistemas não devem ser projetados para resolver um conjunto específico de problemas
Deve-se analisar sistemas e criar modelos executáveis do mundo-real ao invés de analisar problema e desenvolver soluções específicas para o problema
Outros Mecanismos
Interfaces: Disponibilizam uma forma sistemática de separar quais
tarefas um objeto faz da forma como são realizadas
Delegação: Oferece uma alternativa à herança, simplificando o
sistema e aumentando a flexibilidade
Distribuição: Permite que um conjunto de objetos seja implantado
em diferentes máquinas de uma rede, incluindo a Internet
Interfaces
Na maioria das linguagens OO uma classe define tanto o que o objeto poderá realizar quanto como tais tarefas serão realizadas
Isso pode confundir dois conceitos importantes: O que um objeto faz define o seu tipo Como um objeto realiza tal tarefa define a sua
implementação
Def: uma interface é um conjunto identificado de assinatura de mensagens Especifica o tipo de um objeto através dos serviços que
ele oferece e da forma como estes serão utilizados
Interfaces
Benefícios: Classes de diferentes fornecedores podem ser
interconectadas Se interfaces são utilizadas como parâmetros de
funções, qualquer objeto que implementa a interface pode ser passado neste parâmetro
Interfaces podem restringir o acesso ao objeto se este implementa diversas interfaces, uma para cada papel
Interfaces foram explicitamente e sistematicamente suportadas pela primeira vez na linguagem Java
Delegação
Herança de implementação é perigosa pois viola o encapsulamento ao conceder, à sub-classe, acesso às estruturas internas da super-classe
Def: ao invés de realizar a tarefa, o objeto delega a função para outro objeto
Deve-se utilizar delegação sempre que adequado, reservando o uso de herança de implementação
Distribuição
Protocolos padronizados para comunicação de objetos em rede: CORBA, DCOM, RMI, EJB, Web Services
Permite: Location Transparency Remoteness Transparency Objetos móveis Balanceamento dinâmico de carga
Fatores de Sucesso
Motivação: Adotar a tecnologia de objetos pelas razões erradas
pode ser perigoso
Formação: Iniciar um projeto OO com uma visão parcial do
paradigma irá comprometer o sucesso do sistema
Determinação: Para sobreviver a um período inicial de retorno mínimo
antes de usufruir dos verdadeiros benefícios do paradigma
Orientação a Objetose
Qualidade de Software
Qualidade de Software
Fatores externos: Qualidades cuja presença ou ausência podem ser
percebidas por usuário do sistema. Ex: facilidade de uso, desempenho
Fatores internos: Qualidades percebidas somente pelos profissionais
que mantêm o código-fonte. Ex: modularidade, legibilidade
Os fatores externos são os mais importantes, porém os internos favorecem os externos
Fatores Externos
Corretude (correctness): É a habilidade de um software realizar suas tarefas de
maneira correta, conforme definido por sua especificação
Depende da especificação precisa dos requisitos Debugging x corretude desde o projeto Abordagens formais
Fatores Externos
Robustez (robustness): É a capacidade de um software reagir
apropriadamente a condições anormais Espera-se que, na ocorrência de casos anormais, o
sistema produza mensagens de erro apropriadas, termine sua execução de forma controlada ou entre em um modo de graceful degradation
Complementa a corretude
Fatores Externos
Extensibilidade (extendibility): É a facilidade de adaptar o software a mudanças na
especificação Depende diretamente da complexidade do software Os requisitos certamente mudarão Melhorada pelo uso de dois princípios:
Simplicidade de projeto: uma arquitetura simples é mais fácil de adaptar a mudanças do que uma complexa
Descentralização: quanto mais autônomos os módulos maior a chance de uma mudança afetar somente um módulo ou um pequeno número deles, ao invés de desencadear uma cadeia de reações em todo o sistema
Fatores Externos
Reusabilidade (reusability): É a habilidade onde os elementos do software servem
para a construção de muitas aplicações diferentes Sistemas computacionais seguem padrões similares Se menos código for escrito, maior atenção pode ser
dada a outros fatores, como corretude e robustez Indispensável para que tenhamos uma verdadeira
indústria de software
Fatores Externos
Compatibilidade (compatibility): É a facilidade de combinar elementos de software com
outros elementos Sistemas frequentemente precisam interagir uns com
os outros Deve-se utilizar formatos de arquivos, estruturas de
dados e interfaces de usuário padronizadas Protocolos padronizados tais como CORBA, web
services e OLE-COM contribuem para a compatibilidade
Fatores Externos
Eficiência (efficiency): É a habilidade de um software de demandar o mínimo
possível dos recursos de hardware (processador, memória, largura de banda, etc)
Um sistema super-otimizado pode ter sua extensibilidade e reusabilidade prejudicados
O rápido aumento do poder dos equipamentos incentiva uma postura mais relaxada em relação à eficiência
Fatores Externos
Eficiência (efficiency): Entretanto deve ser considerada pois:
Máquinas melhores devem trazer melhorias no desempenho: processar problemas prévios de forma mais rápida ou suportar problemas maiores
Algoritmos com complexidade ruim não são favorecidos por máquinas melhores: uma máquina com o dobro de poder irá processar o dobro em algoritmos O(n), 41% a mais naqueles O(n2) e somente um a mais em soluções O(2n)
Eficiência pode afetar a corretude: sistemas de tempo-real, previsão do tempo, etc
Fatores Externos
Portabilidade (portability): É a facilidade de transferir o sistema para vários
ambientes de hardware e software
Inclui mudanças no sistema operacional, gerenciadores de janelas etc
Facilidade de uso (ease of use): É a facilidade na qual pessoas de diferentes
experiências e qualificações podem aprender a usar o software e aplicá-lo na resolução de problemas. Isto inclui instalação, operação e monitoramento`
Princípio do Projeto de Interface de Usuário: não ache que você conhece o usuário, você não o conhece
Fatores Externos
Funcionalidade (functionality): É a extensão de funcionalidades providas pelo sistema
Featurism: pressão por novas funcionalidades
Funcionalidades demais afeta a facilidade de uso
Não se deve esquecer as outras qualidades:
Fatores Externos
Prazo (timeliness): É a habilidade de um software de ser lançado antes ou
no prazo estipulado
É uma das grandes frustrações da indústria
Outras qualidades: Verifiability Integrity Repairability Economy
Fatores Externos
Documentação: Externa, interna e de interface de módulo
Abordagens: Help on-line, linguagens de programação que
favorecem clareza e estrutura e ocultamento de informação
Fatores Externos
Documentação:
Fatores Externos
Documentação:
Fatores Externos
Tradeoffs: Integridade x facilidade de uso Economia x funcionalidade Eficiência x portabilidade Eficiência x reusabilidade Prazo x extensibilidade
O importante é analisar isso conscientemente
Manutenção de Software
70% do custo do software é dedicado à manutenção: Para refletir mudanças do mundo externo Para remover erros que nunca deveriam estar lá
Objetos
Mensagens
Classes
Interfaces
Herança
Herança - Hierarquias
Anatomia de um Objeto
Anatomia de um Objeto
Composição de Objetos
Delegação
Mensagens
Mensagens - Parâmetros
Mensagens – Restringindo
Polimorfismo
Polimorfismo