Вы находитесь на странице: 1из 63

Orientao a Objetos com

Ruby
Arthur de Moura Del Esposte - esposte@ime.usp.br

By Arthur Del Esposte licensed under a Creative Commons Attribution 4.0


International (CC BY 4.0)
Aula 03 - Duck Typing,
Mdulos e Excees
Arthur de Moura Del Esposte - esposte@ime.usp.br

By Arthur Del Esposte licensed under a Creative Commons Attribution 4.0


International (CC BY 4.0)
Grady Booch
Na Anlise Orientada a Objetos, procuramos
modelar o mundo identificando as classes e
objetos que formam o vocabulrio do domnio do
problema, e no design orientado a objeto,
inventamos as abstraes e os mecanismos que
fornecem o comportamento que esse modelo
requer - Object-oriented design: With
Applications, (1991)

3
Agenda
Polimorfismo e Duck Typing
Mdulos e Mix-ins
Tratamento de erros

4
Exerccio

Crie uma classe chamada Fraction para representar uma frao matemtica.
Ela deve ter os seguintes mtodos:
Fraction#initalize - Construtor para receber o numerador e denominador
Fraction#to_f - Mtodo para converso para Float
Fraction#to_s - Mtodo que retorna um string com a frao
Fraction#* - Mtodo que recebe outro objeto de Frao ou nmero inteiro e retorna uma novo
objeto do tipo Fraction com o resultado da multiplicao
Mtodos de acesso s variveis de numerador e denominador

5
Orientao a Objetos:
Polimorfismo

6
Polimorfismo

O que Polimorfismo?

7
Polimorfismo
Polimorfismo um conceito fundamental em POO para obter comportamentos
diferentes entre objetos de tipos variados usando-se a mesma interface
Com sobrecarga de mtodo, poderamos ter vrias implementaes com a
mesma assinatura cujo comportamento variasse de acordo com o parmetro

pessoa.reagir(new FilmeDeComedia); // KKKKKKKKKKKKK

pessoa.reagir(new FilmeDeTerror); // Que medo! 8


Polimorfismo
Podemos tratar vrios tipos diferentes de objetos da mesma forma
Usando herana
Usando interface
O Polimorfismo substitui a necessidade de verificao de tipo. Por exemplo:
Se for um funcionrio do tipo horista, ento calcule o pagamento baseado nas horas de
trabalho
Se for um funcionrio do tipo assalariado, ento calcule o pagamentocom seu salrio fixo
Se for um funcionrio do tipo comissionado, ento calcule o pagamento baseado nas suas
vendas

9
Polimorfismo - Exemplo em Java

Empregado empregado = new Assalariado();

empregado.vencimento(); 10
Polimorfismo - Exemplo em Java

Classe Abstrata

Empregado empregado = new Assalariado();

empregado.vencimento(); 11
Classes Abstratas - Parte 1
No h o conceito de Classes Abstratas em Ruby
Porm, podemos alcanar os mesmos objetivos de design (como
Polimorfismo) de outras formas
Veja o exemplo com o padro de projeto Template Method

12
Classes Abstratas - Parte 2

13
Classes Abstratas - Parte 3
Outra estratgia lanar uma Exceo no mtodo que deve ser
obrigatoriamente sobrescrito

