Domanda Cicli nel software dell'albero genealogico


Sono lo sviluppatore di alcuni software per alberi genealogici (scritti in C ++ e Qt). Non ho avuto problemi fino a quando uno dei miei clienti mi ha inviato un bug report. Il problema è che il cliente ha due figli con la propria figlia e, di conseguenza, non può utilizzare il mio software a causa di errori.

Questi errori sono il risultato delle mie varie affermazioni e invarianti sul grafico della famiglia elaborato (per esempio, dopo aver camminato su un ciclo, il programma afferma che X non può essere padre e nonno di Y).

Come posso risolvere questi errori senza rimuovere tutte le asserzioni di dati?


1594
2018-05-28 18:39


origine


risposte:


Sembra che tu (e / o la tua azienda) abbia un malinteso fondamentale su cosa dovrebbe essere un albero genealogico.

Permettetemi di chiarire, lavoro anche per un'azienda che ha (come uno dei suoi prodotti) un albero genealogico nel suo portafoglio e abbiamo avuto problemi simili.

Il problema, nel nostro caso, e presumo il tuo caso, deriva dal GEDCOM formato che è estremamente supponente su ciò che dovrebbe essere una famiglia. Tuttavia questo formato contiene alcuni malintesi su come sia davvero un albero genealogico.

GEDCOM ha molti problemi, come l'incompatibilità con le relazioni omosessuali, l'incesto, ecc. Che nella vita reale accade più spesso di quanto si possa immaginare (specialmente quando si torna indietro nel tempo al 1700-1800).

Abbiamo modellato il nostro albero genealogico su ciò che accade nel mondo reale: eventi (ad esempio, nascite, matrimoni, fidanzamenti, unioni, decessi, adozioni, ecc.). Non poniamo alcuna restrizione su questi, ad eccezione di quelli logicamente impossibili (ad esempio, uno non può essere il genitore di uno, le relazioni hanno bisogno di due individui, ecc ...)

La mancanza di convalide ci dà una soluzione più "reale", più semplice e più flessibile.

Per quanto riguarda questo caso specifico, suggerirei di rimuovere le asserzioni perché non sono universalmente valide.

Per visualizzare i problemi (che si presenteranno) suggerirei di disegnare lo stesso nodo quante volte necessario, suggerendo la duplicazione accendendo tutte le copie selezionando una di esse.


727
2018-06-01 08:25



Rilassa le tue affermazioni.

Non cambiando le regole, che sono per lo più molto utili al 99,9% dei tuoi clienti nel prendere errori nell'inserire i loro dati.

Invece, cambiarlo da un errore "non può aggiungere una relazione" ad un avvertimento con un "aggiungi comunque".


564
2018-05-28 19:20



Ecco il problema con gli alberi genealogici: non sono alberi. Sono diretti grafici aciclici o DAG. Se capisco correttamente i principi della biologia della riproduzione umana, non ci saranno cicli.

Per quanto ne so, anche i cristiani accettano matrimoni (e quindi bambini) tra cugini, che trasformeranno l'albero genealogico in un DAG di famiglia.

La morale della storia è: scegliere le giuste strutture dati.


224
2018-06-01 09:58



Immagino che tu abbia un valore che identifica in modo univoco una persona su cui puoi basare i tuoi assegni.

Questo è difficile. Supponendo di voler mantenere la struttura un albero, suggerisco questo:

Supponi questo: A ha figli con sua figlia.

A si aggiunge al programma come A e come B. Una volta nel ruolo di padre, chiamiamolo fidanzato.

Aggiungere un is_same_for_out() funzione che dice all'output che genera parte del tuo programma che tutti i link vanno a B internamente dovrebbe andare A sulla presentazione dei dati.

Questo renderà un lavoro extra per l'utente, ma suppongo che IT sia relativamente facile da implementare e mantenere.

Basandoti su questo, potresti lavorare sulla sincronizzazione del codice A e B per evitare incongruenze.

Questa soluzione non è sicuramente perfetta, ma è un primo approccio.


115
2018-05-28 18:50



Dovresti concentrarti su ciò che rende davvero un valore per il tuo software. Il tempo impiegato per farlo funzionare per UNO consumatore vale il prezzo della licenza? Probabilmente no.

Ti consiglio di scusarti con questo cliente, di dirgli che la sua situazione non rientra nel campo di applicazione del tuo software e gli fornirà un rimborso.


84
2018-06-01 08:51



Dovresti aver impostato il Atreides famiglia (sia moderna, Dunao antico Edipo re) come un caso di prova. Non trovi bug utilizzando dati disinfettati come test case.


79
2018-06-01 16:10



Questo è uno dei motivi per cui lingue come "Go" non hanno asserzioni. Sono usati per gestire casi a cui probabilmente non hai pensato, troppo spesso. Dovresti solo affermare l'impossibile, non semplicemente l'improbabile. Fare ciò è ciò che dà una cattiva reputazione alle affermazioni. Ogni volta che digiti assert(, cammina per dieci minuti e veramente pensaci.

Nel tuo caso particolarmente inquietante, è al contempo concepibile e terrificante che tale affermazione sarebbe falsa in rare ma possibili circostanze. Quindi gestiscilo nella tua app, se non altro per dire "Questo software non è stato progettato per gestire lo scenario che hai presentato".

Affermare che il tuo grande, grande, grande, nonno è tuo padre come impossibile è una cosa ragionevole da fare.

Se lavorassi per una compagnia di test che è stata assunta per testare il tuo software, ovviamente avrei presentato quello scenario. Perché? Sta andando a fare ogni "utente" giovanile e intelligente la stessa identica cosa e assaporare nella risultante "segnalazione di bug".


59
2018-06-01 06:10



Odio commentare una situazione così rovinata, ma il modo più semplice per non riscrivere tutti i tuoi invarianti è creare un vertice fantasma nel tuo grafico che funga da proxy per il padre incestuoso.


41
2018-05-28 18:55