Ágil na prática - ruby
TRANSCRIPT
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'