Definitivamente, escrever software é uma arte!
E a preocupação com a qualidade dessa arte que criamos deveria ser uma constante em nós desenvolvedores!

Deveria….

Ao reler um antigo post do “Shoes”, baseado numa (ainda mais antiga) entrevista com Eric Evans na InfoQ, não pude deixar de lembrar de um post do Ronaldo de uns tempos atrás, no qual ele mencionava sua preocupação com relação a qualidade dos códigos atualmente _escritos_ no melhor estilo Rails Way.

Embora o Ronaldo tenha destacado o aspecto da mistura de lógica com a apresentação, comecei a refletir sobre a quantidade de má-representações de domínios de negócio que devem estar espalhadas por aí em aplicações Rails da atualidade. E confesso que isso também me preocupa!

Faz algum tempo que acompanho a lista Rails-BR, mesmo sem postar quase nada por lá. (Inclusive, lá não é o único lugar que tenho deixado de postar alguma coisa. Mas, sabe como é.. A vida de casado é um pouco mais atarefada que muitos imaginam! :-) )

Na grande maioria dos posts que vejo na lista Rails-BR, e na comunidade Rails brasileira como um todo, não vejo muita preocupação com o design da aplicação e uma boa representação dos domínios de negócio. (Será uma característica da adoção em massa de um hyppe?) Ao contrário, nos deparamos muito com a polida beleza de um domínio “doentio“, pobre em representação, com uma raison d’être resumida a mais uma triste estrutura de dados.

Diferentemente do que alguns pensam, uma boa representação de um domínio real de negócios não pode ser automatizada!

Espero que os desenvolvedores se atentem mais para isso, e que não nos deparemos com super-controllers e models anêmicos saltando de nossas telas diretamente para o nosso colo.

Do contrário, se essa tendência se mantiver, ainda veremos muitos códigos “macarrônicos”, ASP-like, escritos em Ruby com Rails. O que é uma grande infelicidade dado o poder da linguagem!

Espero que eu esteja errado nessa minha semi(pre)visão de Dante no domínio Rails. E que, ao contrário dessa possível tendência, possamos ter códigos compreensíveis, projetos com um domínio de negócio bem representado, e filhos plenamente felizes.

 

Entao, conforme jah anunciado pelo Ronaldo, tah marcado pra dia 19/01/2008, (das 10:00 as 13:00hs), a primeira reuniao do Dojo-BH!

Se voce eh programador e, alem de trabalhar, se diverte programando, venha participar da nossa primeira reuniao!

Nos encontramos lah!

Acts as State Machine eh um plugin do Rails que visa facilitar o gerenciamento de estados de um dado model ActiveRecord, implementando assim uma Maquina de Estado Finito. O acts_as_state_machine carrega o conceito de eventos. Que sao blocos de codigo responsaveis pelas transicoes de um estado do Model para o outro. Suponhamos, por exemplo, que voce queira controlar os estados das tarefas que voce irah realizar durante um dia. Com o acts_as_state_machine voce poderia ter algo parecido com o seguinte:

class Tarefa < ActiveRecord::Base
  # Inicialmente a Tarefa estarah no estado 'Pendente'
  acts_as_state_machine :initial => :pendente

  state :pendente
  state :iniciada, :enter => Proc.new {|o| Mailer.send_notice(o)}
  state :concluida
  state :cancelada

  # No evento 'iniciar' eh realizada a transicao do estado 'pendente' para 'iniciada'
  event :iniciar do
    transitions :from => :pendente, :to => :iniciada
  end

  event :concluir do
    transitions :from => :iniciada, :to => :concluida
  end

  event :cancelar do
    transitions :from => :pendente, :to => :cancelada
  end
end

Para cada estado, um metodo “<nomedoestado>?” serah criado, e para cada evento, um metodo “<nomedoevento>!” serah criado:

  t = Tarefa.create # Cria a tarefa com seu estado inicial...
  t.state # => "pendente"
  t.iniciar! # Envia notificacao por email, e muda estado da Tarefa para "iniciada"
  t.iniciada? # => true
  # ...
  t.concluir! # Muda o estado da tarefa para "Concluida"

