Feda /dev/

MisKo

He de preocuparme por no saber que coño es eso de la metaprogramación de Ruby? xD

1 respuesta
MTX_Anubis

#18149 Pues llevo desde el 2010 desarrollando en ruby (entre otros lenguajes vaya), lo digo con conocimiento de causa pero puedes pensar lo que quieras.

Obviamente no es un lenguaje perfecto, decir que es de juguete es hablar sin saber.

2 respuestas
Troyer

#18151 de Ruby o en general?

1 respuesta
r2d2rigo

#18152 Ruby es el JS de los hipsters, asi que si, juguete.

GlatoR

#18152 que es metaprogramacion

3 respuestas
Satek

#18155 Programas que hacen programas

1 respuesta
cabron

#18155

Programar metas, por ejemplo si haces un programa para seguir los resultados de Ciciclismo o Fórmula 1, la parte que avisa cuando cada corredor ha llegado a la meta, la distancia que queda para la meta, la bandera de la meta, etc, todo eso se hace con metaprogramación.

11 2 respuestas
Fyn4r

#18156 como skynet pero en artisan

1 respuesta
Satek

#18158 Yo lo unico que he visto de metaprog es reflexion en java

MisKo

#18153 Igual yo lo interpreto de otra manera, pero creo que no he usado practicamente nunca la metaprogramación.

Si que es verdad que alguna vez lo he usado para generarme algunas cosas de manera automática (por ejemplo un listado de modelos para un ORM que creaba los archivos automáticamente analizando las tablas de la ddbb y sus campos), pero es algo que lo he usado por ejemplo al principio del proyecto y despues, ya con los archivos creados, no lo he vuelto a usar.

Para mi, ese concepto sería como que estuviera creando cosas de manera dinámica 24/7 y de esa forma yo no lo he usado en la vida.

Ahora bien, sobre tu pregunta, me refería en concreto a Ruby, ya que el compi pone

y la metaprogramación que tiene ruby

de ahí mi duda: Que tiene la metaprogramación de Ruby (q no la conozco) y que es mejor que la de otros lenguajes? xD

2 respuestas
MTX_Anubis

#18155 Te iba a decir lo mismo que #18157 xD

La metaprogramación es basicamente modificar el propio programa que se está ejecutando/compilando

Te pongo un ejemplo con RoR ya que estamos hablando de ello. RoR usa como ActiveRecord en vez de un ORM al uso (aunque puede cambiarse pero bueno) y para ello utiliza toneladas de metaprogramación, un ejemplo, son los métodos find_by, por cada atributo que tenga añade un método find_by_<attributo> y lo hace como algo parecido a esto, no he mirado el codigo así que imagino que es algo parecido:

attrs = // consigue todos los atributos de la bbdd, imagino que lo coge desde el schema

attrs.each do |attr|
  define_method("find_by_#{attr}") do |value|
    find_by(attr,value)
  end
end

#18160 Es mejor basicamente porque es muchísimo más sencilla de hacer, lo que a mi gusto la hace más potente y peligrosa. Intenta modificar clases yo que sé, en java, en tiempo de compilación y preparate para sufrir un infierno, en ruby es declarar la clase de nuevo y añadir lo que quieras.

1 respuesta
r2d2rigo

Vamos que en vez de hacer las cosas bien, Ruby te acostumbra a montar cristos que solo entiendes tu.

Muy de artisan si.

2 2 respuestas
Saphyel

#18162
hacer cosas bien == no hace las cosas como yo quiero
solo entiendes tu == yo no entiendo una mierda

Traducido.

1 respuesta
r2d2rigo

#18163 asi a ojo se me ocurren 3 cosas por las que el snippet de antes es inmantenible, pero te dejo que las averigues tu como ejercicio a ver si asi subes de 1.4k.

1 respuesta
MisKo

#18161 Si llevas tiempo leyendo este foro y, por un casual, recuerdas algunos de mis posts, verás que soy un poco corto muchas veces (la mayoría del tiempo) y ahora no es distinto.

El ejemplo que indicas del ORM es sencillo de entender y, por ejemplo, con Eloquent (ORM en PHP) existe lo mismo que comentas, como hacer un whereEmail o findByEmail, findByName, etc.. pero en vez de con metaprogramación, creo que está hecho con los métodos mágicos de PHP, en concreto con __call que se ejecuta cuando llamas a un método de una clase que no existe pasandole como argumentos el nombre de la clase y los parametros.

