Orientação a Objetos
(O paradigma da orientação a objetos)
Zamir, Cap 1 Taylor, Cap 1 Wirfs-Brock, Cap 1
Meyer, Caps 1
Sandro Santos Andrade
sandros@ufba.br
Universidade Federal da Bahia
Departamento 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
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
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
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
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
Polimorfismo
Possibilita que objetos diferentes responstam à
mesma mensagem
Simplifica a lógica de programas:
ANTES if instrument is privateStock then value = valuePrivateStock(instrument) publicStock then value = valuePublicStock(instrument) ...
Otherwise report error
DEPOIS
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:
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.
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
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
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
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
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,
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
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 Objetos
e
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,
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
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
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
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
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
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,
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`
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
Fatores Externos
Fatores Externos
Tradeoffs:
Integridade x facilidade de uso Economia x funcionalidade
Eficiência x portabilidade Eficiência x reusabilidade Prazo x extensibilidade
Manutenção de Software
70% do custo do software é dedicado à
manutenção:
Para refletir mudanças do mundo externo