Академический Документы
Профессиональный Документы
Культура Документы
Ruby
Arthur de Moura Del Esposte - esposte@ime.usp.br
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
9
Polimorfismo - Exemplo em Java
empregado.vencimento(); 10
Polimorfismo - Exemplo em Java
Classe Abstrata
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
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
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
59
Resolver os seguintes desafios
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
esposte@ime.usp.br 62
Obrigado!
63