Creo que la diferencia radica en que, en este ORM se comprueba si la funcion llamada coincide con X, y ejecutará la que tenga asociada pasando Y paramétros, mientras que en tu código, entiendo que se crean dinámicamente esos métodos y están disponibles para la clase.

Ahora bien, y por eso lo de que soy corto al principio, no se me ocurre ningún ejemplo real (al margen de lo anterior) para darle uso a lo que comentas:

¿Porque ibas a querer modificar una clase que has creado?
¿Eso no significa que la clase está mal creada/pensada desde el principio?
Si es para ampliarla, ¿porque no se crea una clase que herede con lo que se necesite?

Creo que hacer las cosas de esa forma puede provocar que luego sea mas dificil mantener el código ( ya no por ti, que seguramente sepas lo que haces, si no por otra gente )

Lo mismo es por no usarla a diario por lo que no veo 'sus cosas buenas', pero no se me ocurre nada lógico como para usarlo en un proyecto normal.

4 2 respuestas
Troyer

#18165 Un ejemplo de un programa que aplica metaprograming podría ser esta toolkit: http://www.semanticdesigns.com/Products/DMS/DMSToolkit.html , básicamente realiza automaticamente todo esto a un programa:

+ Language Migration
+ Implementing Test Coverage and Profilers
+ Implementing Clone Detection
+ Massive architecture reengineering
+ Code generation for factory control
+ SOAization of embedded network controllers
+ Architecture extraction for mainframe software
+ Generation of vector SIMD instructions from array computations
+ Reverse engineering of code back to concepts

El metaprograming está principalmente enfocado a estructuras de código muy grandes, donde realmente merece la pena el esfuerzo de hacer un programa que actualiza-cambia-borra otro programa (o varios) según X condiciones automáticamente.

1 respuesta
Camp1

La verdad que ruby se pasa por el forro muchos principios de la OOP. A veces estas mierdas son útiles, pero el lenguaje en sí esta bien. Y RoR es muy cómodo y se hacen cosas rápidamente.

Si estáis en contra por qué no argumentáis, en vez de decir Ruby sucks. Ni que fuese JS...

Saphyel

#18164 ostia 1.4k anual, que lujazo, no? deberias mirarte un poco Java que tambien lo tiene, bss tk cnt

afhn

Llevo desde las 9 viendo docu en frances, me voy a morir!!

1 respuesta
Troyer

el cabrón de @r2d2rigo no pasa mucho por aquí, pero cada vez que habla sube el pan macho

#18169 tienes que hacer ya unas bagette increíbles

3 respuestas
MisKo

#18166 A mi me parece increible que un programa haga todo eso a otro sin conocerlo de nada xD

Mátrix está cada vez mas cerca

1 respuesta
Merkury

#18170 Y eso te jode eh, pikachu gordo.

afhn

#18170 baguttes y tortillas.

Troyer

#18171 si te pones a leer lo que hace la toolkit lloras, no sé cuantas personas hacen falta para poder desarrollar algo así pero tiene que ser un equipo grande y bien cualificado, creo que para nosotros que hacemos apps "sencillas" no llegamos a entender del todo la útilidad porque no estamos en el mundillo.

@Merkury tu que hablas puto gato inglés

2 respuestas
Merkury

#18174 Meow!

2 respuestas
Ranthas

#18175 ¿Cuántos fish&chips consumes semanalmente?

Pregunta seria

1 1 respuesta
Troyer

#18175 ya te tomaste el té de las three o'clock?

Pregunta seria

1
MisKo

#18174 Aunque parezca mentira, igual @AikonCWD pueda dar su opinion y todo. Supongo que la metaprogramación se usa mucho en los viros, ramsonware, etc.. para modificarse y replicarse a si mismos en distintos entornos xD

1 respuesta
AikonCWD

#18178 Si me explicas que es la metaprogramación con un ejemplo básico te digo se si usa o no.

Pero explicación para sysadmins, parfavar.

2 respuestas
Troyer

#18179 así a grosso modo con un ejemplo de hardware con impresoras para que un sysadmin lo entienda:

Una impresora 3d que imprime otra impresora 3d.

1 2 respuestas
Tema cerrado