Ágil na Prática - Ruby

Embed Size (px)

Citation preview

GIL na PRTICA

Igo Coelho www.igocoelho.com.br

Ruby

Criado em 1993 por Yukihiro Matsumoto, aka (Matz)

Comunidade muito ativa

Baseada em Smalltalk, Lisp, Phyton, Perl, Eiffel, Ada

Genrica, interpretada, reexiva , com garbage collection

Optimizada para os programadores e no para os compiladores.

Tudo so objectos. No existem tipos primitivos

Tipagem Dinamica Forte

Muito produtiva: Menos linhas de cdigo

Igo Coelho www.igocoelho.com.br

Instalao

Pr-instalado no MAC

Em Windows instalador next, next, next

apt-get install ruby

Igo Coelho www.igocoelho.com.br

IRB

Console interativo do Ruby

Basta digitar irb no console

Igo Coelho www.igocoelho.com.br

Tudo um objeto

2 + 2 equivalente a 2+(2) e 2.send(:+, 2)

2.class # => Fixnum

2.class.methods - Object.methods

gil na prtica.capitalize

Igo Coelho www.igocoelho.com.br

Aritmtica e Converses

2.class == Fixnum

Fixnum.superclass == Integer

Integer.superclass == Numeric

3.0.class == Float

Float.superclass == Numeric

2/3 == 0 ; 2/3.0 # => 0.6666667 ; 2 + 3.0 == 5.0 ;

2.to_i + 3.0.to_f == 5.0

10000000000.class == Bignum ; Bignum.superclass

== Integer

2 + 3 # => TypeError: String cant be coerced into

Igo Coelho www.igocoelho.com.br

Atribuies

>> valor = 1=> 1>> valor += 1=> 2>> valor -= 1=> 1

Igo Coelho www.igocoelho.com.br

Atribuies

>> a = 2=> 2>> b = 3=> 3>> a, b = b, a=> [3, 2]>> puts a3=> nil>> puts b2=> nil

Igo Coelho www.igocoelho.com.br

Strings

So mutveis, diferente do Java...>> texto = valor inicial=> valor inicial>> texto valor inicial alterado>> puts(texto)valor inicial alterado=> nil

Igo Coelho www.igocoelho.com.br

Cadeias

>> nome = Igo Coelho=> Igo Coelho>> Ol, #{nome}=> Ol, Igo Coelho>> Ol, #{nome.upcase}

Igo Coelho www.igocoelho.com.br

Symbols

Os Symbols comenam com :

:action.class == Symbol :action.to_s == action :action == action.to_sym Existe apenas uma instancia de cada simbolo

:action.equal?(:action) # => true action.equal?(action) # => false tipicamente so utilizados como chaves nas tabelas de Hash

link_to Home, :controller => home

Igo Coelho www.igocoelho.com.br

Expresses Booleanas

Todos os objectos devolvem verdade excepto false e nil

false e true so as nicas instancias da FalseClass and TrueClass

Igo Coelho www.igocoelho.com.br

Expresses Booleanas

>> abc = nil=> nil>> if (abc)>> puts (No imprime)>> end=> nil

Igo Coelho www.igocoelho.com.br

Expresses Booleanas

>> if (3 == 3)>> puts (Agora imprime)>> endAgora imprime=> nil

Igo Coelho www.igocoelho.com.br

Expresses Booleanas

>> if (3)>> puts (Imprime novamente)>> endImprime novamente=> nil

Igo Coelho www.igocoelho.com.br

Denir uma classe e instanciar um objecto

class Consultor def initialize(nome) # As vriaveis de instancia comeam com @ @nome = nome end def diz_ola # Mtodo de instancia puts "#{@nome} diz ol end end

igo = Consultor.new(Igo) igo.diz_ola

Igo Coelho www.igocoelho.com.br

Herana de Classes

# Programador um Consultor e extende com carct. adicionais class Programador < Consultor def initialize(nome, ide_favorito) super(nome) @ide_favorito = ide_favorito end # redenimos o mtodo diz_ola no Consultor def diz_ola super puts "O IDE favorito #{@ide_favorito} end end hugo = Programador.new(Hugo, TextMate) hugo.diz_ola

Igo Coelho www.igocoelho.com.br

Tipagem

class PatoNormal def faz_quack Quack! end end

class PatoEstranho def faz_quack Queck! end end

Igo Coelho www.igocoelho.com.br

Tipagem

