2010-01-26 12 views
5

Acabo de leer este post y hace que el caso contra el tipeo implícito al usar al comenzar con el desarrollo/diseño impulsado por prueba.Mecanografía implícita y TDD

Su publicación dice que el TDD se puede "ralentizar" cuando se usa tipeo implícito para el tipo de devolución cuando la unidad prueba un método. Además, parece querer el tipo de devolución especificado por la prueba para impulsar el desarrollo (lo cual tiene sentido para mí).

una prueba unitaria dada con tipos implícitos podría tener este aspecto:

public void Test_SomeMethod() 
{ 
    MyClass myClass = new MyClass(); 

    var result = myClass.MethodUnderTest(); 
    Assert.AreEqual(someCondition, result); 
} 

Así que mis preguntas son:

¿El uso de la ayuda tipos implícitos o dificultar las pruebas de unidad de escritura para TDD? ¿Hay alguien por ahí que pueda compartir su experiencia al usar esta técnica al escribir pruebas unitarias?

Lo pregunto porque pronto no he hecho TDD y quiero saber si hay una manera de escribir pruebas genéricas o semicomerciales de la unidad que funcionen, podría cambiar un tipo de devolución.

+0

@cmw - vale la pena señalar que var todavía está fuertemente tipado. Eso está en su fragmento de código, myClass todavía es de tipo MyClass y si intenta tratarlo de manera diferente, recibirá errores de tiempo de compilación. Tu otro comentario me hizo pensar que puede haber cierta confusión sobre esto. – Finglas

+0

@Dockers: cambié el código para reflejar la parte en la que estoy más interesado. Me preocupa más el valor del resultado de MethodUnderTest(). – cmw

Respuesta

3

Veo su punto, pero realmente no creo que sea la razón correcta para no usar var aquí. Recuerde, TDD funciona aproximadamente de acuerdo con lo siguiente:

  1. Escriba una nueva prueba.
  2. Si la prueba no puede compilarse (¡y debería fallar!), Escriba suficiente código hasta que se compile la prueba.
  3. Ejecute todas las pruebas.
  4. Si falla una prueba, escriba suficiente código hasta que todas las pruebas pasen.
  5. Refactor.

Si usamos var o no, la prueba no se compilará de ninguna manera porque el método bajo prueba no existirá todavía !. Una vez que comenzamos a codificar NewMethod sus puntos son bastante discutibles.

Por el contrario, la razón correcta para no usar var aquí es porque el código no indica qué tipo de result es. Esta es una cuestión de opinión, pero var está bien aquí

var dict = new Dictionary<Foo, List<Bar>>(); 

y para los tipos anónimos pero no aquí

var m = M(); 

porque es completamente claro sin ir a la declaración de M (o el uso de IntelliSense) lo que el el tipo de devolución de M es.

+0

'SomeType m = M();' no es necesariamente más claro. 'm' es un nombre de variable terrible. Si lo cambia a un * buen * nombre de variable, ¿aún necesitará ver el tipo? –

+0

el tipo real debería ser importante bot. Es un detalle de implementación y, en el mejor de los casos, no debe conocerse en la línea var m = M(); el tipo no tiene nada que ver con la legibilidad del código. Sin embargo, el nombre de la variable se repetirá cada vez que se use y se debe elegir cuidadosamente. –

+0

También pensé lo mismo sobre la prueba. Una prueba de unidad que no se compila sigue siendo una prueba. Pero en lo que se refiere a la tipificación implícita, ¿será útil cuando se prueben resultados devueltos (que tienen nombres de variables descriptivos, por supuesto)? ¿O los resultados devueltos deben escribirse explícitamente? – cmw

1

Sí y No

En la actualidad Visual Studio, TDD es un poco de dolor, especialmente cuando se utiliza implícitamente a escribir. var significa que no es inteligente, luego cuando ingresa el nombre de un tipo que puede no existir, tiene tendencia a autocompletarse con algo similar a lo que está escribiendo, a menudo el nombre del accesorio de prueba.

Visual Studio 2010 tiene un consume first mode, lo que lo hace ideal y mejor para el desarrollo impulsado por prueba.Actualmente encontrará (en 2008 y anteriores) que debe pulsar escape para ocultar intellisense.

En cuanto al uso de var es azúcar puramente synatic. Se hace la siguiente mucho mejor en mi opinión:

var type = new MyType(); 

Está claro que el tipo de variable, es de tipo MyType. var es ideal para genéricos y sigue el principio de DRY - No repita.

var type = MethodCall(); 

var result = ReturnResult(); 

Por otro lado, esto hace que sea difícil de leer el código, ya sea que siga TDD o no. Las buenas pruebas unitarias deben fluir y ser fáciles de leer. Si tiene que pensar, o pasar el mouse sobre un método para ver el tipo de devolución, ese es el signo de una prueba mala y difícil de leer.

+0

¿Por qué crees que var type = MethodCall(); es difícil de leer? qué tipo de 'tipo' debería ser generalmente (en mi opinión) no ser importante para leer el código (el nombre de la variable por otro lado debe elegirse para aumentar la legibilidad) –

+0

He agregado otro ejemplo. El resultado puede ser cualquier cosa, una cadena, int, otro objeto, etc. Incluso con un nombre sensato, la confusión puede ocurrir. * var * es increíble, pero es mejor no abusar de él. – Finglas

0

Desde una perspectiva de herramientas, diría que es mejor evitar la var. Uso Eclipse y Java, pero sé que extensiones como CodeRush y Resharper ofrecen muchas de las características que estoy discutiendo aquí. Cuando en mi prueba llamo a un método que aún no existe, puedo "arreglarlo rápidamente" para crear el método en la clase deseada. El tipo de devolución del método creado automáticamente depende de su contexto; si espero volver una Cadena, el tipo de devolución del método será Cadena. Pero si la asignación es a var (que Java no tiene, pero si lo hiciera), el IDE no sabría lo suficiente como para hacer que el tipo de retorno sea distinto de var (o tal vez Object).

No todo el mundo usa el IDE de esta manera en TDD, pero me parece muy útil. Mientras más información pueda darle al IDE en mi prueba, menos mecanografía tengo que hacer para que pase la prueba.

+0

A veces deseo que VS2008 tenga algunas de las características que Eclipse tiene. :-) – cmw

+0

@cmw - mira en CodeRush & Resharper; tienen algunas características que incluso los usuarios de Eclipse pueden envidiar. –