Opinión: Var o no var… esa es la cuestión.

Hola a todos! Desde hace algunos días estoy usando Resharper. La verdad no era, como decirlo, muy proclive para instalármelo, ya que había tenido no muy buenas experiencas con CodeRush. Seguramente no eran culpa de CodeRush sinó mías, pero bueno… Al final me lo instalé y debo decir que estoy gratamente sorprendido: Es una auténtica maravilla.

Una cosa interesante de Resharper es que te hace sugerencias (que puedes desactivar si quieres, por supuesto) sobre como codificar mejor. Y una de las sugerencias es usar var siempre que se pueda:

image

Fijaos que incluso en un caso trivial como int i=0; nos recomienda que usemos var.

Nota: Primero una pequeña aclaración sobre var: Por si acaso… Recordad que var no es tipado dinámico, ni late-binding ni nada parecido a esto. Var simplemente le indica al compilador que infiera él el tipo de la variable. Pero la variable tiene un tipo concreto y lo tiene en tiempo de compilación. Por lo tanto olvidad todos vuestros prejuicios (si los tenéis) sobre tipos dinámicos.

Hay tres corrientes de opinión al respecto de cuando usar var: Hay gente que opina que debe usarse sólo cuando es necesario (cuando se trabaja con objetos anónimos).

Otros opinan que cuando el tipo ya aparece en la lína de código puede usarse var. Es decir, admiten esto:

var dict = new Dictionary<int, string>();

Porque el tipo de la variable ya aparece en el new. Pero no admiten lo siguiente:

var result = stockManager.GetStocks();

Porque, viendo el código: como se puede saber el tipo de result? (Debes irte a ver que devuelve el método GetStocks).

Por último el tercer grupo de opinión está a favor de usar var siempre. Incluso en los casos más triviales.

