我是一些家谱软件(用C++和Qt编写)的开发人员。直到我的一位客户给我邮寄了一份错误报告,我才发现问题。问题是,客户有两个孩子和自己的女儿,因此,由于错误,他无法使用我的软件。

这些错误是我对正在处理的族图的各种断言和不变量的结果(例如,在走完一个循环后,程序声明X不能既是Y的父亲又是Y的祖父)。

如何在不删除所有数据断言的情况下解决这些错误?


当前回答

放松你的断言。

而不是改变规则,这可能对99.9%的客户在输入数据时发现错误非常有帮助。

相反,将其从错误“无法添加关系”更改为警告“无论如何添加”。

其他回答

复制父项(或使用符号链接/引用)。

例如,如果您使用的是分层数据库:

$ #each person node has two nodes representing its parents.
$ mkdir Family
$ mkdir Family/Son
$ mkdir Family/Son/Daughter
$ mkdir Family/Son/Father
$ mkdir Family/Son/Daughter/Father
$ ln -s Family/Son/Daughter/Father Family/Son/Father
$ mkdir Family/Son/Daughter/Wife
$ tree Family
Family
└── Son
    ├── Daughter
    │   ├── Father
    │   └── Wife
    └── Father -> Family/Son/Daughter/Father

4 directories, 1 file

一些答案显示了保持断言/不变量的方法,但这似乎是滥用断言/不变量。断言是为了确保应该是真的东西是真的,不变量是为了确保不应该改变的东西不会改变。

你在这里断言的是乱伦关系是不存在的。显然它们确实存在,因此您的断言是无效的。您可以解决这个断言,但真正的错误在于断言本身。应删除断言。

家谱数据是循环的,不适合于非循环图,所以如果你有针对循环的断言,你应该删除它们。

在不创建自定义视图的情况下在视图中处理此问题的方法是将循环父对象视为“幽灵”父对象。换句话说,当一个人同时是同一个人的父亲和祖父时,祖父节点正常显示,但父亲节点被渲染为“幽灵”节点,该节点具有简单的标签(如“看见祖父”)并指向祖父。

为了进行计算,您可能需要改进处理循环图的逻辑,以便在存在循环的情况下不会多次访问节点。

撇开潜在的法律影响不谈,你显然需要将家谱上的“节点”视为前任,而不是假设节点可以是唯一的人。

让树节点包含一个人以及继任者,然后可以在树的更深处创建另一个节点,该节点包含同一个人和不同的继任者。

你应该把Atreides家族(现代的Dune,或古代的Oedipus Rex)作为一个测试案例。通过使用经过净化的数据作为测试用例,您不会发现错误。