Discussion:
[RubyArg] Clases abstractas en ruby?
Cristhian Boujon
2010-05-04 01:00:37 UTC
Permalink
Buenas,

Gente, quería saber por que no existen las clases abstractas en ruby? hay
algunas maneras de hacerlas, pero leí también que "en ruby las clases
abstractas no tienen sentido" la pregunta sería por que no tienen sentido?

Muchos patrones de diseño utilizan las clases abstractas para obligar a
clases hijas a que implementen determinados métodos (que es bastante útil),
así como evitar que una clase abstracta se inicialize (y tiene bastante
sentido).

Han usado clases abstractas o algo en ruby que incluya los conceptos de las
clases abtractas (forzar a implementar métodos y no permitir
inicialización)?

Saludos.
Maximiliano Guzman
2010-05-04 01:16:47 UTC
Permalink
Post by Cristhian Boujon
Buenas,
Gente, quería saber por que no existen las clases abstractas en ruby? hay
algunas maneras de hacerlas, pero leí también que "en ruby las clases
abstractas no tienen sentido" la pregunta sería por que no tienen sentido?
Muchos patrones de diseño utilizan las clases abstractas para obligar a
clases hijas a que implementen determinados métodos (que es bastante útil),
así como evitar que una clase abstracta se inicialize (y tiene bastante
sentido).
Han usado clases abstractas o algo en ruby que incluya los conceptos de las
clases abtractas (forzar a implementar métodos y no permitir
inicialización)?
Saludos.
_______________________________________________
Ruby mailing list
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
algunas ideas: http://stackoverflow.com/questions/512466/how-to-implement-an-abstract-class-in-ruby
Cristhian Boujon
2010-05-04 01:46:05 UTC
Permalink
Maximiliano,

Gracias por el link! lo había visitado antes, pero por lo que veo ahí, no
puedo forzar a que se implemente un método de la clase padre y las
soluciones me parecen un tanto "sucias" y/o rebuscadas.

Además, me interesa saber por que es que algunos dicen que "no tiene
sentido"

Saludos!
Nubis
2010-05-04 02:20:14 UTC
Permalink
Post by Cristhian Boujon
Maximiliano,
Gracias por el link! lo había visitado antes, pero por lo que veo ahí, no
puedo forzar a que se implemente un método de la clase padre y las
soluciones me parecen un tanto "sucias" y/o rebuscadas.
Además, me interesa saber por que es que algunos dicen que "no tiene
sentido"
Saludos!
Es que en el 'zen' de ruby, el poder lo tiene el usuario y lo que vos querés
que los otros hagan con tu clase termina siendo mas una sugerencia que un
contrato estricto. Quien usa tu clase, al igual que vos, tiene la voluntad
de que todo funcione bien, por eso va a aceptar todas tus sugerencias en la
medida en que apliquen. private y protected son maneras de formalizar esa
sugerencia, asi como lo es hacer un método y que levante una excepcion
diciendo 'este método tenés que redefinirlo si vas a usar tal o cual
funcionalidad'. Quizás alguien preferiria un chequeo de que los métodos
esten definidos al momento de 'compilar' la clase nueva, pero seria bastante
difícil garantizar eso dada la naturaleza de ruby (si soy guacho puedo
modificar la clase at runtime y saltearme el chequeo). Por eso es aceptable
que te enterés que tenias que redefinir tal o cual método recién al momento
de llamarlo.
En general desarrollando en ruby, hasta llegar a la solución final uno tiene
la libertad de facilmente ir cambiando la responsabilidad de cada clase, y
podria decirse que uno nunca sabe con certeza haber llegado a la solución
final porque siempre hay algo que podria hacerse o mejorarse, entonces ruby
está preparado para que las responsabilidades siempre puedan moverse
libremente de un lado a otro sin requerir una reunión del directorio de la
empresa :)

No sé si tu pregunta venia por ese lado o terminé escribiendo la respuesta
que queria escribir :P

