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)
[code] 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[/code]
É 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.
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
[code]sometimes :with_probability => ‘10%’ do
meu codigo
end[/code]
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?
[code]if Kernel.rand() < 0.50 then
meu codigo
end[/code]
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
[code]maybe do
codigo
end[/code]
É 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/
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.
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: