Você está na página 1de 53

ALGORITMOS E Prof.

Raul Sidnei

PROGRAMAÇÃO Wazlawick
13. NOÇÕES DE
PROGRAMAÇÃO
ORIENTADA A
OBJETOS
 História e motivação
 Modelagem conceitual
 Transformando o modelo conceitual
em código
 Desenvolvimento do programa
 Para onde podemos ir a partir daqui
HISTÓRIA E MOTIVAÇÃO
 Programming in the small
 Tudo o que vimos até aqui
 Decomposição funcional funciona só até certos limites

 Programming in the large


 Necessidade de novas técnicas para organização de grandes sistemas
 Desenvolvimento orientado a objetos
SKETCHP
AD 1963
Primeira vez que os conceitos de classes e
objetos foram usados em um sistema
Ivan Sutherland (EUA, 1938-)
SIMULA 67
 Primeira linguagem de programação considerada orientada a objetos
 Linguagem de propósito especial: programação de simulações discretas
SMALLTALK, 1970-1980
 Primeira linguagem orientada a objetos de propósito geral

Alan Kay (EUA, 1940) Adele Goldberg (EUA, 1945)


MODELAGEM CONCEITUAL
 Um modelo conceitual é composto por
combinações de apenas 3 tipos diferentes de
informação:
 Conceitos ou classes, que especificam objetos complexos
capazes de armazenar informação na forma de atributos e
capazes de se associar uns aos outros.
 Atributos, que são informações simples como números ou
strings que só podem existir dentro de objetos.
 Associações, que especificam a forma como os objetos
podem se relacionar uns com os outros.
EXEMPLO: SUPERMERCADO
 Classes candidatas:
 Caixa
 Cliente
 Produto
 Mercado
ATRIBUTOS
 Há um princípio em desenvolvimento ágil de sistemas que diz que
devemos maximizar a quantidade de trabalho não feito.
 Assim, se produtos, neste exemplo, não precisam ter nome ou preço,
não devemos inserir estes atributos, mesmo que pudéssemos.
 A ideia é resolver o problema com o mínimo possível e necessário de
estrutura.
ATRIBUTOS DA CLASSE
“CLIENTE”
ATRIBUTOS DA CLASSE
“CAIXA”
A FILA DE CLIENTES NO CAIXA
É UM PAPEL DE ASSOCIAÇÃO
MODELO CONCEITUAL
COMPLETO

Este diagrama segue a notação da


linguagem UML
(Unified Modeling Language)
ATRIBUTOS DERIVADOS DA
CLASSE “MERCADO”
 ociosidade_média = caixas.sum(tempo_ociosidade)/caixas.size()
 a ociosidade média é definida como a soma dos tempos de ociosidade de cada caixa
dividido pelo número total de caixas.
 espera_média = espera_total/quant_clientes
 a espera média é definida como a espera total dividida pelo número total de clientes.

As expressões seguem a notação da linguagem OCL (Object


Constraint Language)
TRANSFORMANDO O MODELO
CONCEITUAL EM CÓDIGO
 Classes agrupam:
 Atributos (variáveis)
 Associações (também usualmente representadas por variáveis)
 Métodos (funções associadas a uma única classe)
CLASSE “CLIENTE”

Atributos

Métodos
INICIALIZAÇÃO DE UMA
CLASSE
 No caso de clientes, sempre que uma instância é criada, o atributo
“tempo_espera” deve valer zero e o atributo “quant_produtos” deve
valer um inteiro aleatório entre 0 e 100.

 Em Python, para definir o método que automaticamente inicializa as


instâncias de uma classe é “__init__”, que tem como parâmetro “self”:

def __init__(self):
CLASSE “CLIENTE” COM
INICIALIZAÇÃO
Método
privativo
Constante
privativa
CRIANDO UMA INSTÂNCIA E
ENVIANDO MENSAGENS A ELA

Criação de
instância
CLASSE “CAIXA”
CLASSE “MERCADO”

 Inicialização:
ATRIBUTOS DERIVADOS
DESENVOLVIMENTO DO
PROGRAMA
MÉTODO DA CLASSE
“MERCADO”
MÉTODO DA CLASSE
“MERCADO”

Método na classe “Caixa”


MÉTODO NA CLASSE “CAIXA”

 Ele existe para manter o acoplamento fraco


 A classe “Caixa” não tem associação com a classe “Cliente” e, portanto,
não pode enviar uma mensagem diretamente a uma instância de
“Cliente”.
MÉTODO NA CLASSE “CAIXA”
ATUALIZAÇÃO DE MÉTODO
NA CLASSE “MERCADO”
MÉTODO NA CLASSE “CAIXA”
DIAGRAMA DE CLASSE COMPLETO
O PROGRAMA COMPLETO
A versão estruturada apresentada no Capítulo 10 que tem em um único
algoritmo apresenta complexidade ciclomática 16.
EXERCÍCIO 13‑1: (PROJETO
FINAL)
 Como projeto final, vamos desenvolver o famoso jogo chamado "animal".
 O jogo consiste em solicitar ao usuário que pense em um tipo de animal
como gato, cão, cavalo, aranha, peixe etc.
 Depois o computador vai tentar adivinhar qual animal o usuário pensou.
 Para isso, ele vai fazer perguntas como "tem pelos?", "sabe nadar?", "vive
dentro das casas?" etc. A cada pergunta o usuário responde "sim" ou "não".
 No final de uma série de perguntas, o computador tenta adivinhar o animal.
 Ele vai perguntar, por exemplo, "é um gato?".
 Se o usuário responder que sim, então o computador adivinhou o animal.
 Mas se o usuário responder que não, o computador vai tentar aprender com
o erro.
 O computador vai pedir para o usuário escrever o nome do animal
em que ele tinha pensado.
 Depois ele vai pedir para o usuário escrever uma pergunta cuja
resposta seja "não" para o gato (ou qualquer que tenha sido o
animal que o computador achou que era) e "sim" para o animal
que o usuário pensou.
 Dessa forma, o computador terá aprendido uma nova pergunta
para seu repertório e numa próxima vez que um usuário pensar
neste animal ele saberá diferenciá-lo de um gato.
 Para implementar uma solução para este problema, sugerimos que
você modele duas classes: a classe "Animal", que contém um único
atributo que consiste no nome do animal, e a classe "Pergunta" que
tem três propriedades: um atributo correspondendo ao texto da
pergunta e duas associações que podem ser ocupadas tanto por
outras instâncias de "Pergunta" quanto por uma instância de
"Animal".
 Essas duas associações correspondem à próxima pergunta a ser
feita ou ao animal a ser adivinhado quando a resposta do usuário
for "sim" ou "não" à pergunta feita.
 O processo de execução deste programa é recursivo.
 Inicialmente, o programa deve tomar o primeiro elemento ou raiz
do raciocínio.
 Este elemento pode ser uma pergunta como "Ele pode respirar
debaixo da água?".
 A associação "sim" leva desta pergunta para o animal "peixe" e a
associação "não" leva desta pergunta para o animal "gato".
 Inicialize a variável "raiz" do programa principal com esta
pergunta apenas.
 Quando o computador acerta a resposta, não há nada a fazer, a não
ser comemorar.
 Mas quando ele erra, ele deve criar uma nova pergunta com o texto
que o usuário informar, colocar o animal original na associação
"não" e o novo animal informado na associação "sim".
 E a pergunta que originalmente levou ao animal original deve
substituir esse animal na respectiva associação pela nova pergunta
que acaba de ser criada.
 Vamos exemplificar o funcionamento do programa.
 Inicialmente, suponha que a raiz aponta diretamente para a pergunta "Ele
respira debaixo da água?" com associação "não" para "gato" e associação
"sim" para "peixe":

 Estamos usando aqui um outro diagrama da UML conhecido como diagrama


de objetos. Aqui, em vez de classes, estamos representando as instâncias e
com isso simulando a execução do programa.
 O programa vai pedir ao usuário que pense em um animal. Vamos
dizer que o usuário pensou em um canário.
 Inicialmente, o programa vai perguntar se o animal respira debaixo
da água, pois é a primeira pergunta que está ligada à raiz.
 O usuário vai responder que não.
 Assim, o programa deve passar recursivamente ao conteúdo da
associação "não", que, no caso, é o animal "gato".
 O programa vai então perguntar se o animal é um gato.
 Quando o usuário disser que não, ele vai pedir qual é o animal (é
um canário) e qual a pergunta que responde "sim" para canário e
"não" para gato, ao que o usuário pode dizer que é "Ele pode
voar?".
 O programa então cria uma nova pergunta com esse texto, liga o
gato pelo "não", o canário pelo "sim" e substitui o "não" da
pergunta anterior ("Ele respira debaixo da água?") pela nova
pergunta recém criada:
 Neste ponto, o programa pergunta se o usuário quer jogar
novamente.
 Se ele responder que sim, o programa pede novamente que pense
em um animal.
 Agora suponha que o usuário pensou em um "gato".
 O programa faz a pergunta raiz: "Ele respira debaixo da água?",
ao que o usuário vai responder "não", o que leva o programa à
pergunta "Ele pode voar?".
 Quando o usuário responder "não" novamente, o programa vai
obter o animal "gato" e perguntar "é um gato?".
 Neste ponto, o programa adivinhou o animal.
 O processo de aprendizagem, claro, pode continuar
indefinidamente.
 Você pode usar recursividade, se quiser, para fazer as chamadas das
perguntas.
 Ou seja, dentro de uma pergunta você pode chamar recursivamente
o objeto da associação "sim" ou "não" conforme o caso.
 A condição de parada dessas chamadas recursivas ocorre quando o
objeto chamado é um animal e não mais uma pergunta.
 Neste caso, não há mais para onde ir e apenas se pergunta se o
animal corresponde ao que o usuário pensou.
 Além disso, é possível aqui usar uma característica de linguagens
orientadas a objetos que é o polimorfismo.
 Essa característica permite que duas classes implementem métodos
com o mesmo nome.
 O polimorfismo, junto com o conceito de acoplamento dinâmico
usado por Python, permite que você envie uma mensagem a um
objeto sem saber a que classe ele pertence.
 Se, por exemplo, tanto a classe "Animal" quanto a classe
"Pergunta" implementam o método "processa", por exemplo, então
pode-se enviar a mensagem "processa" a uma variável "x" que
pode tanto conter um animal quanto uma pergunta.
 Se "x" contém um animal, vai executar a implementação da classe
"Animal", mas se "x" contém uma pergunta, ele vai executar o
método implementado na classe "pergunta".
SOLUÇÃO
PARA ONDE PODEMOS IR A
PARTIR DAQUI
 Algoritmos de alta complexidade
 Bancos de dados
 Implementação de interfaces gráficas
 Programação paralela e concorrente
 Análise e design orientados a objetos
 Teste automatizado de software
 Desenvolvimento ágil
 Gerenciamento do desenvolvimento de software
 Etc.
TÓPICOS VISTOS NESTE CAPÍTULO

Você também pode gostar