Purismo
Qual é o limite entre a utilização dos recursos que lhe estão disponíveis, seguir paradigmas, conceitos e idéias e o purismo puro e simples? É possível traçar uma linha imaginária clara entre um e outro?
Eu acredito que não.
Não que eu queira — ou me julgue adequado — para definir tal fronteira, mas levando em consideração que até modelo de maturidade já foi proposto para Rails, essa pergunta tem transitado na minha cabeça e buzinou mais alto hoje.
Percorrendo pelo código de uma das nossas aplicações, encontrei uma migration para adicionar um índice a uma tabela. Removendo nomes de tabela e coluna, ela é exatamente assim:
def self.up
execute "ALTER TABLE `tabela` ADD UNIQUE `nome_indice` (`coluna`)"
end
def self.down
execute "ALTER TABLE `tabela` DROP INDEX `nome_indice`"
end
Funciona, sem sombra de dúvidas. E é legível. Não se trata de um código macarrônico e sequer diria que se trata de um exemplo de ASP em Rails.
Por outro lado, a mesma migration poderia ser escrita assim:
def self.up
add_index :tabela, :coluna, :unique => true, :name => 'nome_indice'
end
def self.down
remove_index :tabela, :name => :nome_indice
end
Igualmente legível e funcional. Usa as facilidades do ActiveRecord, ao invés de simplesmente executar um fragmento SQL. Na prática, o efeito é absolutamente o mesmo.
Para efeitos de discussão sobre pragmatismo e purismo, o exemplo é muito ruim. Propositalmente muito ruim. É ruim porque é, claramente, um border case.
É — ou deveria ser — absolutamente óbvio ululante que utilizar um framework MVC, com um ótimo ORM embutido e ainda assim não ter um único modelo, usar apenas find_by_sql direto nos controllers e ter lógica nas views é um caso claro de escrever ASP em Rails.
Assim como infligir custos enormes a uma aplicação só para se manter “semanticamente correto” ou 100% fiel a qualquer definição acadêmica ou paradigma estabelecido.
Mas, e se sairmos dos extremos? Pior, e se nós nos aproximassemos perigosamente do ponto de encontro entre ambas as linhas de raciocínio?
Seria leviano da minha parte simplesmente rotular o primeiro como macarrônico e o segundo como a pureza da forma e do conteúdo.
Se fizermos o exercício mental de sair do universo Rails e pensar em desenvolvimento de software, a vasta maioria conhece mais SQL do que Rails, então poderíamos dizer que a primeira forma é até mais legível, até o execute me parece estupidamente óbvio naquele contexto.
A segunda, por sua vez, é elegante e clara, principalmente para um rubista. Mesmo alguém iniciante só precisaria de uma rápida olhadela na documentação seria suficiente para decifrar o add_index e o remove_index.
Subjetivamente, pode ser bem mais fácil escolher, mas critérios objetivos, nenhuma é melhor.
O exemplo é ruim até para isso, definir um critério objetivo claro, mensurável, para chegar a uma única e final solução de qual o caminho correto (strictu sensu) a seguir.
Ao meditar um pouco no assunto e sobre exemplo, decidi aceitar que sempre haverá uma zona neutra nessa discussão. Sempre haverão casos-limite onde nenhum argumento estabelecido será suficientemente forte.
Sempre que cair em um caso desses, pretendo deixar minha opinião a cargo do bom senso.