Como voce pode ver no codigo de exemplo, quando a nossa Tarefa mudar para o estado ‘iniciada’, (em consequencia da chamada ao metodo do evento ‘iniciar’), serah enviada uma notificacao por email. Isso eh feito por meio daquela Proc que foi passada como uma funcao de callback do estado :iniciada. Nos mostrando que temos a flexibilidade de fazer qualquer coisa na mudanca de um estado para o outro. Alih, no lugar de um bloco de codigo, pode ser passado um simbolo, com o nome de um metodo de instancia do model.

Instalacao

Para quem jah instalou um plugin Rails, instalar o acts_as_state_machine nao tem segredo algum! Na raiz da tua aplicacao Rails, digite:

  ./script/plugin install http://elitists.textdriven.com/svn/plugins/acts_as_state_machine/trunk/

Daih em diante eh soh usar! :-)

“Hello Io!” println

Dezembro 10, 2007

Bem, pra quem nao conhece, Io eh uma linguagem de programacao dinamica, Orientada a Objetos, e baseada em Prototipos.

No Io, com o mesmo programa que voce executa os arquivos fonte .io, voce pode, por exemplo, executar um interpretador interativo, similar ao nosso amado irb no Ruby.

Instalacao

A instalacao no windows eh bem simples!
Na pagina de downloads do site oficial voce poderah encontrar o link da versao para Windows. Eh um arquivo zip! Baixe-o, descompacte-o no C:\, e edite a variavel de ambiente Path, incluindo o diretorio “C:\usr\local\bin”. Pelo que parece, ha uma limitacao nessa distribuicao que fixa esses diretorios, por causa dos add-ons, que ficam localizados no “\usr\local\lib\io\addons”.
Limitacao tosca essa, mas por enquanto nao vou me preocupar com isso!

Mao na massa!

Entao vamos lah! Vamos ao nosso “Hello Io!”. Digite “io” no terminal, e comece a brincar:

Io> "Hello Io!" println
Hello Io!
==> Hello Io!

(Veja mais alguns exemplos de codigo no breve tutorial do site oficial, ou no guia oficial da linguagem.)

Caracteristicas da Linguagem

Primeiramente, nao tente encontrar classes no Io! Para criar novos objetos voce deve clonar objetos jah existentes:

Io> MeuObjeto := Object clone
==> MeuObjeto_0x485a18:
type = "MeuObjeto"

Io traz consigo o conceito de slots, que compoem um dado objeto. Slots podem ser interpretadas como as mensagens as quais um objeto sabe responder. Podemos considerar um slot como um relacionamento ‘nome => valor’.

Os atributos e metodos de um objeto sao considerados slots, independente de seu valor ser codigo executavel ou outro tipo de objeto.
Voce pode remove-los ou adicionar novos atributos/metodos quando quiser:

Io> MeuObjeto meuMetodo := method( "Meu novo metodo!" println)
==> method(
"Meu novo metodo!" println
)
Io> MeuObjeto meuMetodo
Meu novo metodo!
==> Meu novo metodo!

Tudo em Io eh um objeto! Veja o seguinte codigo, por exemplo:

Io> 1 asString
==> 1
Io> 100 asCharacter
==> d

A comunicacao dos objetos Io com o resto do mundo eh feita por meio do envio/recebimento de mensagens. Considere por exemplo, o seguinte codigo:

System version

No exemplo acima, a mensagem “version” eh enviada para o objeto “System”, para que esse possa responde-la.

Se eu tentar executar esse codigo acima no “io” terei o seguinte resultado:

Io> System version
==> 20070410

Bem, eh isso! A ideia deste post era soh falar alguma coisa sobre Io. Posteriormente vou escrever sobre algumas features e aspectos um pouco mais interessantes da linguagem. Espero que possa ser util pra alguem! :-)

Ateh a proxima!

O nosso primeiro Minas on Rails passou, mas muitas coisas boas ficaram!
Primeiro a lembranca do que rolou por aquelas bandas…Segundo aquele gostinho de “Quero mais!”…
Outra coisa boa que ficou foi a vontade insana de contribuir mais e aumentar minha participacao na comunidade…Espero que essa vontade continue e que esse blog ajude a satisfaze-la!