Coding Dojo #17 Dictionary Replacer

Bem amigos do Coding Dojo, hoje o encontro foi especialmente legal!! Primeiro porque voltamos a programar em Ruby (que foi a linguagem escolhida pela equipe para o protótipo do novo Portal), e depois porque tivemos nosso primeiro contato com as práticas de BDD (Behavior Driven Development), usando Cucumber e RSpec.

No início foi meio estranho por não estarmos acostumados ainda a essa cultura de testes, mas depois fomos pegando o jeitinho.

O desafio foi interessante também pelo fato de não precisarmos nos prender tanto na resolução do problema em si, fazendo assim com que nós focassemos mais nos testes.

E para fechar com chave de ouro, o lanche na restrospectiva foi “mara”: com bolacha calipso e trakinas, e claro o ótimo cafézinho do @marcomoura! ;D

Origem do kata: http://codingdojo.org/cgi-bin/wiki.pl?KataDictionaryReplacer

Código Fonte: https://gist.github.com/723424

dicionario.feature

# language: pt
# features/dicionario.feature

# @author Marco Moura
# @author Luciana Mendes
# @author Rafael Salomao
# @author Patricia Carvalho

# @author Carlos Eduardo 

Funcionalidade: Dicionary Replace
Kata para substituir string em um texto

Cenário: Entrada vazia
Dado que entrei ""
E entrei um dicionario ""
Então o software me retorna ""

Cenário: Texto 2 temporary
Dado que entrei "$temp$"
E entrei um dicionario ["temp", "temporary"]
Então o software me retorna "temporary"

Cenário: Com um parametro apenas diferente de temporario
Dado que entrei "$temp$"
E entrei um dicionario ["temp","hello world"]
Então o software me retorna "hello world"

Cenário: Texto 3.John Doe
Dado que entrei "$temp$ here comes the name $name$"
E entrei dois dicionario [["temp","temporary"],["name","John Doe"]]
Então o software me retorna "temporary here comes the name John Doe"

dicionario.rb

# lib/dicionario.rb

# @author Marco Moura
# @author Luciana Mendes
# @author Rafael Salomao
# @author Patricia Carvalho

# @author Carlos Eduardo 

class Dicionario
@text
def set_text(t)
@text = t
end

@dict
def set_dict(dict)
@dict = dict
end

def replace()

if @dict == [""]
""
else
@text.sub(/\$temp\$/, @dict.first['temp'])
end

end
end

dicionario_steps.rb

# encoding: utf-8
# features/steps_definitions/dicionario_steps.rb

# @author Marco Moura
# @author Luciana Mendes
# @author Rafael Salomao
# @author Patricia Carvalho

# @author Carlos Eduardo 

Before do
  @dic = Dicionario.new
end

Dado /^que entrei "([^"]*)"$/ do |text|
  @dic.set_text(text)
end

Dado /^entrei um dicionario \["([^"]*)", "([^"]*)"\]$/ do |text, dict|
  @dic.set_dict([text,dict])
end

Dado /^entrei um dicionario "([^"]*)"$/ do |dict|
  @dic.set_dict(dict)
end

Dado /^entrei dois dicionario \[\["([^"]*)","([^"]*)"\],\["([^"]*)","([^"]*)"\]\]$/ do |arg1, arg2, arg3, arg4|
  temp = [arg1 = arg2, arg3 = arg4]
  @dic.set_dict(temp)
end

Então /^o software me retorna "([^"]*)"$/ do |new_text|
  replace = @dic.replace()
  replace.should == new_text
end

env.rb

# encoding: utf-8
# features/support/env.rb

begin require 'rspec/expectations'; rescue LoadError; require 'spec/expectations'; end
require 'cucumber/formatter/unicode'
$:.unshift(File.dirname(__FILE__) + '/../../lib')
require 'dicionario'

Retrospectiva

O que foi bom e devemos repetir nos próximos

* lanche e café
* conhecer algo novo (cucumber, BDD)
* realmente iniciamos o desenvolvimento pelo teste
* o desafio foi bom
* os curadores
* o output do cucumber é legal
* ter referência na máquina foi legal
* não acessar a internet
* usar o terminal =D
* mudar de editor
* foi divertido
* a busca pela solução do desafio foi legal
* foi bem babysteps

Nos próximos poderia ser melhor

* melhor conhecimento de Ruby
* melhor conhecimento de Cucumber
* melhor conhecimento de RSpec (steps)
* travar menos no inicio do desenvolvimento
* melhorar a dinâmica da dupla (ping pong)
* Refatorar antes de implementar uma coisa nova

Fotos do encontro