14
Polimorfismo em Ruby
J vimos que no existe sobrecarga de mtodo, portanto esse tipo de
polimorfismo est descartado =(
Herana bem mais utilizada para reuso de cdigo e definio hierrquica do
que para poliformismos baseado em tipos, afinal no temos declarao de
tipos em Ruby
O conceito de Interfaces no existem em Ruby tambm. Afinal no mantemos
referncias aos tipos de objetos e a verificao da interface de um mtodo
realizada no momento que o mtodo chamado!

15
Polimorfismo e Duck Typing - Parte 1
Em Ruby, duas classes diferentes no precisam compartilhar tipos para
obtermos polimorfismo sobre seus mtodos
Duck Typing uma forma de determinar a semntica vlida de um objeto
baseado no que ele pode fazer (seus mtodos e propriedades), em vez de seu
tipo (sua herana ou implementao de interface)
Portanto, Ruby valoriza mais o que um objeto faz (capacidades) do que o ele
(seu tipo/classe). Por isso o uso do mtodo respond_to?

Se anda como um pato e faz barulho como um pato, ento deve ser um pato

16
Polimorfismo e Duck Typing - Parte 2

17
Polimorfismo e Duck Typing - Parte 2

Duck Typing =D

18
Exerccio
Crie as classes necessrias para o seguinte programa possa funcionar
corretamente:

19
Mdulos e Mix-ins

20
Mdulos
Algumas vezes queremos agrupar algumas estruturas que no formam uma
classe naturalmente
Mdulos (Module) so agrupadores de mtodos, classes e constantes que
podem ser utilizados por vrias classes
Classes esto relacionados a objetos e Mdulos esto relacionados a funes
A Ruby tem alguns mdulos nativos, como o Math (Teste no IRB)

21
Namespaces
O que aconteceria se dois arquivos ou bibliotecas diferentes que voc
dependesse tivessem classes com o mesmo nome?

Adaptado de http://practicingruby.com/articles/uses-for-modules-1 22
Namespaces
Mdulos so muito teis para resolver conflitos de nome
Mais especificamente, no temos mais conflitos de constantes

Adaptado de http://practicingruby.com/articles/uses-for-modules-1 23
Namespaces
Namespaces tambm so importantes para variveis e constantes:

Adaptado de http://practicingruby.com/articles/uses-for-modules-1 24
Mix-ins
O que acontece se eu definir mtodos de objetos em um mdulo?
Como podemos usar esses mtodos?

25
Mix-ins
Embora no possamos criar instncias de mdulos, ns podemos inclu-los na
definio de uma classe!
Quando fazemos isso, todos os mtodos de instncia de um mdulo se
tornam disponveis como mtodos dos objetos da classe extendida tambm
Isso so Mix-ins
Mdulos includos em classes se comportam como Superclasses
Mdulos eliminam qualquer necessidade de Herana Mltipla =D

26
Mix-ins

27
Mix-ins

Esse mdulo foi


Mixado (Mixed in)
nessas duas classes!

28
Mix-ins

29
Mix-ins - Interao com a Classe
O maior poder dos Mix-ins est quando o cdigo do Mdulo interage com o
cdigo da classe, como no exemplo do mdulo EnglishSpeaker
O Mdulo nativo Comparable pode ser usado para adicionar mtodos de
comparao a uma classe (<, <=, ==, >= e >). Para que isso funcione, o mdulo
Comparable assume que qualquer classe que o use define o mtodo de
comparao <=>
Vamos fazer isso com a classe Song, baseado no tempo de durao das
msicas

30
Mix-ins - Variveis de Instncia
Lembram como as variveis de instncia so criadas?
O mdulo que voc inclui em uma classe pode criar variveis de instncia aos
objetos da classe, assim como os mtodos de acesso a essas variveis

31
Mix-ins - Include
O include para incluir mdulos em uma classe no tem nada a ver com
arquivos
Se o mdulo includo est em um arquivo diferente, esse arquivo deve ser
includo usando require para que ele possa ser carregado antes de ser
includo
O include no copia os mtodos para dentro da classe. As classes que
incluem um mesmo mdulo passam a apontar para as definies desse
mdulo. Caso o mdulo seja alterado, todos as classes tero seus
comportamentos modificados

32
Mix-ins - Include
Todas as classes respondem ao mtodo include
Portanto podemos adicionar mdulos em uma classe aps sua definio:
String.include MyModule # => true
Repare que esse mtodo bem diferente do String#include?
"something".include? "thing" # => true

33
Mix-ins - Extend
possvel usar Mix-ins em objetos diretamente para estender suas
funcionalidade
Assim, o mdulo no includo para todos objetos de uma classe, somente
para o objeto estendido
Se um objeto a estendido com o mdulo B, esse objeto passar a se
comportar como B definir
Mix-ins so fundamentais para Duck Typing

34
Mix-ins - Extend

35
Mix-ins - Extend
Classes tambm so objetos. Portanto elas podem ser estendidas com
Mdulos para adicionar novos mtodos de classe

36
Considerando o cdigo abaixo e as diferenas entre include e extend,
quais opes no retornam erro?

1. Chamada direta em B
B.do_something
2. Chamada em um instncia de B
B.new.do_something
3. Chamada em um objeto de A
A.new.do_something
4. Chamada direta em A
A.do_something
5. Extenso e chamada em um objeto
String
word = "something"
word.extend A 37
word.do_something
Considerando o cdigo abaixo e as diferenas entre include e extend,
quais opes no retornam erro?

1. Chamada direta em B
B.do_something
2. Chamada em um instncia de B
B.new.do_something
3. Chamada em um objeto de A
A.new.do_something
4. Chamada direta em A
A.do_something
5. Extenso e chamada em um objeto
String
word = "something"
word.extend A 38
word.do_something
Exerccio

Escreva um mdulo chamada Reflection que possua o seguinte mtodos de


instncia:
class_tree - mtodo que imprime a classe do objeto e todas as suas classes
ancestrais at o BasicObject

Aps isso, imprima a class_tree do nmero 5, da String Hello World, do smbolo


:name, do Array [1, 2, 3], de Hash

Dica:
Verifique a superclasse de BasicObject

39
Exerccio
Uma pessoa quando se torna um programador ganha a habilidade de
programar e pode aprender uma ou mais linguagens de programao.
Baseado nisso, crie um programa que satisfaa o seguinte cdigo:

40
Tratamento de Erros

41
Tratamento de Erros

42
Erros Numricos e Excees
Em muitos lugares usam cdigos de erros no retorno para notificar quando um
erro acontece em uma operao:
Programas em C
Comandos no terminal
HTTP =D
As linguagens modernas trouxeram formas mais especficas de tratamento de
erros: as Excees!
Excees so objetos da classe Exception que representam algum tipo de
condio excepcional, indicando que algo no ocorreu como esperado!
Quando isso ocorre, uma exceo levantada (ou lanada)

43
Tratamento de Erros
Exceptions Handlers so blocos de cdigo que so executados se uma
exceo ocorrer durante a execuo de um bloco de cdigo especfico

44
Tratamento de Erros
Exceptions Handlers so blocos de cdigo que so executados se uma
exceo ocorrer durante a execuo de um bloco de cdigo especfico

No tratado

Bloco tratado

Bloco de
Recuperao

Continuao

45
Hierarquia de Excees
O Ruby tem algumas excees
pr-definidas que podem ser utilizadas
para tratar erros em seu cdigo!
Todas herdam de Exception conforme
a imagem retirada do livro
Programming Ruby
A maior parte das excees herdam
de StandardError

46
Rescue
Dentro do bloco de tratamento de exceo, o rescue sempre recebe um
parmetro referente a qual tipo de exceo deve ser tratado
Se nada for especificado, sero capturados StandardError por padro
Podemos ter vrios rescue no mesmo bloco para tratar tipos de erros
diferentes

47
Rescue e detalhes da exceo
Quando uma exceo lanada, o Ruby compara essa exceo com cada um
dos rescue para identificar qual bloco ir realizar o tratamento da exceo
O bloco ser executado se a exceo no parmetro do rescue for do mesmo
tipo da exceo lanada, ou for uma superclasse dessa exceo
possvel obter mais detalhes do erro ocorrido mapeando o objeto da
Exceo para uma varivel no parmetro do rescue

48
Ensure
Se houver alguma parte do cdigo que deve ser executada sempre ao fim de
um bloco, independente se foi lanada ou no uma exceo, colocamos esse
bloco dentro de uma clusula ensure

49
Qual ser a sada do seguinte cdigo?

1. 1 2 6
2. 1 5 6
3. 1 4 6
4. 3 6
5. 1 3 6
6. 2 3 6

50
Qual ser a sada do seguinte cdigo?

1. 1 2 6
2. 1 5 6
3. 1 4 6
4. 3 6
5. 1 3 6
6. 2 3 6

51
Lanando Excees
Ns podemos lanar excees para tratar erros indesejados em nosso cdigo
usando a clusula raise, instanciando uma nova Exceo
Mtodos implementados em classes e mdulos geralmente lanam excees,
enquanto os clientes dessas classes tratam excees

52
Lanando Excees
Quando passamos somente um texto com nenhuma classe especfica de
Exceo na chamada do raise, o Ruby cria por padro uma exceo do tipo
RuntimeError

53
Criando Excees
Muitas vezes pode ser til criar seus prprios tipos de Excees
Suponha que queremos lanar um exceo do tipo InvalidDenominatorError
Tente lanar a exceo abaixo diretamente no seu IRB

54
Criando Excees
Precisamos criar nossas classes de Exceo herdando de algum tipo de
Exceo j existente!
Portanto crie a seguinte classe com o namespace do seu software e tente
novamente lanar a exceo abaixo

55
Reviso!

56
O que j vimos!
Polimorfismo e Duck Typing
Mdulos e Mix-ins
Tratamento de Erros

57
Atividades Sugeridas!

58
Resolver os seguintes desafios

Melhore o cdigo do o exerccio do Programador realizado anteriormente:


Lance a exceo Programmer::LanguageNotLearnedError quando o mtodo program for
chamado com uma linguagem de programao no aprendida
Crie um mdulo ProgrammingLanguage que contenha uma constante com a lista das
linguagens de programaes disponveis para aprender e usar (Java, Ruby, Python e C++). O
mtodo learn_to_program deve lanar uma exceo caso seu parmetro no seja uma dessas
linguagens.
Programadores possuem diferentes nveis de habilidades em cada linguagem de programao.
Quando ele aprende um linguagem inicialmente seu nvel 1 e quando j domina
completamente a linguagem chega ao nvel 10. Crie o mtodo train no mdulo Programmer
que recebe uma linguagem de programao que dever aumentar a habilidade do
programador em relao a essa linguagem em 1.

59
Resolver os seguintes desafios

Modele e crie um programa para gesto de livros em uma biblioteca,


identificando as principais classes, mdulos, relacionamentos entre elas e
erros que devem ser tratados com Excees especficas do programa:
Cadastrar livros com as informaes de ttulo, autores, e nmero de pginas. Cada livro pode
ter 0 ou mais exemplares
Listar ttulos disponveis
Listar todos os livros de um autor
Emprestar um livro para um leitor, guardando-se o nome e email do usurio. O emprstimo
deve registrar a pendncia do leitor com a biblioteca e diminuir o nmero de exemplares.
Devoluo de um livro, registrando a quitao do leitor com a biblioteca

60
Estudar
Estudar e dominar os principais conceitos de Orientao a Objetos,
principalmente relacionado a Herana, classes, composio e mdulos em
Ruby
Estudar Polimorfismo em linguagens como Java e comparar com o
polimorfismo em Ruby

61
Contato

https://gitlab.com/arthurmde https://github.com/arthurmde

http://bit.ly/2jvND12 http://bit.ly/2j0IIo9

Centro de Competncia em Software Livre - CCSL

esposte@ime.usp.br 62
Obrigado!

63

Вам также может понравиться