Por curiosidad:

  1. La msdn se situa en el primer grupo de opinión (literalmente dice “the use of var does have at least the potential to make your code more difficult to understand for other developers. For that reason, the C# documentation generally uses var only when it is required” – http://msdn.microsoft.com/en-us/library/bb384061.aspx).
  2. Resharper se sitúa en el tercer grupo, como hemos visto
  3. Yo me situaba en el segundo grupo de opinión.

¿Que aporta usar siempre var?

Que Resharper me estuviese continuamente insistiendo en usar var me hizo pensar en el por que de esa razón. Así que lo que hice fue probar y hacerle caso. Y empecé a usar var en todos los sitios. A ver que ocurría.

Y ocurrió una cosa interesante…

Al usar var continuamente pierdes el tipo de la variable de forma visual (es decir no sabes de que tipo es sólo viendo esa línea de código) y entonces te das cuenta de una cosa: que muchos nombres de variables aportan muy poca información sobre que hace realmente la variable. Los detractores de var dicen que puede complicar la lectura de código… pero que es más dificil de entender, esto:

Player plr = GetCurrentPlayer();
Location l = plr.GetCustomLocation();
// Varias líneas de código hablando de "l" y "plr"

o esto:

var player = GetCurrentPlayer();
var location = player.GetCustomLocation();
// Varias líneas de código hablando de "location" y "player"

El tema está en que la variable la declaras en una línea, y la usas en varias más. Evidentemente, si no usas var, la línea que declara la variable te da más información (exactamente el tipo de la variable), información que pierdes si usas var. Pero, como te das cuenta que estás perdiendo esta información, lo que haces es usar lo que resta de la línea para aumentar la claridad. Y que es lo que queda? El nombre de la variable.

Al usar var en todos los sitios te fuerzas a poner nombres más declarativos a tus variables, que expresen lo que la variable hace. Y todos sabemos que esa es una muy buena práctica. Y a veces no la seguimos, y una de las razones es que al tener una línea tipo:

Location l = new Location();

Mentalmente piensas: <<Ya se ve que “l” es una Location. Ya queda claro.>>

Pero no es cierto, porque al cabo de unas cuantas líneas te aparece una “l” y tienes que recordad que era una Location.

Mientras que si usas var, cuando escribes la línea tiendes a usar nombres más descriptivos, porque escribir:

var l = new Location();

Hace como daño a la vista 🙂

Así que la sugerencia de usar var siempre, personalmente no me parece muy desacertada, y creo que voy a tomar esa opción de ahora en adelante.

Pero… Y vosotros? ¿Que opináis al respecto?

Un saludo!

PD:  También creo que hay otra razón para que Resharper nos guie a usar siempre var y es que el código con var es más fácil de refactorizar (menos cambios) que el que usa declaraciones explícitas.

20 comentarios sobre “Opinión: Var o no var… esa es la cuestión.”

  1. Muy buen post, Eduard. Yo estoy totalmente de acuerdo contigo y, al igual que tú, llegué a conocer a fondo a nuestros amigos los vars tras usar Resharper. Además, hoy día no desarrollas con un editor de texto sino con un IDE que te va a dar toda la información que necesitas sólo con pasar el ratón por encima.

    De todas maneras no creo que haya que ser al 100% estricto con esto. Vaya, que si el desarrollador en un caso concreto lo ve más claro poniendo el tipo en lugar de un var, adelante.

  2. Yo soy de la línea dura, hay que declararlo todo con sus tipos, peeeeeeeeeeeeeero, y sobre todo en C++, a veces la declaración puede quedar barroca en extremo, sobre todo con los lambdas (para aquellos que no lo sepan, el estándar C++C0x, ya C++C1x, y Visual Studio 2010, implementan operadores lambda en C++), así que dejamos un poco de flexibilidad.

    Por otro lado,

    var l = new Location();

    a mi al menos me duele a los ojos, y por algo que ya comentas tu mismo: luego no sabes qué es “l”. Siguiendo a McConnel, podrías haber puesto

    var location = new Location();

    Así en todo momento sabes qué es dicha variable. Y lo siento por los forofos de los IDE, porque a veces no vas a tener disponible IntelliSense ni otras zarandajas.

    Y da gusto ver entradas como esta por aquí, sigue así. 🙂

  3. Gracias a todos por vuestros comentarios!

    @David
    Totalmente de acuerdo con lo que dices. Yo no quiero se imponga nada a nadie, eh? De hecho ya decía, que yo hasta ahora no usaba siempre var. Pero ahora que he empezado a hacerlo… pues he visto más beneficios que pegas.
    Por supuesto cada uno que actúe como se sienta más cómodo, pero estaría bien que cada uno lo probase. 😉

    @Hadi
    Totalmente de acuerdo. De hecho es más importante lo que hace el código que el cómo lo hace. Pero a veces nos cuesta darnos cuenta de eso 🙁

    @Rafael
    > podrías haber puesto: var location = new Location();

    Exacto, eso es lo que defiendo xD (fíjate que yo digo que var l = new Location(); hace daño a la vista :P).
    Lo que vengo a decir en mi post es que:
    var location = new Location();
    es mejor que:
    Location l = new Location();

    Porque en el segundo caso *luego* te encuentras con “l”s dando vueltas por ahí 😛

    Esa es la idea del post 🙂

    PD: Declaraciones “barrocas” en C++??? Nunca jamás he visto ninguna 😛 😛 😛 😛

  4. @Juan Maria
    Es importante tener una guía de estilos que armonice como se codifica dentro de un equipo (por cierto conoces StyleCop, quizá puede ayudarte en esto, quizá no). Pero es importante también tener claro el porqué de cada decisión que se tome en esa guía (no digo que vosotros no lo tengáis, eh?).
    Hacer lo que hace MS, sólo “porque lo hace MS”, no siempre puede ser la mejor opción!

    Un saludo y gracias por comentar! 😉

  5. @Edu: Muy buena entrada, en la línea.
    Debo reconooer que yo estoy entre la linea dura y el segundo grupo, aunque SIEMPRE tengo por custumbre definir correctamente los nombres de las variables, salvo en los pocos casos de algunas variables deblaradas dentro de un bloque de código pequeño.
    Eso si, después de leer tu artículo me haces pensar detenidamente si debería o no pasarme al grupo ‘pro-var’ 🙂
    Un abrazo tío…

  6. Yo estoy en el segundo grupo incluyendo que las variables tienen que tener un nombre correcto. Lo de l, i o j no es muy intuitivo que digamos.

    por cierto, felicidades por el post!

  7. Con todos mis respetos este es el tipico post ‘incendiario’ con miles de comentarios que al final todo se queda en nada, pero bueno. Yo soy de la primera opción, más que nada porque el resto no tienen sentido, se están comentiendo un montón de falacias.

    En primer lugar:

    var location = new Location()

    no aumenta la expresividad en esta linea comparada con la siguiente y por lo tanto recomendar poner el var en vez de Location para mi es una equivocación.

    Location location = new Location()

    En segundo lugar, decir que por poner var aumentas la expresividad al ‘obligar’ al desarrollador a usar mejores nombres tiene una serie de precondiciones, la primera es que el desarrollador es inteligente y se preocupa por la intencionalidad de su codigo, en este caso, no necesita var el mismo se preocupará de dar buena expresividad a su código declarando sus tipos, la segunda precondición es que es inteligente, algo siempre cierto, y por lo tanto su inteligencia le dirá que tendrá que hacer lo primero que es preocuparse de darle expresividad a lo que hace y no el detalla del uso de var

    En definitiva, habéis llevado el tema, con argumentos erroneos en mi opinión, hacia dónde no es, var no implica necesariamente mejor expresividad y por lo tanto no debería ser una recomendacion.

    Saludos
    Juan

  8. @Juan
    Hombre… tanto como un post incendiario… Que aquí nadie a sacado el látigo para flagelar a los infieles 😀
    De hecho, queda claro que usar var o no, es una opción de cada uno, yo sólo cuento mi experiencia. No quiero convertir a nadie, no soy profeta de nada (si acaso, sólo de la cerveza :P).

    De todos modos, no me queda claro tu comentario.
    Según tu es mejor:

    Location l = new Location();
    que
    var location = new Location();

    Es eso?

    Porque de *eso* es lo que habla el post. Si, estamos de acuerdo que
    Location location = new Location();
    da todavía más información. Pero el post no va de eso. 🙂

    El post va de que, al usar var, uno sin darse cuenta pone nombres más descriptivos a las variables… y eso es bueno.
    Lease uno = yo, porque es mi experiencia de lo que me ha pasado a MI 😀

    Un saludo!

  9. @Eduard, gran post. R# te ayuda en muchas cosas, sugerirte el var es una de ellas 😀
    @Juan, decir que es un post “incendiario” porque no te gusta var, refuerza el argumento de que var es opcional. Si no te gusta no lo utilices, pero te aseguro que cuando lo comienzas a utilizar te olvidas del “left type declaration”, vamos que si es por ser redundante las 2 lineas que has escrito para mis son exactamente iguales. Si no ves la diferencia, pues … no uses “var”.

    Salu2

  10. @Juan,

    Tal como lo dije en mi comentario, al igual que lo reflejé en su momento en mi post, creo que estás básandote más en la implementación que en la intenciones del código.

    Piensa realmente en porque te es necesario saber el tipo de la variable para incrementar la expresividad del código.

  11. Hola Edu! es muy interesante el debate que planteas.
    A mi no me gusta usar var, aunque el argumento que aportas y que comentaba Hadi es muy interesante y te hace plantearte usarlo. Voy a probar a aconsejarlo y recomendarlo a mis compañeros… a ver que pasa…
    Un saludo!!

    Miguel Sierra

  12. Pues lo siento, pero soy del segundo grupo y me siento no totalmente, pero sí bastante identificado con lo que comenta Juan.

    Siguiendo el ejemplo de Eduard:

    Player plr = GetCurrentPlayer();
    Location l = plr.GetCustomLocation();

    o esto:

    Player player = GetCurrentPlayer();
    Location location = player.GetCustomLocation();

    En mi opinión lo segundo.
    Y evidentemente, usar var cuando corresponda… no siempre. Si es siempre… que lo diga todo el mundo y que nadie comente que es necesario declarar una variable con su tipo. Así nos ahorramos todos discusiones, y sino es así, será por algo. 😉

    Y siguiendo con los comentarios, totalmente de acuerdo con lo que Hadi comenta, intenciones del código más que la implementación.

    Si mezclamos todos estos ingredientes, tenemos un grupo de tipo 2 que es donde me siendo yo identificado.

    Declaramos var cuando debe ser (y si queremos, no por norma).
    Declaramos las variables con cierta legibilidad (l no, location por ejemplo), y por supuesto, declaramos métodos y funciones que representen algo… no me sirve un Abrir() y sí un AbrirFichero() por ejemplo.

    Sé que es un tema muy discutible, pero para eso están estos blogs, para tener un debate abierto e interesante donde como vemos, MVPs y no MVPs, tenemos ideas contrarias, y eso es porque ni hay verdad absoluta y sí muchas experiencias diferentes. 🙂

  13. Pero venga Hadi!!, es todo lo contrario, eres tu el que dices que var aumenta la expresividad, con la misma te respondo, Hadi, piensa porque poniendo var tu código aumenta la expresividad? Simplemente digo que es un error afirmar que var aumenta la expresividad, al igual que poner el tipo, la expresividad la aumenta el desarrollador, nada más. Y por lo tanto, como var no está hecho para esto pues notiene sentido usarlo y menos recomendarlo

  14. @Juan,

    Te recomiendo leer mi post, por no repetirme constantamente.

    El desarrollador, si es inteligente, pero también es complaciente y si cae en la falsa tentación de que una implementación aporta mayor claridad, no se molestará mucho en expresar bien las intenciones mediante el nombre de variables, tipos y métodos.

    Si con var, se elimina esa tentación porque ya no existe una “implementación concreta”, puede ayudar a incrementar la expresividad.

    Obviamente que influye el desarrollador, pero una cosa no exlcuye la otra.

  15. Buen post Eduard, la verdad que a mi me ha pasado exactamente como a ti.
    Yo no utilizaba demasiado var y desde que he comenzado a utilizar resharper me he acostumbrado a seguir algunos de sus consejos y me parecen muy útiles ;-).

    Saludos

  16. En mi caso, soy casi tan partidario de var, como lo soy de bar. : )

    Me sitúo en el grupo de la tercera opción, o sea, de R#…

    Creo que en este debate hay un punto importante, y es que de manera análoga a la “ofuscación” que var introduce, también podríamos hablar de la “redundancia” que la primera opción introduce en sí misma (TipoA miVariable = new TipoA()).

    Está claro que la expresividad es algo bastante subjetivo, no sólo en C# sino en cualquier lenguaje que empleamos, sea o no un lenguaje de programación. En Español sería igualmente válida la frase: “Voy a cenar con unos amigos y después iré a casa a dormir” que la frase “Yo voy a cenar con unos amigos y después yo iré a casa a dormir”. La segunda aporta mayor claridad, si bien es bastante redundante por la repetición del pronombre personal… Creo que el debate al respecto de “var” es perfectamente extrapolable a este caso.

    Una curiosidad para terminar, la palabra reservada “var” entra dentro de la categoría de “contextual keyword”, o sea, su carácter reservado de cara al compilador es sólamente aplicable en aquellos contextos en los que es válido que aparezca (al contrario que otras keywords cuyo uso está reservado en cualquier parte de nuestro código, como por ejemplo los tipos básicos o las sentencias de repetición o condicionales: int, string, if, for, etc.).

    Esto significa que la siguiente declaración sería perfectamente válida: var var = 5;

    … lo cual no significa precisamente que debamos utilizarla/recomendarla. : )

    Saludos!
    M.

  17. Yo soy de la opinión de no usar var, de hecho es la única opción que tengo desactivada del Resharper, entiendo la perspectiva de hadi hariri, pero debemos tener en cuenta de que muchas veces nuestro código tambien es visto y modificado por otras personas que no tienen el mismo nivel y en ciertos casos esto puede conducir a confusiones incluso si el metódo se llama correctamente.

Deja un comentario

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *