quinta-feira, 2 de janeiro de 2014

Primeiras impressões 2 - vindo do php

Dessa vez deve ser curtinho... Continuando a relatar minha experiência com Ruby on Rails, e novamente companando com Php, não para desmerecer a linguagem, mas porque é foi o parâmetro que eu tive para comparar, quem vai de outra linguagem certamente comparará com a que usava anteriormente. Uma diferença muito grande é que no Php toda manipulação de dados primitivo é feita de maneira procedural, ou seja, por funções globais, e não por métodos encapsulados. Eu me senti mais confortável trabalhando com métodos, e principalmente com as convençôes do ruby que indicam se o método é destrutivo (possui !(bang) no final do nome) ou não, ou então pode possuir ? no final, o que significa que o método faz uma checagem e retorna true ou false. Estes caracteres serem aceitos nos nomes de funções já é uma surpresa...Alguma outra linguagem tem isso ? Nunca vi. checando se a array users está em vazia
users = ["Zamba","Bicudo", "Igonium","Zamba"]
users.empty?
# false
Uso de bang: No primeiro exemplo se trata de um método destrutivo, no caso ele remove as duplicidades na array, ele não apenas retornou uma cópia da array sem duplicidades, mas a alterou
users.uniq!
#["Zamba","Bicudo", "Igonium"]
users
#["Zamba","Bicudo", "Igonium"]
Já aqui, re retornada uma cópia da array sem duplicidades, porem o objeto original, continua inalterado
new_users = users.uniq

#["Zamba","Bicudo", "Igonium"]


users

["Zamba","Bicudo", "Igonium", "Zamba"]

Bom,só de você, caro desenvolvedor não ter que catar no documentação para saber se a função é destrutiva ou não, ou então ter as 2 opções a disposição, o que em certas linguagens não se tem, obrigando a fazer como no exemplo 3 já é uma grande mão na roda. Além de tudo os métodos destrutivos são mais rápidos e consomem menos recursos, então é legal ter esta opção. Os métodos de checagem por outro lado deixam o código mais humano, legível até para quem não entende: Exemplo básico, chegando se uma array está vazia o que é mais legível?
users.length == 0
# false
ou
users.empty?
# false
Me parece claro que a segunda opção é mais clara. Agora imagine que existe um método na array chamado "empty!" (ATENÇÃO: este método não existe na array do ruby ! É só um exemplo) Por dedução , o que imagina que ele faz ? Se você disse que ele esvaziou a array, você está certo !
users.empty!
# []
Esse tipo de convenção é muito legal, uma idéia muito simples mas que facilita bastante as coisas. Uma pena que a classe array não tenha este método não acham ? Mas será que dá para alterar isso ? Sim você pode, e sem ter que criar uma outra class de array estendinda: em php teria que ser assim:
class SuperArray extends ArrayObject {
public function is_empty(){
//código aqui
}
}
no Ruby basta redeclarar a classe apenas adicionando o
class Array{
def empty!
//código aqui
end
}
Note que no exemplo em Php, alterei o nome do método desejado para expressar um questionamento "é vazia ?", enquanto que no Ruby foi criada mais um membro de uma famínia de métodos semelhantes, cujo escopo é o mesmo, temos empty? e empty! agora, e poderíamos ter empty também Chamamos isso de classes abertas, uma maneira de estender as funcionalidades sem o uso de heranças. Deixando claro aqui que isso é uma possibilidade, não uma regra. Neste caso específico eu acho que usar herança é como usar um canhão para matar um mosquito, alguns pensam se outra forma, mais rígida ao meu ver e acham que a extensão da classe deixa claro que aquela não é mais uma array "nativa". Ao meu ver o uso de Herança se é mais interessante quando múltiplas classes irão herdar, não apenas uma. E vocês o que acham sobre isso ?