Skip to content

Instantly share code, notes, and snippets.

@plagelao
Created January 6, 2011 01:05
Show Gist options
  • Save plagelao/767336 to your computer and use it in GitHub Desktop.
Save plagelao/767336 to your computer and use it in GitHub Desktop.
StringCalculator recursivo
require 'rspec'
class StringCalculator
def add(string)
return add(string_without_last_summand(string)) + last_summand(string) if more_than_one_summand?(string)
string.to_i
end
def string_without_last_summand(string)
string[0...last_separator_index(string)]
end
def last_summand(string)
string[last_separator_index(string) + 1..-1].to_i
end
def more_than_one_summand?(string)
string.include?(',') || string.include?("\n")
end
def separator
return /,|\n/
end
def last_separator_index(string)
-1*(string.reverse.index(separator) + 1)
end
end
@JuanQuijano
Copy link

ja, ja, ja. Tienes razón Alberto, me explico como un libro cerrado. A ver si ahora me hago entender mejor.

  1. string cadena = (textoConNumero == null ? string.empty : textoConNumero) Patrón null object para tipo string. De echo, creo, este patron es para objetos, no importa el tipo del mismo. También se puede hacer de forma clásica con una variable privada y una propiedad pública, pero a mi me resulta más engorroso.
    De todas formas es un tecnicismo, a lo que me quería referir es que la clase se podría mejorar si trata los objetos nulos o el que la cadena de texto no contenga números, o (si fuera c#) problemas de desbordamiento de enteros que no sé si en ruby hay que tenerlos en cuenta, etc.
  2. Tienes toda la razón. Es confuso. Pero es aún más, en Ruby es inecesario, por lo que he podido leer, el tema de los métodos estáticos. Olvida el parrafo entero. En C# tiene sentido, en Ruby por lo poco que he leido, no.
  3. Estaba intentando evitar StringCalculator.new("1,2,3").add y convertirlo en StringCalculator.calcula("1,2,3") que me parece mucho más legible. Desacoplar la cadena de texto del constructor. Así se puede construir la clase/objeto no importando que las firmas sean diferentes. Ya se encargará la propia clase de gestionar cada una, ocultando el "como" se hacen las cosas y solamente devolviendo el resultado.

Por último, agradecerte la contestación porque me ha "picado" a leer un poquito de Ruby para poder intentar aclarar lo mal que me he explicado, y me he encontrado sorprendido con las diferencias. Y me ha causado mucha curiosidad.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment