Loading presentation...

Present Remotely

Send the link below via email or IM

Copy

Present to your audience

Start remote presentation

  • Invited audience members will follow you as you navigate and present
  • People invited to a presentation do not need a Prezi account
  • This link expires 10 minutes after you close the presentation
  • A maximum of 30 users can follow your presentation
  • Learn more about this feature in our knowledge base article

Do you really want to delete this prezi?

Neither you, nor the coeditors you shared it with will be able to recover it again.

DeleteCancel

Make your likes visible on Facebook?

Connect your Facebook account to Prezi and let your likes appear on your timeline.
You can change this under Settings & Account at any time.

No, thanks

Treinamento POO 2013

Treinamento de Programação Orientada a Objetos.
by

Cyro Guimarães

on 5 August 2013

Comments (0)

Please log in to add your comment.

Report abuse

Transcript of Treinamento POO 2013

Programação Orientada a Objetos
+
C++

Paradigma orientado a objeto
Objeto
Abstração
Encapsulamento
Herança
Polimorfismo
O Paradigma Orientado a Objetos (P.O.O.) é um paradigma que surgiu pelos fins dos anos 60 e que é usado hoje em larga escala.

Antes do P.O.O. os programas eram em grande parte escritos usando-se o paradigma estruturado.

Estruturada:
Divisão sucessiva de um problema maior em subproblemas cada vez menores e menos complexos
Possibilita a redução do programa a três estruturas: sequência, decisão e iteração.

Orientada a Objetos:
Criada para tentar "simular" o mundo real dentro do computador utilizando objetos.
Fundamentos do POO
Qualquer coisa é um objeto;
Objetos realizam tarefas a partir de requisições a outros objetos;
Cada objeto pertence a uma determinada classe;
Uma classe agrupa objetos com características semelhantes;
A Classe é um repositório para comportamento associado ao objeto;
Classes são organizadas em hierarquias.
Em um programa desenvolvido usando-se o paradigma orientado a objeto é possível visualizar o sistema como uma grande coleção de agentes interconectados, onde cada um realiza uma tarefa especifica que, ao final, gera a tarefa computacional desejada.
Objetos são representações computacionais de um elemento do mundo real.

Cada objeto possui:
Um conjunto de características próprio do objeto;
Comportamentos, ações.
Atributos
As características próprias de um objeto são chamadas de atributos.

Vamos usar como exemplo o objeto ‘Carro’.

Um carro pode ter os atributos :
Cor
Modelo
Numero de portas
Métodos
Os comportamentos/ações que um objeto pode ter/realizar são chamados de métodos.

Usando novamente o exemplo do objeto ‘Carro’, temos que um carro pode:
Acelerar
Frear
Mudar de marcha
Classe
Uma classe é um molde para a criação de objetos. Todo objeto deve obrigatoriamente pertencer a uma classe e nesse caso é dito que um objeto X é uma instancia da classe Y.

A Classe define os atributos que um objeto terá e quais métodos ela poderá executar. Normalmente as classes são criadas usando como base alguma coisa existente no mundo real.
Exemplo
Vamos definir que a classe carro possui 3 atributos :
Cor
Modelo
Numero de Portas

As imagens abaixo são todas exemplos de objetos pertencentes a classe Carro.
Um dos problemas que pode se ter ao criar uma classe é a complexidade excessiva.

Uma representação fiel de um objeto do mundo real pode ser computacionalmente inviável de se alcançar devido a complexidade do mesmo.

Para isso usamos em POO o conceito de abstração.
A abstração consiste em, ao modelar uma classe baseada em algo do mundo real, focar-se apenas nos atributos e metodos que sejam relevantes para o software em questão, ignorando os outros.
Exemplo
Suponha uma situação onde temos 2 programadores do GDP, cada um trabalhando em um projeto diferente.

O 1º Programador , Perdiga, está fazendo um jogo de corrida. O 2º Programador, Lessa, está fazendo um jogo estilo FPS.
Para o primeiro programador
Como o jogo sendo desenvolvido é um jogo de corrida, o foco no carro é nos atributos/metodos de movimentação, vendo o carro como um veiculo.
Exemplos:
Potencia do motor
Peso
Aerodinamica
Resposta da direção
Para o segundo programador
O jogo desenvolvido é um FPS ( First Person Shooter ). Nesse caso o foco dado aos carros é somente de barreira / ponto estrategico durante os combates, com isso temos alguns outros atributos a levar em conta.
Exemplos:
Geometria do carro
Resistencia Fisica da carcaça do carro
Como pode ser observado, a abstração é algo forte e que depende completamente do ponto de vista do observador/modelador do sistema.

Pontos importantes em um objeto para o sistema A podem ser inutéis para o sistema B.
Além disso, a abstração é a base dos principios da orientação a objeto, que veremos a seguir
O Principio do encapsulamento diz que objetos devem esconder sua complexidade do observador externo. Tudo o que alguém de fora sabe é que o objeto consegue realizar a ação requisitada, mas não é importante saber como essa ação é executada.
Em termos O.O. é dito que todo objeto possui uma interface. Essa interface define o que o objeto sabe fazer, sem explicitar como o objeto faz.
Modificadores de acesso
Na maioria das linguagens que suportam orientação a objetos existem palavras chamadas modificadores de acesso. Esses modificadores indicam qual a visibilidade do atributo/método de um objeto/classe.
No C++, por exemplo, existem três tipos de modificadores de acesso:

Public – Qualquer observador externo tem visão do atributo/método.
Protected – Somente as classes filho e a própria classe tem visão do atributo/método.
Private – Somente a própria classe tem visão do atributo/método.
Além desses existe mais um modificador de acesso que pode ser usado em conjunto com qualquer um dos três acima:

Static – Possibilita o acesso a um atributo/método de uma classe sem a necessidade de ter um objeto da classe instanciado.
Vantagens do encapsulamento
Fazer bom uso do encapsulamento pode ser algo positivo para o seu sistema, por vários motivos:

É possível se trocar um objeto de uma classe por outro de uma classe diferente, desde que as duas classes tenham interfaces iguais.
O seu projeto tende a assumir uma característica modular, facilitando o seu desenvolvimento e a detecção e correção de problemas que seriam difíceis de se encontrar em um programa mal encapsulado ou desenvolvido em um paradigma estrutural.
Regras para encapsulamento
É impossível ditar regras 100% eficientes quando se trata de encapsulamento, porem algumas boas praticas são sempre boas de serem seguidas:

Atributos normalmente são privados ou protegidos, principalmente atributos que requerem algum tipo de validação de entrada.
Métodos que fazem parte da interface da classe devem ser públicos.
Métodos auxiliares usados internamente pela classe devem ser privados ou protegidos
Cor = Azul
Modelo = Dodge Viper
Numero de Portas = 2
Cor = Cinza
Modelo = Ford Mustang
Numero de Portas = 2
Cor = Verde
Modelo = Fusca
Numero de Portas = 2
C++
Em C++ uma classe é definida da seguinte maneira :
Construtor e Destrutor
Toda classe possui pelo menos um método chamado de método construtor e um método chamado de método destrutor.

O Construtor serve pra inicializar um novo objeto da classe, com seus valores defaults e estruturas internas devidamente instanciadas ( Ponteiros, etc.. ).

O Destrutor por sua vez serve para tratar do encerramento da classe e da liberação de recursos como memória alocada, sockets de conexão abertos e afins.
Note que algumas linguagens tipo Java, que possui o garbage collector, o conceito de destrutor não existe.
C++
Em C++ o encapsulamento é feito usando as palavras reservadas 'public', 'protected' e 'private'.

Após uma dessas palavras aparecerem, o escopo dos atributos/métodos que aparecerem depois será aquele definido pela palavra, até outra palavra de escopo for encontrada.

Caso nenhum escopo seja definido pelas palavras, o padrão do C++ é Private.
Repare que se o construtor for definido como private a classe não poderá ser instanciada de fora da própria classe!
Herança é um principio da orientação a objeto que permite que classes semelhantes compartilhem propriedades comuns. É usada principalmente com o objetivo de reaproveitar código e/ou especializar certos comportamentos.
Uma classe derivada de outra é chamada subclasse ou classe filha.

Uma classe da qual derivam outras classes é chamada de superclasse ou classe pai.
Propriedades da herança
Quando uma classe B herda de uma classe A ela herda todas as propriedades da classe A (atributos e métodos ).

A herança é transitiva, logo, se uma classe C herda de B e essa por sua vez herda de A, C possuirá todas as propriedades de A e B.

A herança também é antissimétrica, se uma classe B herda de A, B possuirá todas as propriedades de A, porém A não terá todas as propriedades de B.
Acesso as propriedades
Ao herdar de uma classe, uma subclasse só terá acesso às propriedades que forem publicas OU protegidas da superclasse, propriedades privadas continuam fora do escopo da subclasse e só poderão ser acessadas através de métodos próprios da superclasse.
Sobrescrita de Métodos

Uma subclasse pode sobrescrever um método da superclasse com a mesma assinatura.

Durante a chamada do método será executado o método mais especifico de todas as possibilidades ( Subclasse > Superclasse ).

Normalmente as linguagens possuem alguma forma de se chamar especificamente um método da superclasse de dentro de uma subclasse.

Java - super();
C++ - ClasseBase::metodo();
C++
Classes Abstratas
(Interfaces)

Em P.O.O. existe o conceito de classes abstratas ( também chamadas de interfaces ).

Essas classes são classes que não foram feitas para serem instanciadas e usadas como objeto, ao invés disso elas servem como um molde para as classes que herdarem dela, usando pra isso métodos puramente virtuais.
Métodos puramente virtuais são métodos que devem ser definidos nas subclasses para que a classe possa ser instanciada, caso a subclasse não implemente algum dos métodos ela também se torna uma classe abstrata e não poderá ser instanciada.
Classes abstratas servem para garantir que as classes que herdem delas saibam fazer certas coisas.

Ex.: Definimos uma classe abstrata ContaBancaria que define dois métodos puramente virtuais : void depositar(int) e void sacar(int).

