Las afirmaciones no sobreviven a la realidad
Por lo general, las afirmaciones no sobreviven al contacto con datos del mundo real. Es una parte del proceso de ingeniería de software decidir, con qué datos desea tratar y cuáles están fuera del alcance.
Gráficos familiares cíclicos
Con respecto a los "árboles" familiares (de hecho, son gráficos completos, incluidos los ciclos), hay una bonita anécdota:
Me casé con una viuda que tenía una hija adulta. Mi padre, que a menudo nos visitaba, se enamoró de mi hijastra y se casó con ella. Como resultado, mi padre se convirtió en mi hijo y mi hija se convirtió en mi madre. Algún tiempo después, le di a mi esposa un hijo, hermano de mi padre, y mi tío. La esposa de mi padre (que también es mi hija y mi madre) tuvo un hijo. Como resultado, obtuve un hermano y un nieto en la misma persona. Mi esposa ahora es mi abuela, porque ella es la madre de mi madre. Así que soy el esposo de mi esposa y, al mismo tiempo, el nieto de mi esposa. En otras palabras, soy mi propio abuelo.
Las cosas se ponen aún más extrañas cuando tomas en cuenta a los sustitutos o la "paternidad difusa".
Cómo lidiar con eso
Definir ciclos como fuera de alcance
Podrías decidir que tu software no debería tratar casos tan raros. Si ocurre tal caso, el usuario debe usar un producto diferente. Esto hace que lidiar con los casos más comunes sea mucho más robusto, porque puede mantener más afirmaciones y un modelo de datos más simple.
En este caso, agregue algunas buenas características de importación y exportación a su software, para que el usuario pueda migrar fácilmente a un producto diferente cuando sea necesario.
Permitir relaciones manuales
Podría permitir al usuario agregar relaciones manuales. Estas relaciones no son "ciudadanos de primera clase", es decir, el software los toma tal cual, no los verifica y no los maneja en el modelo de datos principal.
El usuario puede manejar casos raros a mano. Su modelo de datos seguirá siendo bastante simple y sus afirmaciones sobrevivirán.
Tenga cuidado con las relaciones manuales. Existe la tentación de hacerlos completamente configurables y, por lo tanto, crear un modelo de datos totalmente configurable. Esto no funcionará: su software no escalará, obtendrá errores extraños y finalmente la interfaz de usuario quedará inutilizable. Este antipatrón se llama "codificación suave" , y "El WTF diario" está lleno de ejemplos para eso.
Haga que su modelo de datos sea más flexible, omita aserciones, pruebe invariantes
El último recurso sería hacer que su modelo de datos sea más flexible. Tendría que omitir casi todas las afirmaciones y basar su modelo de datos en un gráfico completo. Como muestra el ejemplo anterior, es fácilmente posible ser su propio abuelo, por lo que incluso puede tener ciclos.
En este caso, debe probar exhaustivamente su software. Debes omitir casi todas las afirmaciones, por lo que hay una buena posibilidad de errores adicionales.
Use un generador de datos de prueba para verificar casos de prueba inusuales. Hay bibliotecas rápidos del cheque para Haskell , Erlang o C . Para Java / Scala hay ScalaCheck y Nyaya . Una idea de prueba sería simular una población aleatoria, dejar que se entrecrucen al azar, luego dejar que su software primero importe y luego exporte el resultado. La expectativa sería que todas las conexiones en la salida también están en la entrada y viceversa.
Un caso en el que una propiedad permanece igual se llama invariante. En este caso, el invariante es el conjunto de "relaciones románticas" entre los individuos en la población simulada. Trate de encontrar tantos invariantes como sea posible y pruébelos con datos generados aleatoriamente. Las invariantes pueden ser funcionales, por ejemplo:
- un tío sigue siendo tío, incluso cuando agrega más "relaciones románticas"
- cada niño tiene un padre
- una población con dos generaciones tiene al menos un abuelo
O pueden ser técnicos:
- Su software no se bloqueará en un gráfico de hasta 10 mil millones de miembros (no importa cuántas interconexiones)
- Su software escala con O (número de nodos) y O (número de bordes ^ 2)
- Su software puede guardar y volver a cargar cada gráfico familiar hasta 10 mil millones de miembros
Al ejecutar las pruebas simuladas, encontrará muchos casos extraños de esquina. Arreglarlos llevará mucho tiempo. También perderá muchas optimizaciones, su software funcionará mucho más lento. Tienes que decidir si vale la pena y si esto está dentro del alcance de tu software.