2009-01-05 11 views
12

El código que no se puede ver realmente me molesta. Los siguientes cosas hacen oo-código no comprobable:Señales de advertencia para el código inestable

  • estados globales, por ejemplo, el patrón de diseño Singleton
  • métodos estáticos que alguna fantasía de trabajo por ejemplo, acceso a base de datos
  • árbol de herencia profunda
  • trabajo en el constructor p.ej sentencias de control
  • clases que violan la Responsabilidad Individual Principio

¿Hay más señales de advertencia?

+0

¿Alguno de éstos no huele código? –

Respuesta

6

Dependencias de código fijo.

+0

que no es tan inestable como una falla del desarrollo de TDD en general – annakata

+1

Bueno, TDD es un enfoque de diseño (y desarrollo), pero se puede probar el código sin usar, o incluso me gusta, TDD :) – orip

4
  • no se programa a las interfaces
  • Newing objetos intead de la utilización de las fábricas/COI
+0

No programar en la interfaz es el gran uno en mi opinión. Al poner dependencias detrás de una interfaz interna, se burla de las dependencias externas en sus pruebas. –

11

Ninguna de esas cosas que el código no comprobable. Pueden dificultar la búsqueda de errores en el borde del caso pero, siempre que haya especificado los criterios de éxito para las pruebas (y el desarrollo basado en pruebas lo facilita), todo lo que tiene que hacer es aprobar los criterios.

TDD se puede aplicar al comportamiento de piezas específicas, así como del proyecto en su conjunto, para que pueda probar fácilmente componentes muy pequeños. Pero, está destinado a probar los resultados, no los medios por los cuales se obtuvieron esos resultados.

Siempre que se superen las pruebas, usted ha cumplido con los requisitos. Si hay errores después de eso, este es un problema con las pruebas, no con el código que se está probando (en cuyo caso las pruebas deben modificarse para detectar el problema previamente no previsto).

No debe importar (en términos de entrega de funcionalidad) si hay una instrucción while en uno de sus constructores. Debería preguntarse qué requisitos empresariales así lo exigen. Dudo mucho que su cliente entregue una lista de requisitos que incluya "herencia limitada a 4 niveles". Es muy posible que incluyan una lista de "sin errores" como un requisito, pero tendrá que negociarlos con ese :-).

+0

Aunque puede que no lo hagan inalterable, cosas como los sofisticados métodos estáticos hacen que sea casi imposible simular recursos externos, lo que de nuevo puede causar que las pruebas de la unidad de ejecución tarden más tiempo en ejecutarse. En TDD, las pruebas unitarias no deben tocar los recursos externos. – Erlend

+0

+1, pero para una vista interesante de por qué es malo hacer un "trabajo real" en un constructor, vea una buena publicación de Miško Hevery: http://misko.hevery.com/code-reviewers-guide/flaw-constructor- does-real-work/ – orip

+0

Quizás no sea "no comprobable" pero ciertamente "difícil de probar", lo que a su vez retrasa la entrega. –

1

Trabajo realizado en clases de GUI que no tiene nada que ver con la presentación. La GUI debe estar completamente desacoplada del modelo subyacente.

1

El código no puede modificarse, siempre que no pueda modificarlo. Si tiene la posibilidad de refactorizar el proyecto, ningún código es imposible de verificar. Por lo general, solo se necesitan modificaciones muy pequeñas para facilitar las pruebas. Y pueden justificarse porque aumentan la calidad del código.

Incluso en los casos que describe, el código no es necesariamente no comprobable. Es simplemente más difícil de probar. Por ejemplo, es más fácil probar el código si puede aislar el acceso a la base de datos y evitarlos durante las pruebas de su unidad. Pero si es necesario, puede poner una base de datos dedicada a ejecutar sus pruebas.

1

Yo diría que ninguna de esas cosas hace que el código no sea comprobable.Ellos hacen pruebas de la unidad difícil, porque cada uno de esos aumenta el acoplamiento en su implementación.

Entre otras molestias que hacen que la unidad de pruebas difícil:

  • código de la interfaz gráfica de usuario se mezclaban con el código de lógica de negocio
  • todos los anti-patrones, pero objeto Dios en particular (http://en.wikipedia.org/wiki/God_object)
  • a lo largo de la misma líneas, una gran función también es muy molesto

En general, cualquier recomendación que pueda escuchar sobre la creación de un mejor código también es una recomendación ación para un código de prueba más fácil para la unidad.

0

falta de estratificación, exceso de acoplamiento ... es decir, la clase Y se ha escrito para saber acerca de X, pero no debería, X es reutilizable. Existe una fuerte relación entre la capacidad de prueba y la reutilización.

1

¡Bases de datos! ¡Particularmente aquellos con disparadores!

Sé que puede burlarse de la base de datos, pero siempre he descubierto que la mayoría de los errores en mi código (principalmente aplicaciones CRUD) son problemas de datos/mapeo y si se burla de la base de datos no encuentra ese tipo de error.

1

Miško Hevery's Guide en Writing Testable Code detalla los defectos que hacen que el código sea difícil de probar. Su lista se superpone con la tuya un tanto, pero entra en detalles increíbles.

  • Constructor hace trabajo real
  • de excavación en colaboradores
  • frágil estado global & Singleton
  • clase no demasiado
Cuestiones relacionadas