DSL em Ruby

3 respostas
peczenyj

Senhores,

Criei uma pequena DSL em Ruby para lidar com eventos que acontecem com determinada frequencia.

Coloquei no github e é possivel instalar via gem (frequency-dsl)

http://github.com/peczenyj/Frequency

require 'rubygems'
        require 'frequency'

        include Frequency

        sometimes do
          puts "sometimes you can see this times, sometimes not"
        end

        never do
          puts "this line never will be print"
        end

        rarely :with_probability => 0.01 do
          puts "ok, its very rare... 1% of chance"
        end

        normally :with_probability => '24%' do
          puts "you can use strings instead float numbers"
        end

        always do
          puts "bye"
        end

É bem simples, always e never são bem claros até certo ponto mas quero documentar melhor.

sometimes, normally e rarely executam o bloco de codigo passado com 50%, 75% e 25% de chance (valores que podem ser alterados)

Imagino que um dos usos pode ser uma aplicação que em dada configuração pode fazer sempre, nunca ou com determinada probabilidade.

Fiz para exercitar a criação de gems e para brincar mesmo, ficou bacana e legivel.

Sugestões?

3 Respostas

mateusbrum

Para que serve ? :oops:

peczenyj

Boa pergunta.

Imagina que vc quer fazer algo com uma dada porcentagem de chance, tipo 10%

Onde vc gostaria de fazer isso... imagine que vc quer testar uma nova funcionalidade mas vc não quer que todo mundo seja beta-tester, apenas 10% da galera (que é um numero arbitrario). Baseado no feedback desses 10% vc pode decidir por habilitar isso pra todo mundo ou não.

Seria algo como

sometimes :with_probability => '10%' do
  # meu codigo
end

Pensei em usar de forma que vc leia de um arquivo de configuração se determinadas funcionalidades devem ser sempre (always), nunca (never) ou raramente (rarely).

Normalmente a gente faz o que quando precisa fazer isso?

if Kernel.rand() < 0.50 then
  # meu codigo
end
Porem este código não é semantico o suficiente se vc não tiver uma base adequada de matematica (e saber como o Kernel.rand() funciona, o que retorna, et). Isto
maybe do  
  # codigo
end

É um pouco mais legivel. O objetivo das DSLs é diminuir o ruido no código de forma que vc leia e seja mais proximo de uma linguagem natural -- o rails, o rspec e outros frameworks como o Sinatra abusam de DSLs.

Eu acho que o fabiokung uma vez mostrou uma DSL em Ruby para vc gerar html, semelhante a mostrada aqui:
/manifestonaweb.wordpress.com/2009/05/26/o-estado-da-arte-da-dsl-em-ruby/

dlt

Ideia legal peczenyj!

Clonei seu repositório e coloquei em um gist uma outra versão da sua DSL, com algumas sugestões. Os specs ainda estão passando. :wink:

Uma dica para deixar o output do seus specs mais legíveis é colocar um arquivo spec.opts dentro do diretório spec com opcoes para o formato do output. Eu gosto de deixar o meu assim:

--color
--format specdoc
Criado 19 de maio de 2010
Ultima resposta 7 de jun. de 2010
Respostas 3
Participantes 3