saludos
----nubis :)
Nacho Facello
2010-05-04 14:07:13 UTC
Permalink
Post by Cristhian Boujon
Maximiliano,
Gracias por el link! lo había visitado antes, pero por lo que veo ahí, no
puedo forzar a que se implemente un método de la clase padre y las
soluciones me parecen un tanto "sucias" y/o rebuscadas.
Además, me interesa saber por que es que algunos dicen que "no tiene
sentido"
Porque lo podés hacer de otras maneras.

De lo que recuerdo de mis tiempos en Java, en la amplia mayoría de los
casos en la clase abstracta tenés un método con el comportamiento por
defecto. Para esos casos en los que no hay un comportamiento por
defecto que tenga sentido, podés hacer:

class ForceImplementation
def forced_method
raise "please implement this method"
end
end

Lo de forzar a que la clase no pueda ser instanciada no es algo que
tenga mucho sentido, en mi opinión — si la clase requiere que le
implementes ciertos métodos, va a explotar de todas formas, y si no lo
requiere, entonces cuál es el problema de dejar que se pueda
instanciar con la implementación por defecto?

El tema es que no podés traducir directamente conceptos de Java a
Ruby. Son lenguajes diferentes. Por ejemplo lo que hablás en otro mail
de las interfaces. Tiene sentido en Java que existan interfaces porque
cada variable tiene que tener un tipo de datos determinado y se
determina al compilar si la llamada es correcta o no. En Ruby no tiene
sentido — si querés saber si ese objeto responde a un método
determinado, se lo preguntás y chau.
Post by Cristhian Boujon
Saludos!
_______________________________________________
Ruby mailing list
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
--
Nacho Facello
:wq
Maximiliano Guzman
2010-05-04 14:18:01 UTC
Permalink
Post by Nacho Facello
El tema es que no podés traducir directamente conceptos de Java a
Ruby. Son lenguajes diferentes. Por ejemplo lo que hablás en otro mail
de las interfaces. Tiene sentido en Java que existan interfaces porque
cada variable tiene que tener un tipo de datos determinado y se
determina al compilar si la llamada es correcta o no. En Ruby no tiene
sentido — si querés saber si ese objeto responde a un método
determinado, se lo preguntás y chau.
recuerdo el día que descubrí que en vez de preguntar a que clase
pertenecía un objeto y mirar en una tabla para ver si tenía que llamar
un método podía hacer algo así:

documents.each do |document|
puts document.name
puts document.code
puts document.customer if document.respond_to?(:customer)
end

si querés asegurarte de que una clase hija implemente tal o cual
método, tal vez lo podés hacer con un unit test que verifique que las
clases hijas de tu clase respondan a tal o cual método (usando
respond_to?). Podés usar alguno de los métodos ::descendants (medio
hackish): http://stackoverflow.com/questions/2393697/look-up-all-descendants-of-a-class-in-ruby

saludos, Maximiliano
Ernesto Tagwerker
2010-05-04 02:01:45 UTC
Permalink
Post by Maximiliano Guzman
Post by Cristhian Boujon
Buenas,
Gente, quería saber por que no existen las clases abstractas en ru
by? hay
algunas maneras de hacerlas, pero leí también que "en ruby las cla
ses
abstractas no tienen sentido" la pregunta sería por que no tienen sentido?
Muchos patrones de diseño utilizan las clases abstractas para obli
gar a
clases hijas a que implementen determinados métodos (que es bastan
te útil),
Podés dar un ejemplo concreto (no un patrón) donde sean útiles?
Post by Maximiliano Guzman
Post by Cristhian Boujon
así como evitar que una clase abstracta se inicialize (y tiene bas
tante
sentido).
Tiene tanto sentido? Por qué en vez de una clase abstracta no definís
un Module?
Post by Maximiliano Guzman
Post by Cristhian Boujon
Han usado clases abstractas o algo en ruby que incluya los
conceptos de las
clases abtractas (forzar a implementar métodos y no permitir
inicialización)?
Sé que existe un gem o plugin que podés usar para declarar una clase
como abstract pero nunca lo usé.

