Orientação a Objetos (O paradigma da orientação a … · Polimorfismo: permite que novos tipos...

Preview:

Citation preview

Orientação a Objetos(O paradigma da orientação a objetos)

Zamir, Cap 1Taylor, Cap 1

Wirfs-Brock, Cap 1Meyer, Caps 1

Sandro Santos Andradesandros@ufba.br

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