Las 3 cosas que deber铆as saber sobre los m茅todos bang (!) en Ruby

Las 3 cosas que deber铆as saber sobre los m茅todos bang (!) en Ruby

En el post de esta semana te voy a hablar de un tema que se pregunt贸 en mi canal de YouTube, que es sobre c贸mo utilizar los m茅todos bang en Ruby, esos a los que les ponemos una exclamaci贸n al final (!). Qu茅date conmigo para convertirte en un experto en esto de los m茅todos bang. 隆Vamos all谩!

1. Son una convenci贸n

Para Ruby el signo de exclamaci贸n, o bang (!), no significa nada internamente, simplemente es una convenci贸n de nombrado que los programadores de Ruby utilizan para denotar que un m茅todo puede ser “peligroso”.

De acuerdo con esta convenci贸n, el signo de exclamaci贸n (!) se debe colocar en el 煤ltimo car谩cter del nombre del m茅todo.

Lo que te recomendar铆a en estos casos es que cuando crees un m茅todo bang siempre tenga su alternativa sin bang. En otras palabras, si un m茅todo existe con bang, su alternative sin bang deber铆a de existir tambi茅n.

2. Est谩n pensados para llamar tu atenci贸n

Los m茅todos bang se utilizan para indicar peligro o si lo prefieres advertencia, pero, 驴de qu茅 nos advierten realmente? Generalmente ser谩 de una de estas dos cosas.

Este m茅todo modifica permanentemente el objeto que recibe el mensaje (efecto secundario)

En las librer铆as core de Ruby lo normal es que signifique que el m茅todo bang, a diferencia de su contrapartida sin signo de exclamaci贸n, modifique permanentemente al objeto que recibe este mensaje. Por ejemplo, String#upcase devuelve un String que consiste en el String original en may煤sculas, pero sin modificar el String original, mientras que su alternativa bang, String#upcase!, s铆 modifica permanentemente el mismo String original convirti茅ndolo a may煤sculas.

Este m茅todo lanza una excepci贸n

Este uso es muy t铆pico en Ruby on Rails. Seguro que te has dado cuenta de que en los controladores de Rails se utiliza un patr贸n diferente cuando se quiere comprobar si una acci贸n como update o save se ha podido realizar o no. La versi贸n sin bang del m茅todo devuelve un valor booleano (true si la operaci贸n ha tenido 茅xito y false en caso contrario) que normalmente se comprueba en una sentencia if, como por ejemplo:

Mientras que su contrapartida con bang asume que la operaci贸n tendr谩 siempre 茅xito y lanza una excepci贸n en caso contrario.

3. No son siempre “peligrosos”

隆Ni mucho menos! No son necesariamente peligrosos, de hecho en ocasiones puedes beneficiarte de ellos. Un ejemplo claro es para ahorrar memoria. Cuando un m茅todo tiene una versi贸n sin bang y otra con bang, la alternativa sin bang crea una nueva instancia en cada ejecuci贸n, mientras que la version con bang modifica el objeto que recibe el mensaje, lo que en colecciones grandes significa mayor consumo de memoria y m谩s trabajo para el Garbage Collector de Ruby, lo que a la larga tambi茅n incrementa el tiempo de ejecuci贸n.

Vamos a verlo con un ejemplo comparando upcase con upcase!. Para ello crearemos un array de strings y ejecutaremos GC.start para que el Garbage Collector de Ruby “limpie” antes de la ejecuci贸n de nuestro test, a continuaci贸n medimos la memoria antes y despu茅s de nuestro test para saber la memoria que se ha reservado:

upcase

Con upcase el resultado fue el siguiente

upcase!

Y con upcase! el resultado fue:

Como puedes ver la versi贸n sin bang reserva un extra de 1005MB mientras que la versi贸n con bang no necesita ning煤n extra, as铆 que cuando vayas a ejecutar muchas operaciones sobre una colecci贸n ten esto en cuenta 馃槈

隆Y esto es todo lo que quer铆a comentarte sobre los m茅todos bang en Ruby! Espero que te haya gustado y te haya servido para aprender o refrescar conceptos. Recuerda suscribirte para no perderte ninguna de mis actualizaciones y si tienes alguna duda no dejes pasar la oportunidad y preg煤ntame en la secci贸n de comentarios.

Nos vemos la semana que viene, 隆adi贸s!

No Comments

Post A Comment