Vraag Cycli in stamboom-software


Ik ben de ontwikkelaar van een aantal stamboomsoftware (geschreven in C ++ en Qt). Ik had geen problemen totdat een van mijn klanten me een bugrapport stuurde. Het probleem is dat de klant twee kinderen heeft met hun eigen dochter en dat hij als gevolg daarvan mijn software niet kan gebruiken vanwege fouten.

Die fouten zijn het resultaat van mijn verschillende beweringen en invarianten over de familiegrafiek die wordt verwerkt (bijvoorbeeld, na het lopen van een cyclus, stelt het programma dat X niet zowel vader als grootvader van Y kan zijn).

Hoe kan ik die fouten oplossen zonder alle gegevensverklaringen te verwijderen?


1594
2018-05-28 18:39


oorsprong


antwoorden:


Het lijkt erop dat u (en / of uw bedrijf) een fundamenteel misverstand hebt over wat een stamboom zou moeten zijn.

Laat me verduidelijken, ik werk ook voor een bedrijf dat (als een van zijn producten) een stamboom heeft in zijn portefeuille en we hebben met soortgelijke problemen te kampen gehad.

Het probleem, in ons geval, en ik neem aan dat ook uw geval, komt van de GEDCOM formaat dat uitermate eigenzinnig is over wat een gezin zou moeten zijn. Dit formaat bevat echter enkele ernstige misvattingen over hoe een stamboom er precies uitziet.

GEDCOM heeft veel problemen, zoals onverenigbaarheid met homoseksuele relaties, incest, enz ... Wat in het echte leven vaker gebeurt dan je zou denken (vooral wanneer je teruggaat in de tijd naar 1700-1800).

We hebben onze stamboom gemodelleerd naar wat er in de echte wereld gebeurt: gebeurtenissen (bijvoorbeeld geboorten, bruiloften, engagement, vakbonden, sterfgevallen, adopties, enz.). We leggen hier geen beperkingen aan, behalve voor logisch onmogelijke (bijvoorbeeld: je kunt niet de eigen ouder zijn, relaties hebben twee personen, enz ...)

Het gebrek aan validaties geeft ons een meer "echte wereld", eenvoudiger en flexibeler oplossing.

Wat betreft dit specifieke geval, zou ik voorstellen om de beweringen te verwijderen omdat ze niet universeel gelden.

Voor het weergeven van problemen (die zich voordoen), raad ik aan om zoveel knooppunten te tekenen als nodig is, waarbij wordt gesuggereerd dat de kopieën dupliceren door een kopie te maken.


727
2018-06-01 08:25



Ontspan je beweringen.

Niet door de regels te veranderen, die waarschijnlijk zeer nuttig zijn voor 99,9% van uw klanten om fouten te maken bij het invoeren van hun gegevens.

In plaats daarvan, verander het van een fout "kan geen relatie toevoegen" aan een waarschuwing met een "add anyway".


564
2018-05-28 19:20



Dit is het probleem met stambomen: het zijn geen bomen. Het zijn gerichte acyclische grafieken of DAG's. Als ik de principes van de biologie van menselijke voortplanting goed begrijp, zullen er geen cycli zijn.

Voor zover ik weet, accepteren zelfs de christenen huwelijken (en dus kinderen) tussen neven en nichten, waardoor de stamboom verandert in een familie-DAG.

De moraal van het verhaal is: kies de juiste datastructuren.


224
2018-06-01 09:58



Ik veronderstel dat u een waarde heeft die een persoon identificeert waarop u uw cheques kunt baseren.

Dit is een lastige. Ervan uitgaande dat je de structuur een boom wilt houden, stel ik dit voor:

Veronderstel dit: A heeft kinderen met zijn eigen dochter.

A voegt zichzelf toe aan het programma als A en als B. Eens in de rol van vader, laten we het vriendje noemen.

Voeg een ... toe is_same_for_out() functie die het uitgangsgenererende deel van uw programma vertelt waarnaar alle koppelingen naartoe gaan B zou intern moeten gaan A op vertoon van gegevens.

Dit zal wat extra werk voor de gebruiker betekenen, maar ik denk dat IT relatief eenvoudig te implementeren en te onderhouden is.

Daarop voortbouwend, zou je kunnen werken aan code-synchronisatie A en B om inconsistenties te voorkomen.

Deze oplossing is zeker niet perfect, maar is een eerste benadering.


115
2018-05-28 18:50



Je moet je concentreren op wat echt waarde maakt voor je software. Is de tijd besteed aan het maken van het werk voor een consument de prijs van de licentie waard? Waarschijnlijk niet.

Ik adviseer u om uw excuses aan te bieden aan deze klant, hem te vertellen dat zijn situatie buiten het bereik van uw software valt en hem een ​​terugbetaling te geven.


84
2018-06-01 08:51



U zou het moeten hebben ingesteld Atreides familie (modern, Duinof oud, Oedipus Rex) als een testcase. U vindt geen fouten door ge-hygiëniseerde gegevens te gebruiken als een testcase.


79
2018-06-01 16:10



Dit is een van de redenen waarom talen zoals "Go" geen beweringen hebben. Ze worden gebruikt om zaken te behandelen waar je waarschijnlijk niet zo vaak aan hebt gedacht. Je moet alleen het onmogelijke beweren, niet alleen het onwaarschijnlijke. Doet het laatste is wat beweringen een slechte reputatie geeft. Elke keer dat je typt assert(, loop tien minuten weg en werkelijk denk er over na.

In uw bijzonder verontrustende geval is het zowel voorstelbaar als afschuwelijk dat een dergelijke bewering nep zou zijn onder zeldzame maar mogelijke omstandigheden. Behandel het daarom in uw app, al was het maar om te zeggen: "Deze software was niet ontworpen om het scenario dat u presenteerde af te handelen".

Beweren dat je betovergrootvader je vader is als onmogelijk, is een redelijk iets om te doen.

Als ik werkte voor een testbedrijf dat was ingehuurd om je software te testen, had ik dat scenario natuurlijk gepresenteerd. Waarom? Elke jeugdige maar toch intelligente 'gebruiker' gaat het doen precies hetzelfde en geniet van het resulterende 'bugrapport'.


59
2018-06-01 06:10