class CriadorDePatos def castiga(pato) pato.faz_quack end end

pato1 = PatoNormal.newpato2 = PatoEstranho.newc = CriadorDePatos.newputs c.castiga(pato1)puts c.castiga(pato2)

Igo Coelho www.igocoelho.com.br

Mtodos Getter e Setter

class Consultor def initialize(nome) self.nome = nome end def nome @nome end def nome=(nome) @nome = nome end end

consultor = Consultor.new("Pedro") puts consultor.nome consultor.nome = "David"

Igo Coelho www.igocoelho.com.br

Getter e Setter... attr_accessor

class Consultor attr_accessor :nome def initialize(nome) self.nome = nome end end

consultor = Consultor.new("Paulo") puts consultor.nome consultor.nome = "David" puts consultor.nome

Igo Coelho www.igocoelho.com.br

Comparao

A comparao entre objetos feita atravs do mtodo == reescreva e diga como os objetos devem ser comparados

class Aluno def ==(outro) self.cpf == outro.cpf end end

Igo Coelho www.igocoelho.com.br

Mtodos

Quando se invoca um mtodo os parntesis nos argumentos so opcionais

Os mtodos so identicados pelos seus nomes apenas, no existe overloading com assinaturas de argumentos

Existem mtodos de classe e mtodos de instncia

Os mtodos podem ser pblicos, protegidos ou privados.

A ltima expresso que avaliada num mtodo o valor de retorno.

Os argumentos podem ter valores por defeito ex: def meu_metodo(a, b = senior)

Igo Coelho www.igocoelho.com.br

Metaprogramao

class Aluno # no sabe nadaEnd

class Professor def ensina(aluno) def aluno.escreve Sei escrever end endend

Igo Coelho www.igocoelho.com.br

Metaprogramao

juca = Aluno.new juca.respond_to? :escreve=> false

professor = Professor.newprofessor.ensina jucajuca.escreve=> Sei escrever

Igo Coelho www.igocoelho.com.br

Array

lista = Array.newlista string

Igo Coelho www.igocoelho.com.br

Hash

mapa = Hash.newmapa[:item1] = lalamapa['item2'] = lelemapa[p] = lulu

Por serem nicos e imutveis, smbolos so as melhores opes para chaves em Hashes

Igo Coelho www.igocoelho.com.br

Hash

Uma tcnica de programao muito conhecida o uso de hashes como parmetros nicos em mtodos

def transfere(argumentos) destino = argumentos[:destino] valor = argumentos[:valor]end

transfere({:destino => outra_conta, :valor => 100.0})transfere :destino => outra_conta, :valor => 100.0

Igo Coelho www.igocoelho.com.br

if, unless e o operador ?

if count > 10 message = Try again else message = Enter command end

raise Unauthorized if !current_user.admin?

raise Unauthorized unless current_user.admin?

status = input > 10 ? Number too big : ok

Igo Coelho www.igocoelho.com.br

Iterators: while, until, and for

while count < 100 puts count count += 1 end

for user in @users if user.pago? puts user break end end

until count > 5 puts count count += 1 end

puts(count += 1) until count > 5

Igo Coelho www.igocoelho.com.br

case

case x when 0 puts "Zero" when 1, 2..5 puts "Second branch" when 6..10 puts "Third branch" when x.downcase == peter puts Seventh branch else puts "Eight branch" end

Igo Coelho www.igocoelho.com.br

Testes

A classe deve herdar de Test::Unit::TestCase

necessario um require em 'test/unit'

O mtodo setup prepara os testes

Os asserts so utilizados para as verificaes

Igo Coelho www.igocoelho.com.br

Testes

require 'test/unit'

class CalculadoraTest < Test::Unit::TestCasedef setup@calc = Calculadora.newenddef test_somarassert_equal 4, @calc.somar(2, 2)endend

Igo Coelho www.igocoelho.com.br

Stubs

class Clock def time Time.now endend

class Event def initialize(start_time) @start_time = start_time end def started?(clock = Clock.new) clock.time > @start_time endend

Igo Coelho www.igocoelho.com.br

Stubs

class StubClock def time Time.parse('2007-07-09 19:00') endend

clock = StubClock.newmeeting = Event.new(Time.parse('2007-07-09 18:00'))pub = Event.new(Time.parse('2007-07-09 20:00'))

assert_equal true, meeting.started?(clock)assert_equal false, pub.started?(clock)

* Use require 'time'