Ruby: The Bad Parts [cerrado]

20

Hace poco leí el libro de Crockford "Javascript: The Good Parts" y una de las premisas subyacentes era que los lenguajes de programación pueden tener un conjunto de características malas que los programadores deberían evitar.

Soy Rubyist y, aunque me encanta el lenguaje, siempre hay valor en obtener perspectiva. Entonces, ¿cuál ves como la peor característica (por ejemplo, métodos, clases, prácticas) en Ruby? Mi intención aquí no es comenzar una discusión sobre los méritos del lenguaje en sí o su velocidad, etc. Más bien preferiría una discusión sobre qué características considera peligrosas / problemáticas / dolorosas de usar, basadas en experiencias pasadas.

Jack Kinsella
fuente
1
Nunca he sido fanático de tener que usar la palabra "fin", y luego la mezcla de eso con "{" y "}" se vuelve aún más molesto. Me hace apreciar la sintaxis de estilo Python o la de {&} hacia arriba. Aunque uno podría discutir de ida y vuelta sobre esto, y finalmente tiene mucho que ver con las preferencias personales. Escuché a alguien decir que Ruby toma las partes más feas de Python y Perl y las junta. Sin embargo, disfruto aprendiendo Ruby.
De hecho, me gusta bastante esta pregunta y espero con ansias las respuestas, pero sin embargo voté para cerrarla. No creo que sea una buena opción para Stack Overflow (debido a que es potencialmente demasiado subjetivo / argumentativo, abierto, etc.).
stakx
Creo que vale la pena discutirlo, ya que podría iluminar prácticas peligrosas para evitar. Sin embargo, veo su punto y edité la pregunta para que sea más estrecha.
99
No veo cómo esta pregunta es lo suficientemente distinta de, por ejemplo, ¿Cuáles son las cosas que le gustaría mejorar en el lenguaje Ruby? , ¿De qué Ruby Gotchas se debe advertir a un novato? , ¿Cuáles son los problemas del mundo real con Ruby? o cualquiera de las otras millones de preguntas sobre los puntos débiles de Ruby. Además, incluso si esta pregunta se desarrolla para diferenciarse de las otras, pertenecería a Programmers.SE , no a StackOverflow.
Jörg W Mittag
2
Necesito que me revisen los ojos. Pensé que el título de esta pregunta era "Ruby: The Brad Pitts".
oosterwal

Respuestas:

8

Deberías ver Python vs Ruby: A Battle to The Death por Gary Bernhardt. Él hace la cita:

Las mismas cosas que encuentro feas en Ruby son las que hacen posible un software increíble de Ruby como RSpec, y que Python nunca podría haberlo hecho (dada la implementación actual).

Si bien habla mucho sobre Python en particular, toca muchas cosas que son raras en Ruby. Uno de los grandes temas generales es el parche de mono .

Los objetos Ruby (a diferencia de los objetos en algunos otros lenguajes orientados a objetos) pueden modificarse individualmente. Siempre puede agregar métodos por objeto. En Ruby, el comportamiento o las capacidades de un objeto pueden diferir de los suministrados por su clase.

Si bien esto proporciona mucha flexibilidad y potencia algunas de las gemas más populares y complicadas de Ruby, puede morderte el trasero si estás tratando de depurar un problema sin darte cuenta de que alguna biblioteca en algún lugar ha modificado un método central.

Michelle Tilley
fuente
Javascript le permite tratar objetos de esa manera también.
0112
8

Algunas personas solo piensan en el rubí en términos de rubí sobre rieles y es un poco molesto porque el lenguaje se sostiene por sí solo bastante bien.

davidk01
fuente
7

Creo que la peor característica es la open classesque le permite cambiar globalmente el comportamiento de todas las instancias actuales y futuras de la clase modificada.

La parte problemática de esta característica es que estos cambios (globales) ocurren durante el tiempo de ejecución cuando el intérprete de Ruby se encuentra con la definición, lo que podría pasar mucho tiempo después de que haya instanciado un par de objetos que ahora cambian su comportamiento de repente.

En una base de código grande, esto puede resultar en errores muy, muy difíciles de encontrar, especialmente porque esto se ve agravado por la débil historia de depuración de Ruby (en comparación con CLR o JVM) y el uso de otras características (por ejemplo eval) en este contexto puede hacer que es bastante difícil encontrar la ubicación donde ocurrió este cambio global. es decir, si ya llegó al punto en el que sospecha que la clase "correcta" está causando el problema. En mi experiencia, generalmente comienza con una persecución salvaje, ya que los problemas comienzan a surgir en un objeto usando al verdadero culpable.

Por lo tanto, lo mejor sería dejar de usar clases abiertas ( #extendy poner los cambios en un ModuleIMHO es mucho más seguro, más fácil de entender y mejor probar) o si no se puede evitar:

  • solo extienda las clases con un comportamiento nuevo (es decir, sin anular el comportamiento existente)
  • tener un lugar definido en el árbol de código fuente, donde todas las extensiones que usan clases abiertas deben colocarse
  • no use #evaly amigos para crear clases abiertas
  • coloque todos los usos de las clases abiertas en un gran gráfico visible, donde todos los desarrolladores puedan verlos, y deje en claro que cualquier cambio en ellos son "decisiones arquitectónicas" que afectan a toda la base de código (lo que hacen) y no el lugar para hacks rápidos útiles para su tarea actual
Alexander Battisti
fuente
5

La razón principal por la que no uso Ruby: es más lento que la melaza en enero en el Polo Norte durante una era de hielo. Los lenguajes de evaluación comparativa son una ciencia inexacta, pero Ruby parece drásticamente más lento que incluso JavaScript y Python.

dsimcha
fuente
esa fue mi experiencia también.
Chuck Stephanski
2
¿Cuál fue la aplicación que desarrolló para que Ruby era demasiado lento? Quiero decir, te creo cuando dices que es lento, pero ¿cómo te impidió alcanzar tu objetivo?
David
1
Creo que Ruby es genial cuando quieres hacer algo así como un prototipo y quieres que se haga rápidamente, algo que no es enorme y que no hará un cálculo masivo de números. Si espera estar masticando muchos ciclos de CPU constantemente, cualquier buen programador sabe usar algo como C o C ++.
Jeff Welling
1
@David: consideraría usar Ruby para el código simple de procesamiento de secuencia de ADN, pero no lo hago porque Python llena un nicho similar, tiene características similares y es mucho más rápido. Si estoy dispuesto a bajar de nivel, D es aún más rápido y conveniente.
dsimcha
1
@Jeff: De acuerdo, pero C y C ++ son difíciles de escribir. El objetivo de los lenguajes de alto nivel como Ruby es evitar lidiar con este dolor tanto como sea posible. Cuanto más lentos son, menos bien cumplen este objetivo. Ruby es lento incluso para un lenguaje dinámico de alto nivel. Eso y NumPy / SciPy son las razones por las que uso Python cuando necesito un lenguaje dinámico de alto nivel.
dsimcha
4

Si esto se puede extender a Ruby on Rails, entonces:

  1. El hecho de que la lógica de la base de datos le da a cada tabla una auto_incrementclave principal, incluidas las tablas que no las necesitan y no deberían tenerlas.

  2. El hecho de que las claves compuestas no son compatibles en absoluto.

Para Ruby, mi queja sería la misma que para cualquier lenguaje que cambie la seguridad por la expresividad; es fácil hacer mucho con solo un pequeño código, pero es igual de fácil hacer un gran lío con cualquier cantidad de código.

Aroth
fuente
Vea mis ediciones ya que he reducido el alcance de la pregunta. Comenzaré otro paralelo para Rails si se aprueba esta pregunta con modificaciones.
1
Lo sentimos, pero está equivocado, no todas las tablas en una aplicación Rails deben tener una auto_incrementidentificación, especialmente unir tablas para relaciones has_and_belongs_to_many se sugiere explícitamente que NO tengan una columna de identificación.
Brett Bender
@ Brett - ¿Son esas adiciones relativamente nuevas? Cuando jugué con él a principios de 2008, definitivamente no tenía esas características. En cualquier caso, es genial que estén disponibles ahora.
1
@aroth: No estoy seguro de que todos los demás consideren "relativamente nuevo" que significa "en los últimos tres años" :-)
Hay una alternativa al ActiveRecord de Rails llamado DataMapper , que no es tan obstinado como ActiveRecord.
Endy Tjahjono
3

Ruby adopta la metaprogramación (reflexión, introspección), programación de paradigmas múltiples y dinamismo a un nivel poco común. Es fácil dispararse en el pie con potencia y flexibilidad.

¿Molesto? Ruby tiene la capacidad de ser extremadamente legible o inescrutable. He visto código que parece pertenecer a un script Bash.

Malas prácticas? Algunos rubíes valoran la inteligencia sobre la sabiduría. Escriben y comparten trucos que muestran su inteligencia, pero esto crea un código ilegible y frágil.

Por otro lado: Javascript fue un desastre por diseño, y el libro "The Good Parts" trata de extraer su belleza oculta. Perl, un lenguaje que popularizó "Hay más de una forma de hacerlo" (es decir, flexibilidad), tiene un libro similar en "Perl, mejores prácticas". La historia de Perl es de experimentación y experiencia ganada con esfuerzo, "Best Practices" representa su conocimiento. Perl 6 será, creo que es justo decir, un reinicio del lenguaje basado en ese conocimiento y más. Ruby puede sufrir problemas similares.

@James y bucles for ... Cuando haces un bucle for en ruby, llama ".each". Por lo tanto, "for" es azúcar sintáctico para personas más cómodas con bucles estilo C. Pero como Rubyist, vas a usar iteradores como .map, .inject, .each_with_object, todo el tiempo. Nunca tendrá que escribir un bucle for con algo como "i = 0; i> 6; i ++" en ruby, por lo que terminará abandonando el hábito. @andrew ... el elocuente rubí no respalda los bucles.

autodidakto
fuente
-1

Esto se trata más de los programadores que del lenguaje, pero ¿por qué los programadores de Ruby odian tanto los bucles?

Me doy cuenta de que Ruby tiene:

someCollection.each do |item|
   ...
end

pero nunca he visto eso usado en situaciones donde un bucle for no haría exactamente lo mismo.

He preguntado varias veces y nunca obtuve una buena respuesta a esta.

Si es solo una cuestión de estilo, estoy feliz de aceptarlo, pero he visto a los programadores de Ruby realmente entusiasmados con esto y tengo mucha curiosidad.

James
fuente
1
Una vez que incluso recibí la respuesta "Es menos presionar teclas", lo cual es claramente falso ... :-)
James
2
Dos teorías: 1) Usar forbucles es algo que hacen n00bs. Personas que están programando C en Ruby. 2) Los bloques se usan mucho en Ruby, por lo que usar algo que no sea como un bloque es solo un esfuerzo mental adicional.
Andrew Grimm
3
Si bien recién comencé a aprender Ruby, los bloques son algo que realmente me gusta y extraño cuando intento usar Python. ¿Un bucle for haría lo mismo? Por supuesto, para mí, este tipo de estilo se adapta más a mis preferencias que a un bucle for.
Jetti
2
@ Andrew Para ser honesto, tu primera respuesta es exactamente el tipo de basura que recibí cuando pregunté antes. No hay razón real, con un insulto sutil en la parte superior. @Wayne, @Jetti y @andrews Segunda respuesta: gracias. Bastante justo entonces.
James
1
Si quiere decir "mejorado" para los bucles (también conocido como <value> en <expression> do ...) no hay diferencia aparte de #cada vez en uso y una apariencia más cercana a sus primos comúnmente utilizados #inject, #collect, # rechazar etc. Si está hablando de bucles indexados de estilo 'C' (también conocido como int int = 0; i <lo que sea; ++ i) la diferencia es que a) los errores "off by one" son imposibles yb) que aclara la intención de su ciclo: # cada significado "para cada elemento produce un efecto secundario". Un bucle for requiere que leas todo el bucle solo para obtener la "esencia" de su propósito.
Alexander Battisti
-1

Por lo general, evitaría las cosas que se agregaron solo para ser compatibles con otros idiomas. Por ejemplo, perlismos y for x in y.

Andrew Grimm
fuente
Acabo de publicar una respuesta sobre Ruby Programmers y para bucles, y si puedes explicarlo, te lo agradecería :-)
James