Saludos,
Ernesto
Post by Maximiliano Guzman
Post by Cristhian Boujon
Saludos.
_______________________________________________
Ruby mailing list
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
algunas ideas: http://stackoverflow.com/questions/512466/how-to-implement-an-abstract-class-in-ruby
_______________________________________________
Ruby mailing list
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
Juancito Arias
2010-05-04 13:49:17 UTC
Permalink
En vez de usar clases abstractas y herencia podes usar interfaces y delegacion.
Estoy leyendo un libro muy bueno sobre eso
http://www.pragprog.com/titles/kpiod/interface-oriented-design y te lo
recomiendo fuertemente.

El día 3 de mayo de 2010 22:00, Cristhian Boujon
Post by Cristhian Boujon
Buenas,
Gente, quería saber por que no existen las clases abstractas en ruby? hay
algunas maneras de hacerlas, pero leí también que "en ruby las clases
abstractas no tienen sentido" la pregunta sería por que no tienen sentido?
Muchos patrones de diseño utilizan las clases abstractas para obligar a
clases hijas a que implementen determinados métodos (que es bastante útil),
así como evitar que una clase abstracta se inicialize (y tiene bastante
sentido).
Han usado clases abstractas o algo en ruby que incluya los conceptos de las
clases abtractas (forzar a implementar métodos y no permitir
inicialización)?
Saludos.
_______________________________________________
Ruby mailing list
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
Cristhian Boujon
2010-05-04 13:55:30 UTC
Permalink
Post by Juancito Arias
En vez de usar clases abstractas y herencia podes usar interfaces y delegacion.
Estoy leyendo un libro muy bueno sobre eso
http://www.pragprog.com/titles/kpiod/interface-oriented-design y te lo
recomiendo fuertemente.
El día 3 de mayo de 2010 22:00, Cristhian Boujon
Post by Cristhian Boujon
Buenas,
Gente, quería saber por que no existen las clases abstractas en ruby? hay
algunas maneras de hacerlas, pero leí también que "en ruby las clases
abstractas no tienen sentido" la pregunta sería por que no tienen
sentido?
Post by Cristhian Boujon
Muchos patrones de diseño utilizan las clases abstractas para obligar a
clases hijas a que implementen determinados métodos (que es bastante
útil),
Post by Cristhian Boujon
así como evitar que una clase abstracta se inicialize (y tiene bastante
sentido).
Han usado clases abstractas o algo en ruby que incluya los conceptos de
las
Post by Cristhian Boujon
clases abtractas (forzar a implementar métodos y no permitir
inicialización)?
Saludos.
_______________________________________________
Ruby mailing list
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
_______________________________________________
Ruby mailing list
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
Gracias por la recomendación Juancito, voy a hacerte caso. De todas maneras
Ruby lo más parecido a interfaces que tiene son los módulos hasta donde sé y
no te fuerzan a implementar métodos.

Saludos!
Nicolás Sanguinetti
2010-05-04 14:33:08 UTC
Permalink
# This class shouldn't be instantiated, it provides behavior for subclasses
class Foo
end

Por algún motivo los rubyistas no creen en la documentación, pero… funciona :)
Post by Cristhian Boujon
Buenas,
Gente, quería saber por que no existen las clases abstractas en ruby? hay
algunas maneras de hacerlas, pero leí también que "en ruby las clases
abstractas no tienen sentido" la pregunta sería por que no tienen sentido?
Muchos patrones de diseño utilizan las clases abstractas para obligar a
clases hijas a que implementen determinados métodos (que es bastante útil),
así como evitar que una clase abstracta se inicialize (y tiene bastante
sentido).
Han usado clases abstractas o algo en ruby que incluya los conceptos de las
clases abtractas (forzar a implementar métodos y no permitir
inicialización)?
Saludos.
_______________________________________________
Ruby mailing list
http://lista.rubyargentina.com.ar/listinfo.cgi/ruby-rubyargentina.com.ar
Continúe leyendo en narkive:
Loading...