Baixe Orientação a Objeto com Ruby e outras Notas de estudo em PDF para Informática, somente na Docsity!
Instituto Federal de Educac¸˜ao, Ciˆencia e
Tecnologia de Mato Grosso
Curso: Superior de Tecnologia
em Sistemas para Internet
LYNCON VIEIRA LIMA
YURI MIRANDA
Introduc¸˜ao a Programac¸˜ao
Orientada a Objetos na
Linguagem Ruby
ABRIL – 2013
CUIAB A – MT´
Programa¸c˜ao Orientada a Objetos na Linguagem Ruby Lyncon Lima Yuri Miranda 1 Introdu¸c˜ao
A linguagem de programa¸c˜ao Ruby, ´e uma linguagem de tipagem forte, que
tem como foco a simplicidade e produtividade, onde todo dado ´e um ob-
jeto. Muitas linguagens n˜ao tratam n´umeros e outros tipos primitivos como
objetos, mas no Ruby isso ´e diferente. No Ruby, tudo ´e objeto. Tipos prim-
itivos possuem m´etodos e podem ter atributos. Classes s˜ao objetos. Uma
linguagem totalmente orientada a objeto.
2 Arquitetura da Linguagem 2.1 Estrutura geral
- Ruby ´e uma linguagem interpretada. Sendo assim, n˜ao ´e necess´ario
recompilar os programas para execut´a-los novamente, basta execut´a-
lo atrav´es do interpretador. Isto pode ser bom do ponto de vista da
facilidade do programador na hora da implementa¸c˜ao e fase de testes,
mas diminui a performance de um programa complexo, devido `a inter-
preta¸c˜ao do c´odigo fonte cada vez que alguma instru¸c˜ao ´e chamada.
- Como o Ruby ´e uma linguagem orientada `a objetos pura, seu criador
decidiu trabalhar somente com objetos, ou seja, tudo na linguagem ´e
tratado como objetos. Inteiros, strings, estruturas de decis˜ao, blocos de
controle, loops, tudo ´e feito atrav´es de mensagens entre objetos, assim
como na linguagem Smalltalk.
classe, gera uma nova instˆancia. A vari´avel pochi tem todas as propriedades
definidas na classe Dog: por isso, consegue ladrar (bark).
1 ruby> p o c h i. bark 2 Bow Wow 3 n i l 4 Heran¸ca
Na maior parte das vezes, a classifica¸c˜ao de objectos ´e feita hierarquicamente.
Por exemplo, o ’gato’ ´e um ’mam´ıfero’ e o ’mam´ıfero’ ´e um ’animal’. Algumas
caracter´ısticas na classifica¸c˜ao de um objecto s˜ao propriedades herdadas de
classifica¸c˜oes b´asicas (ou antecessoras). Por exemplo, um ’animal’ respira e,
por isso, o ’gato’ respira.
Esta heran¸ca de propriedades da classifica¸c˜ao ao longo da ´arvore da hier-
arquia ´e implementada em Ruby da forma que se mostra de seguida.
Define-se a classe Animal
1 ruby> c l a s s Animal 2 ruby | def r e s p i r a r 3 ruby | p r i n t "inala ... e expira ...\n" 4 ruby | end 5 ruby | end 6 n i l
E a classe Gato
1 ruby> c l a s s Gato<Animal 2 ruby | def miar 3 ruby | p r i n t "miau\n" 4 ruby | end 5 ruby | end 6 n i l
A classe Gato n˜ao possui qualquer defini¸c˜ao sobre como respirar, mas
vai herd´a-la da classe Animal. Neste exemplo, foi apenas adicionada a pro-
priedade miar `a classe Gato.
1 ruby> t a r e c o = Gato. new 2 #<Cat : 0 xbd80e8> 3 ruby> t a r e c o. r e s p i r a r 4 i n a l a... e e x p i r a... 5 n i l 6 ruby> t a r e c o. miar 7 miau 8 n i l
Como se pode ver, ’tareco’, o ’Gato’, consegue ’respirar’ perfeitamente.
Por´em, as propriedades da classe b´asica (denominada ”classe progenitora”
ou ”superclasse”) n˜ao s˜ao sempre herdadas pelas classes que dela derivam
(”classes descendentes” ou ”sub-classes”). Por exemplo, a ’ave’ voa enquanto
que o ’pinguim’ n˜ao voa. Por outras palavras, os pinguins tˆem a maioria
das outras propriedades das aves (’p˜oem ovos’, etc...) excepto voar. Neste
exemplo, esta propriedade ter´a de ser redefinida na classe dos pinguins.
Vamos transcrever estas ideias para Ruby:
1 ruby> c l a s s Ave 2 ruby | def poe ovo 3 ruby | # f a z q u a l q u e r c o i s a... 4 ruby | end 5 ruby | def voar 6 ruby | #... 7 ruby | end 8 ruby | #... 9 ruby | end 10 n i l 1 ruby> c l a s s Pinguim<Ave 2 ruby | def voar 3 ruby | f a i l 4 ruby | end 5 ruby | end 6 n i l
E assim se definiu a classe Pinguim.
Quando se utiliza heran¸ca para definir as propriedades que a sub-classe tem
em comum com a superclasse, apenas ´e necess´ario adicionar ou redefinir as
diferen¸cas. Algu´em chamou a este estilo programa¸c˜ao diferencial. E um dos´
m´eritos da OOP.
1 ruby> $ f o o 2 n i l 3 ruby> $ f o o = 5 4 5 5 ruby> $ f o o 6 5
Pode-se invocar e modificar livremente as vari´aveis globais. Isto significa
que o abuso da sua utiliza¸c˜ao ´e potencialmente perigoso, porque uma sua
altera¸c˜ao propaga-se por todo o programa. Assim, as vari´aveis globais devem
ser utilizadas parcamente, e s´o em caso de extrema necessidade. Quando
usada, a vari´avel global dever´a ter uma denomina¸c˜ao forte, para n˜ao coincidir
com outra vari´avel global definida posteriormente.
5.2 Vari´aveis de Instˆancia
As vari´aveis de instˆancia tˆem um caracteriza¸c˜ao especial: coloca-se ’@’ no
in´ıcio do seu nome. As vari´aveis de instˆancia s˜ao ´unicas para o objecto
referido por self. Objectos diferentes, mesmo pertencentes a uma mesma
classe, tˆem valores diferentes para as respectivas vari´aveis de instˆancia.
Em Ruby, as vari´aveis de instˆancia n˜ao podem ser lidas ou alteradas por
objectos exteriores, s´o o podendo ser atrav´es de m´etodos da classe. Uma
vari´avel de instˆancia n˜ao inicializada tem o valor nil.
As vari´aveis de instˆancia n˜ao precisam de ser declaradas. Isto implica
uma estrutura flex´ıvel de objectos. Na realidade, as vari´aveis de instˆancia
em Ruby s˜ao criadas dinamicamente. Veja-se este exemplo:
1 ruby> c l a s s I n s t T e s t 2 ruby | def s e t f o o ( n ) 3 ruby | @foo = n 4 ruby | end 5 ruby | def s e t b a r ( n ) 6 ruby | @bar = n 7 ruby | end 8 ruby | end 9 n i l 10 ruby> i = I n s t T e s t. new 11 #<I n s t T e s t : 0 x83678> 12 ruby> i. s e t f o o ( 2 ) 13 2 14 ruby> i 15 #<I n s t T e s t : @foo=2>
16 ruby> i. s e t b a r ( 4 ) 17 4 18 ruby> i 19 #<I n s t T e s t : @foo =2, @bar=4> 5.3 Vari´aveis Locais
As vari´aveis locais s˜ao definidas por um nome (ou identificador) come¸cado
por uma letra min´uscula. Veja-se o seguinte exemplo:
1 ruby> @foo 2 n i l 3 ruby> $ f o o 4 n i l 5 ruby> f o o 6 ERR: u n d e f i n e d l o c a l v a r i a b l e or method ’foo ’ for main ( Object )
Em Ruby, as vari´aveis locais necessitam de ser inicializadas por atribui¸c˜ao,
o que as torna diferentes das outras vari´aveis, porque a primeira atribui¸c˜ao
funciona simultaneamente como declara¸c˜ao. Quando se refere uma vari´avel
n˜ao declarada, o Ruby considera que se est´a invocando um m´etodo sem quais-
quer argumentos. Assim, recebe-se a mensagem de erro ’...undefined local
variable or method...’.
Mas n˜ao ´e necess´ario efectuar a atribui¸c˜ao `as vari´aveis locais na defini¸c˜ao
de m´etodos porque, neste caso, considera-se que as suas vari´aveis internas
n˜ao tˆem valor atribu´ıdo.
O ˆambito da declara¸c˜ao das vari´aveis locais ´e:
1 proc {.... } 2 l o o p {.... } 3 c l a s s.... end 4 module.... end 5 def.... end
em todo o programa (as excep¸c˜oes s˜ao os casos anteriores)
6 Objeto
E a representa¸^ ´ c˜ao l´ogica de uma entidade (f´ısica, conceitual ou de software)
com limites bem definidos e um significado para aplica¸c˜ao. S˜ao implemen-
tados com Tipos Abstratos de Dados, onde o ´unico meio de acess´a-los ou
10 c3 = Carro. new ( ’preto ’ ) 11 12 # v e r i f i c a n d o os o b j e t o s 13 Carros c = ObjectSpace. e a c h o b j e c t ( Carro ) { | o | p o} 14 puts ’#{c} carros encontrados ’ 15 16 # i n v a l i d a n d o um dos o b j e t o s 17 c2 = n i l 18 19 # chamando o g a r b a g e c o l l e c t o r 20 GC. s t a r t 21 22 # v e r i f i c a n d o de novo 23 c = ObjectSpace. e a c h o b j e c t ( Carro ) { | o | p o} 24 puts "#{c} carros encontrados "
Resultado:
1 #<Carro : 0 xb7e4d688 @cor=”p r e t o ”> 2 #<Carro : 0 xb7e4d6b0 @cor=”vermelho”> 3 #<Carro : 0 xb7e4d6d8 @cor=” a z u l ”> 3 c a r r o s e n c o n t r a d o s 4 #<Carro : 0 xb7e4d688 @cor=”p r e t o ”> 5 #<Carro : 0 xb7e4d6d8 @cor=” a z u l ”> 6 2 c a r r o s e n c o n t r a d o s 8 Exce¸c˜oes 8.1 Begin ... rescue ... ensure ... end
Ruby, assim como Python, Java e PHP5, tem controle de exce¸c˜oes:
1 [ taq@ ˜/ code / ruby ] i r b 2 i r b ( main ) :001:0 > i 1 = 1 3 => 1 4 i r b ( main ) :002:0 > i 2 = "dois" 5 => "dois" 6 i r b ( main ) :003:0 > expr = 7 i r b ( main ) : 0 0 4 : 0 ∗ begin 8 i r b ( main ) : 0 0 5 : 1 ∗ i 1+i 2 9 i r b ( main ) :006:1 > rescue S t a n d a r d E r ro r => exc 10 i r b ( main ) :007:1 > puts "Erro: #{ exc}" 11 i r b ( main ) :008:1 > − 1 12 i r b ( main ) :009:1 > end 13 Erro : S t r i n g cant be c o e r c e d i n t o Fixnum
15 i r b ( main ) :010:0 > expr 16 => − 1 17 i r b ( main ) :011:0 >
Nesse caso o bloco begin...end ´e combinado com rescue, que ´e invocado
caso alguma coisa de errado aconte¸ca ali.
Reparem que depois de rescue eu informei o tipo de exce¸c˜ao que quero tratar.
Usei a classe StandardError, mas tem v´arias outras mais especializadas (Syn-
taxError,NameError por exemplo) , e logo depois informei uma vari´avel para
ser armazenada a exce¸c˜ao gerada.
Reparem que tentei somar um Fixnum e uma String, deliberadamente, e foi
gerada a exce¸c˜ao. Tamb´em podemos omitir o tipo de exce¸c˜ao ali, que vai dar
na mesma. Vou aproveitar e ver o tipo de exce¸c˜ao que foi gerada:
1 [ taq@ ˜/ code / ruby ] i r b 2 i r b ( main ) :001:0 > i 1 = 1 3 => 1 4 i r b ( main ) :002:0 > i 2 = "dois" 5 => "dois" 6 i r b ( main ) :003:0 > expr = 7 i r b ( main ) : 0 0 4 : 0 ∗ begin 8 i r b ( main ) : 0 0 5 : 1 ∗ i 1+i 2 9 i r b ( main ) :006:1 > rescue => exc 10 i r b ( main ) :007:1 > puts "Erro :#{ exc} Tipo :#{ exc.class}" 11 i r b ( main ) :008:1 > − 1 12 i r b ( main ) :009:1 > end 13 Erro : S t r i n g cant be c o e r c e d i n t o Fixnum Tipo : TypeError 14 => − 1 15 i r b ( main ) :010:0 > expr 16 => − 1 17 i r b ( main ) :011:0 > 8.2 Throw...catch
Throw e catch podem ser bem ´uteis quando quisermos sair de c´odigos ’anin-
hados’, por exemplo:
1 2 [ taq@ ˜/ code / ruby ] i r b 3 i r b ( main ) :001:0 > def le comando 4 i r b ( main ) :002:1 > p r i n t "Digite algo:"
9 Referˆencias Bibliogr´aficas
- Augusto, J. Guia do Utilizador Ruby. Dispon´ıvel em:
http://calypso.inesc-id.pt/jasa/scripts/uguide/uguide00.html
- Rangel, E. Tutorial Ruby
- Cruz de Souza, T. Conhecendo a Linguagem Ruby. Dispon´ıvel em:
http://www.devmedia.com.br/conhecendo-a-linguagem-ruby/8226.
- Silva, O. Arquivos de C´odigos. Dispon´ıvel em:
http://www.arquivodecodigos.net/dicas/ruby-programacao-orientada-a-
objetos
- Vieira, N. Conhecendo Ruby. 1◦^ vers˜ao, 2012.
- Oliveira, F. Pequeno Livro de Ruby. 1◦^ vers˜ao, June 2006.