Docsity
Docsity

Prepare-se para as provas
Prepare-se para as provas

Estude fácil! Tem muito documento disponível na Docsity


Ganhe pontos para baixar
Ganhe pontos para baixar

Ganhe pontos ajudando outros esrudantes ou compre um plano Premium


Guias e Dicas
Guias e Dicas


Orientação a Objeto com Ruby, Notas de estudo de Informática

Algumas teorias e exemplos de como utilizar o Ruby pra Orientação Objeto

Tipologia: Notas de estudo

2013

Compartilhado em 05/04/2013

lyncon-lima-1
lyncon-lima-1 🇧🇷

4.8

(12)

10 documentos

1 / 13

Toggle sidebar

Esta página não é visível na pré-visualização

Não perca as partes importantes!

bg1
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
pf3
pf4
pf5
pf8
pf9
pfa
pfd

Pré-visualização parcial do texto

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.