Há algum tempo atrás, quando eu estava aprendendo a usar a linguagem Ruby me deparei com um exercício que consistia em receber dois arquivos de texto (digamos a.txt e b.txt) e fazer uma “troca” do conteúdo dos dois.
Ao fim do programa todos os conteúdos de a.txt deveriam estar em b.txt e vice-versa. O programa que eu escrevi, orgulhosamente, foi este:
#Swap the contents of two files
def swap_files this, that
#Get file A
fileA = File.new this,'r+'
contentsA = fileA.readlines
#Get file B
fileB = File.new that, 'r+'
contentsB =fileB.readlines
#Rewind and put B in A
fileA.rewind
fileA.print contentsB
fileA.close#Close it
#Rewind and put A in B
fileB.rewind
fileB.print contentsA
fileB.close#Close it
end
swap_files('A.txt','B.txt')
Comparando o meu com o feito por outras pessoas eu me deparo com esta versão:
File.rename('A.txt','A.txt.bkp')
File.rename('B.txt','A.txt')
File.rename('A.txt.bkp', 'B.txt')
O espertalhão só trocou o nome dos arquivos e obtevo o mesmo resultado! De quebra, acredito que seja ainda mais eficiente (não que isso me importasse muito) pois nem precisamos manipular os conteúdos diretamente.
Este texto faz parte da série Pequenos Programadores & Grandes Gambiarras.
Deixem feedback, dúvidas, sugestões e correções. Se tiverem uma gambiarra legal, dividam conosco nos comentários ou entrem em contato comigo pra ver se podemos ter umas idéias para posts novos.
Legal. Chegou no mesmo resultado com menos código, menos processamento e mais claridade.
Muito boa a sacada do cara.
A que eu tenho mais “orgulho” foi em grafos.
Ao final do código mexido e remexido por diversos programadores o código estava impossível de entender.
A saída continha todas soluções corretas e mais algumas absurdas que não faziam sentido.
Em vez de mexer no código horroroso eu fiz uma função chamada evilTemperer(xxx) que pegava a saída e filtrava as saídas absurdas tornando o código “correto”.
Eu sabia do risco extra de colocar o nome significativo de evilTemperer mas não resisti. O pimenta ficaria orgulhoso que mantive o bom costume de engenharia de softwaare de usar nomes significativos
Muito sagaz. Outra clássica que já fiz muitas vezes é:
Bug: a sua função deveria retornar ‘n’ e está retornando ‘n+1’
Solução: return resultado-1
Isso era meio óbvio!
Você que é muito burro de não ter pensado nisso!
Mesmo assim adoro você cara! Você é o melhor!