Le asserzioni non sopravvivono alla realtà
Di solito le affermazioni non sopravvivono al contatto con i dati del mondo reale. Fa parte del processo di ingegneria del software decidere, con quali dati si desidera trattare e quali non rientrano nell'ambito.
Grafici familiari ciclici
Per quanto riguarda gli "alberi" familiari (in realtà sono grafici completi, inclusi i cicli), c'è un bel aneddoto:
Ho sposato una vedova che aveva una figlia adulta. Mio padre, che ci visitava spesso, si innamorò della mia figliastra e la sposò. Di conseguenza, mio padre divenne mio figlio e mia figlia divenne mia madre. Qualche tempo dopo, ho dato a mia moglie un figlio, che era il fratello di mio padre, e mio zio. La moglie di mio padre (che è anche mia figlia e mia madre) ha un figlio. Di conseguenza, ho avuto un fratello e un nipote nella stessa persona. Mia moglie ora è mia nonna, perché è la madre di mia madre. Quindi sono il marito di mia moglie e allo stesso tempo il nipote di mia moglie. In altre parole, sono mio nonno.
Le cose diventano ancora più strane quando prendi i surrogati o "paternità sfocata".
Come affrontarlo
Definire i cicli come fuori campo
Potresti decidere che il tuo software non dovrebbe affrontare casi così rari. In tal caso, l'utente dovrebbe utilizzare un prodotto diverso. Ciò rende la gestione dei casi più comuni molto più solida, poiché è possibile mantenere più asserzioni e un modello di dati più semplice.
In questo caso, aggiungi alcune buone funzionalità di importazione ed esportazione al tuo software, in modo che l'utente possa migrare facilmente su un prodotto diverso quando necessario.
Consenti relazioni manuali
È possibile consentire all'utente di aggiungere relazioni manuali. Queste relazioni non sono "cittadini di prima classe", ovvero il software li prende così come sono, non li controlla e non li gestisce nel modello di dati principale.
L'utente può quindi gestire casi rari a mano. Il tuo modello di dati rimarrà abbastanza semplice e le tue affermazioni sopravviveranno.
Fai attenzione alle relazioni manuali. C'è la tentazione di renderli completamente configurabili e quindi creare un modello di dati completamente configurabile. Questo non funzionerà: il tuo software non si ridimensionerà, otterrai strani bug e infine l'interfaccia utente diventerà inutilizzabile. Questo anti-pattern è chiamato "soft coding" , e "Il WTF quotidiano" è pieno di esempi per questo.
Rendi il tuo modello di dati più flessibile, salta asserzioni, verifica invarianti
L'ultima risorsa sarebbe rendere il tuo modello di dati più flessibile. Dovresti saltare quasi tutte le asserzioni e basare il tuo modello di dati su un grafico completo. Come mostra l'esempio sopra, è facilmente possibile essere tuo nonno, quindi puoi anche avere dei cicli.
In questo caso, è necessario testare ampiamente il software. Hai dovuto saltare quasi tutte le asserzioni, quindi ci sono buone possibilità di ulteriori bug.
Utilizzare un generatore di dati di test per verificare casi di test insoliti. Ci sono biblioteche di controllo rapido per Haskell , Erlang o C . Per Java / Scala ci sono ScalaCheck e Nyaya . Un'idea di prova sarebbe quella di simulare una popolazione casuale, lasciarla incrociare a caso, quindi prima importare il software e quindi esportare il risultato. L'aspettativa sarebbe che tutte le connessioni nell'output siano anche nell'input e viceversa.
Un caso in cui una proprietà rimane invariata viene chiamato invariante. In questo caso, l'invariante è l'insieme di "relazioni romantiche" tra gli individui nella popolazione simulata. Prova a trovare il maggior numero possibile di invarianti e testali con dati generati casualmente. Gli invarianti possono essere funzionali, ad esempio:
- uno zio rimane zio, anche quando aggiungi più "relazioni romantiche"
- ogni bambino ha un genitore
- una popolazione con due generazioni ha almeno un nonno
Oppure possono essere tecnici:
- Il tuo software non andrà in crash su un grafico fino a 10 miliardi di membri (indipendentemente da quante interconnessioni)
- Il software si ridimensiona con O (numero di nodi) e O (numero di bordi ^ 2)
- Il tuo software può salvare e ricaricare ogni grafico familiare fino a 10 miliardi di membri
Eseguendo i test simulati, troverai molti casi angolari strani. La loro riparazione richiederà molto tempo. Inoltre perderai molte ottimizzazioni, il tuo software funzionerà molto più lentamente. Devi decidere se ne vale la pena e se questo rientra nell'ambito del tuo software.