A partir disso, qualquer classe que herde de ContaBancaria deve implementar esses dois métodos para ser aceita como um tipo de ContaBancaria.
C++
Polimorfismo é a capacidade de uma classe de decidir, em tempo de execução, o método apropriado que deve ser chamado de uma de suas subclasses, a partir de uma referencia a classe base.
Suponha que temos o seguinte esquema de classes em um programa C++.
No nosso programa, temos uma função com o prototipo e implementação abaixo :
O que vai acontecer ao chamarmos ser->falar() ?
Depende!
Como a classe SerVivo por definição é uma classe abstrata ( Possui um metodo puramente virtual ) ela por si só não pode ser instanciada, o compilador na hora de executar o código vai chamar a função da subclasse certa, magicamente.
Provas!
Abaixo seguem as definições das classes, uma main e uma saida gerada pela main.
Em C++ a herança é feita da seguinte forma :
No C++, uma classe é dita abstrata se ela possui algum método puramente virtual.

Um método puramente virtual é definido com a palavra reservada 'virtual' antes do tipo de retorno, e após os parametros deve possuir '= 0;', isso indica ao compilador que o método deve ser implementado pelas subclasses.

Uma classe que possua um método desse tipo NÃO pode ser instanciada, mas pode ser referenciada.
Exemplo
Classe abstrata, pois possui um método puramente virtual ( void doSomething(int i); )
Classe abstrata, que herda da primeira interface e adiciona outro método puramente virtual.
Classe concreta que usa a primeira interface, e implementa o método void doSomething(int i)
Classe concreta que usa a segunda interface, e implementa os métodos void doSomething(int i) e void doAnotherThing(double z)
Repare que...
Se no meu programa existir uma função que receba uma referencia a um objeto que implemente a interface ExemploInterface, poderiamos passar tanto uma referencia a um objeto da classe ImplementaInterface ou ImplementaInterface2, ja que ambos herdam de ExemploInterface ( direta ou indiretamente ).

Porém, no caso de uma função que receba uma referencia a um objeto que implemente a interface ExemploInterface2, apenas o objeto da classe ImplementaInterface2 seria válido, ja que objetos da classe ImplementaInterface não garantem a existencia de um metodo 'void doAnotherThing(double z)'
Especificidades do C++
A linguagem C++ possui, além do básico de POO, algumas outras features interessantes disponiveis ao programador que não se enquadram muito bem nas definições padrões aqui apresentadas.

Nessa parte vamos falar das mais importantes em um primeiro momento. São elas :

Passagem de parametro por referencia
Redefinição de Operadores
Passagem por referencia
Quem ja programou C sabe a dor que é se preocupar com passagem de parametro por ponteiro, algumas das duvidas mais frequentes são :
Quando é seta, quando é ponto?
Quando a variavel vai ser modificada, quando nao vai ser?
Onde entra o *, onde entra o &?
O C++ possui algo que facilita na hora de fazer passagem de parametros que o programador quer que as modificações sejam aplicadas no objeto original.

Essa ferramente é a passagem por referencia.
Ao se passar um parametro por referencia ele é tratado no código como um objeto normal, e qualquer alteração feita nesse objeto se propagará para o objeto original.

Além disso, não existe a preocupação com passar o endereço da variavel, já que o compilador trata isso automaticamente para você.
Porém nem tudo são flores, passagem por referencia possui alguns pontos negativos :

Referencias devem ser feitas no momento da inicialização da variavel ( No caso de uma referencia como atributo de uma classe, isso significa ser definida antes do código do construtor )
Ao contrario de ponteiros, referencias não podem mudar a que elas se referem durante a execução
Imprime
10
10
11
Redefinição de operadores
O C++ permite, além de redefinir métodos da superclasse, a redefinição dos operadores da linguagem.

Ex.: Se eu tenho uma classe Vetor(x,y), eu posso redefinir os operadores de +,-,*,/ para realizar operações que façam sentido com Vetor. ( Soma, Subtração, Produto Escalar, Produto vetorial... )
Ex .: Sejam p1 e p2 objetos da classe Ponto e n um double, eu quero que o resultado de :
p1 + p2 seja um Ponto p3 que é a soma vetorial de p1 com p2
p1 - p2 seja um Ponto p3 que é a subtração de p2 em p1.
p1 * p2 seja um double que é o produto escalar de p1 com p2 (p1.x*p2.x + p1.y*p2.y)
p1 * n multiplique x e y de p1 por n
p1 / n divida x e y de p1 por n
Obs .: Operadores não funcionam direito com ponteiros!

Evite ao máximo ponteiros caso queira fazer uso de redefinição de operadores
Basicamente todos os operadores do C++ podem ser sobrecarregados, com exceção de :

. ( Acesso a membro )
.* ( Acesso a membro por ponteiro )
:: ( Resolução de escopo )
? ( Ternário )
sizeof ( Checagem de tamanho em bytes )

Para uma lista de todos os operadores disponiveis, procurem na wikipedia!
Estruturada x Orientada a Objetos
Full transcript