我是一些家谱软件(用C++和Qt编写)的开发人员。直到我的一位客户给我邮寄了一份错误报告,我才发现问题。问题是,客户有两个孩子和自己的女儿,因此,由于错误,他无法使用我的软件。
这些错误是我对正在处理的族图的各种断言和不变量的结果(例如,在走完一个循环后,程序声明X不能既是Y的父亲又是Y的祖父)。
如何在不删除所有数据断言的情况下解决这些错误?
我是一些家谱软件(用C++和Qt编写)的开发人员。直到我的一位客户给我邮寄了一份错误报告,我才发现问题。问题是,客户有两个孩子和自己的女儿,因此,由于错误,他无法使用我的软件。
这些错误是我对正在处理的族图的各种断言和不变量的结果(例如,在走完一个循环后,程序声明X不能既是Y的父亲又是Y的祖父)。
如何在不删除所有数据断言的情况下解决这些错误?
当前回答
对一个愚蠢问题的另一个假装严肃的回答:
真正的答案是,使用适当的数据结构。人类谱系不能用没有循环的纯树来完全表达。你应该使用某种图表。此外,在进一步讨论之前,请与人类学家交谈,因为在其他许多地方,试图建立家谱模型可能会犯类似的错误,即使是在最简单的“西方父权一夫一妻制婚姻”的情况下
即使我们想忽略这里所讨论的当地禁忌关系,也有很多完全合法和完全意想不到的方法将循环引入家谱。
例如:http://en.wikipedia.org/wiki/Cousin_marriage
基本上,近亲结婚不仅是普遍的和意料之中的,也是人类从数千个小家庭群体发展到全球60亿人口的原因。它不能以任何其他方式工作。
在家谱、家族和血统方面,真的很少有普遍性。几乎任何关于姨妈可以是谁,谁可以嫁给谁,或者孩子如何合法继承的规范的严格假设,都可能被世界或历史上的某个地方的某些例外所打乱。
其他回答
你应该关注真正为你的软件创造价值的东西。为一个消费者提供服务所花费的时间是否值得许可证的价格?可能不会。
我建议您向这位客户道歉,告诉他他的情况超出了您的软件范围,并向他退款。
一些答案显示了保持断言/不变量的方法,但这似乎是滥用断言/不变量。断言是为了确保应该是真的东西是真的,不变量是为了确保不应该改变的东西不会改变。
你在这里断言的是乱伦关系是不存在的。显然它们确实存在,因此您的断言是无效的。您可以解决这个断言,但真正的错误在于断言本身。应删除断言。
复制父项(或使用符号链接/引用)。
例如,如果您使用的是分层数据库:
$ #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
不要删除所有断言,您仍然应该检查诸如某人是自己的父母或其他不可能的情况,并提出错误。如果不太可能的话,可能会发出警告,这样用户仍然可以检测到常见的输入错误,但如果一切都正确的话,它会起作用。
我会将数据存储在一个向量中,每个人都有一个永久整数,并将父母和孩子存储在个人对象中,其中所述int是向量的索引。这在几代人之间会很快(但在名字搜索等方面会很慢)。对象将按创建时的顺序排列。
撇开潜在的法律影响不谈,你显然需要将家谱上的“节点”视为前任,而不是假设节点可以是唯一的人。
让树节点包含一个人以及继任者,然后可以在树的更深处创建另一个节点,该节点包含同一个人和不同的继任者。