1594 votes

Cycles de l'arbre de la famille des logiciels

Je suis le développeur de certains arbre de la famille des logiciels (écrit en C++ et Qt). Je n'avais aucun problème jusqu'à ce que l'un de mes clients m'a envoyé un rapport de bug. Le problème, c'est qu'il a deux enfants avec sa propre fille, et, par conséquent, il ne peut pas utiliser mon logiciel en raison des erreurs.

Ces erreurs sont le résultat de mes diverses assertions et les invariants de la famille graphique en cours de traitement (par exemple, après une marche d'un cycle, le programme indique que X ne peut pas être à la fois père et grand-père de Y).

Comment puis-je résoudre ces erreurs, sans suppression de toutes les données affirmations?

727voto

Bert Goethals Points 6095

Il semble que vous (et/ou votre société) ont une méconnaissance profonde de ce qu'est un arbre de la famille est censé être.

Permettez-moi de préciser, j'ai aussi travaillé pour une entreprise qui a (comme l'un de ses produits) un arbre de la famille dans son portefeuille, et nous avons été aux prises avec des problèmes similaires.

Le problème, dans notre cas, et je suppose que votre cas aussi, vient du GEDCOM format est extrêmement opinions sur ce que devrait être une famille. Cependant ce format contient de graves malentendus à propos de ce qu'est un arbre de la famille ressemble vraiment.

GEDCOM a de nombreux problèmes, tels que l'incompatibilité avec les mêmes relations sexuelles, l'inceste, etc... Qui dans la vraie vie arrive plus souvent que vous ne l'imaginez (en particulier lors du retour dans le temps à la 1700-1800).

Nous avons modélisé notre arbre généalogique à ce qui se passe dans le monde réel: les Événements (par exemple, les naissances, les mariages, les fiançailles, les syndicats, les décès, les adoptions, etc.). Nous n'avons pas mis toutes les restrictions sur ces, sauf pour logiquement impossible (par exemple, on ne peut pas être son propre parent, les relations ont besoin de deux individus, etc...)

Le manque de validations nous donne plus de "monde réel", plus simple et plus souple de la solution.

Comme pour ce cas précis, je voudrais proposer la suppression de la assertions car ils ne tiennent pas universellement.

Pour l'affichage des questions (qui va se poser) je suggère de dessiner le même nœud autant de fois que nécessaire, faisant allusion à la duplication en éclairant toutes les copies sur la sélection de l'un d'eux.

563voto

Ben Voigt Points 151460

Détendez-vous vos affirmations.

Non pas en changeant les règles, dont la plupart sont sans doute très utile à 99,9% de vos clients dans la capture des erreurs dans la saisie de leurs données.

Au lieu de cela, le modifier à partir d'un message d'erreur "ne peut pas ajouter une relation" à un message d'avertissement avec un "de toute façon".

224voto

exDM69 Points 1801

Voici le problème avec les arbres de famille: ils ne sont pas des arbres. Ils sont dirigés acycliques, de graphiques ou de DAGs. Si je comprends les principes de la biologie de la reproduction humaine correctement, il n'y aura pas de cycles.

Autant que je sache, même les Chrétiens acceptent les mariages (et donc des enfants) entre cousins, qui fera tourner l'arbre de la famille dans une famille DAG.

La morale de l'histoire est: choisissez les bonnes structures de données.

115voto

Eduard Thamm Points 884

Je suppose que vous avez une certaine valeur qui identifie de manière unique une personne sur laquelle vous pouvez baser vos chèques.

C'est une question délicate. En supposant que vous souhaitez conserver la structure d'un arbre, je suggère ceci:

Supposons ceci: A a des enfants avec sa propre fille.

A ajoute de lui-même pour le programme en tant que A et B. Une fois dans le rôle du père, nous allons l'appeler ami.

Ajouter un is_same_for_out() fonction qui indique la sortie de générer une partie de votre programme que tous les liens d' B en interne devrait aller en A sur présentation de données.

Cela permettra de faire un travail supplémentaire pour l'utilisateur, mais je crois qu'IL serait relativement facile à mettre en œuvre et à maintenir.

Bâtiment de cela, vous pourriez travailler sur le code de la synchronisation A et B pour éviter les incohérences.

Cette solution n'est sûrement pas parfait, mais c'est une première approche.

84voto

christopheml Points 1880

Vous devriez vous concentrer sur ce qui fait vraiment la valeur de votre logiciel. Est le temps passé sur le fait de travailler pour UN consommateur, vaut le prix de la licence ? Probablement pas.

Je vous conseille de m'excuser auprès de ce client, de lui dire que sa situation est hors de portée de votre logiciel et de lui délivrer un remboursement.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X