Behauptungen überleben die Realität nicht
Normalerweise überleben Behauptungen den Kontakt mit Daten aus der realen Welt nicht. Es ist Teil des Software-Engineering-Prozesses, zu entscheiden, mit welchen Daten Sie sich befassen möchten und welche nicht.
Zyklische Familiendiagramme
In Bezug auf Stammbäume (tatsächlich handelt es sich um vollständige Diagramme, einschließlich Zyklen) gibt es eine schöne Anekdote:
Ich heiratete eine Witwe, die eine erwachsene Tochter hatte. Mein Vater, der uns oft besuchte, verliebte sich in meine Stieftochter und heiratete sie. Infolgedessen wurde mein Vater mein Sohn und meine Tochter meine Mutter. Einige Zeit später gab ich meiner Frau einen Sohn, der der Bruder meines Vaters war, und meines Onkels. Die Frau meines Vaters (die auch meine Tochter und meine Mutter ist) hat einen Sohn. Infolgedessen bekam ich einen Bruder und einen Enkel in derselben Person. Meine Frau ist jetzt meine Großmutter, weil sie die Mutter meiner Mutter ist. Ich bin also der Ehemann meiner Frau und gleichzeitig der Stiefenkel meiner Frau. Mit anderen Worten, ich bin mein eigener Opa.
Noch seltsamer wird es, wenn man Leihmütter oder "Fuzzy Fatherhood" berücksichtigt.
Wie gehe ich damit um?
Definieren Sie Zyklen als außerhalb des Gültigkeitsbereichs
Sie könnten entscheiden, dass Ihre Software solche seltenen Fälle nicht behandeln soll. In diesem Fall sollte der Benutzer ein anderes Produkt verwenden. Dies macht den Umgang mit den häufigeren Fällen viel robuster, da Sie mehr Aussagen und ein einfacheres Datenmodell beibehalten können.
Fügen Sie in diesem Fall Ihrer Software einige gute Import- und Exportfunktionen hinzu, damit der Benutzer bei Bedarf problemlos auf ein anderes Produkt migrieren kann.
Manuelle Beziehungen zulassen
Sie können dem Benutzer erlauben, manuelle Beziehungen hinzuzufügen. Diese Beziehungen sind keine "erstklassigen Bürger", dh die Software nimmt sie unverändert, überprüft sie nicht und behandelt sie nicht im Hauptdatenmodell.
Der Benutzer kann dann seltene Fälle von Hand bearbeiten. Ihr Datenmodell bleibt weiterhin recht einfach und Ihre Behauptungen bleiben erhalten.
Seien Sie vorsichtig mit manuellen Beziehungen. Es besteht die Versuchung, sie vollständig konfigurierbar zu machen und somit ein vollständig konfigurierbares Datenmodell zu erstellen. Dies wird nicht funktionieren: Ihre Software wird nicht skaliert, Sie werden seltsame Fehler bekommen und schließlich wird die Benutzeroberfläche unbrauchbar. Dieses Anti-Pattern wird "Soft Coding" genannt , und "The Daily WTF" ist voller Beispiele dafür.
Machen Sie Ihr Datenmodell flexibler, überspringen Sie Zusicherungen und testen Sie Invarianten
Der letzte Ausweg wäre, Ihr Datenmodell flexibler zu gestalten. Sie müssten fast alle Aussagen überspringen und Ihr Datenmodell auf einem vollständigen Diagramm basieren. Wie das obige Beispiel zeigt, ist es leicht möglich, Ihr eigener Großvater zu sein, sodass Sie sogar Zyklen haben können.
In diesem Fall sollten Sie Ihre Software ausführlich testen. Sie mussten fast alle Behauptungen überspringen, daher besteht eine gute Chance für zusätzliche Fehler.
Verwenden Sie einen Testdatengenerator, um ungewöhnliche Testfälle zu überprüfen. Es gibt schnelle Überprüfung Bibliotheken für Haskell , Erlang oder C . Für Java / Scala gibt es ScalaCheck und Nyaya . Eine Testidee wäre, eine zufällige Population zu simulieren, sie zufällig kreuzen zu lassen und dann Ihre Software zuerst das Ergebnis importieren und dann exportieren zu lassen. Die Erwartung wäre, dass alle Verbindungen im Ausgang auch im Eingang sind und umgekehrt.
Ein Fall, in dem eine Eigenschaft gleich bleibt, wird als Invariante bezeichnet. In diesem Fall ist die Invariante die Menge der "romantischen Beziehungen" zwischen den Individuen in der simulierten Population. Versuchen Sie, so viele Invarianten wie möglich zu finden und testen Sie sie mit zufällig generierten Daten. Invarianten können funktional sein, z.
- Ein Onkel bleibt ein Onkel, auch wenn Sie mehr "romantische Beziehungen" hinzufügen.
- Jedes Kind hat einen Elternteil
- Eine Bevölkerung mit zwei Generationen hat mindestens einen Großelternteil
Oder sie können technisch sein:
- Ihre Software stürzt in einem Diagramm mit bis zu 10 Milliarden Mitgliedern nicht ab (unabhängig von der Anzahl der Verbindungen).
- Ihre Software skaliert mit O (Anzahl der Knoten) und O (Anzahl der Kanten ^ 2).
- Ihre Software kann jedes Familiendiagramm mit bis zu 10 Milliarden Mitgliedern speichern und neu laden
Wenn Sie die simulierten Tests ausführen, werden Sie viele seltsame Eckfälle finden. Das Reparieren wird viel Zeit in Anspruch nehmen. Außerdem verlieren Sie viele Optimierungen, Ihre Software läuft viel langsamer. Sie müssen entscheiden, ob es sich lohnt und ob dies im Rahmen Ihrer Software liegt.