家族树软件中的循环问题
家族树软件中的循环问题
技术背景
在家族树软件的开发中,传统认为家族树是树状结构,但实际上它往往是有向无环图(DAG)。这是因为在现实生活中,存在表亲结婚等情况,会使家族树产生循环。同时,GEDCOM 格式在定义家族关系方面存在局限性,不兼容同性关系、乱伦关系等,而这些情况在现实中对于追溯更久远的家族历史可能会出现。
实现步骤
数据结构选择
选择合适的数据结构至关重要,通常图结构比树结构更适合处理家族树中的循环问题。例如使用有向图,可以避免因循环带来的困扰。
循环检测与处理
在加载数据时,采用标记祖先路径的方法检测循环。对于遍历到的个体,标记其到每个祖先的路径。若新路径包含当前路径作为子路径,则为循环,可将该边标记为“弱”边,而非真正断开连接。
显示处理
当遇到循环时,可将循环中的父节点视为“幽灵”节点。例如,当一个人既是另一个人的父亲又是祖父时,祖父节点正常显示,父亲节点则显示为“幽灵”节点,标注“见祖父”并指向祖父节点。
软件功能决策
- 定义循环为超出范围:决定软件不处理罕见的循环情况。当出现此类情况时,提示用户使用其他产品,并添加良好的导入和导出功能。
- 允许手动关系:允许用户添加手动关系,软件不检查这些关系,但要避免过度配置导致“软编码”问题。
- 使数据模型更灵活:采用完整的图结构,允许存在循环,但要广泛测试软件,使用测试数据生成器检查异常测试用例,并找出尽可能多的不变量进行测试。
核心代码
以下是使用Python模拟检测循环和标记边为“弱”边的示例代码:
1 |
|
最佳实践
- 建立合适的身份识别机制,用于唯一标识每个人,作为检查的基础。
- 提供测试用例,如Atreides家族数据,以帮助发现软件中的潜在问题。
- 广泛测试软件,使用测试数据生成器进行异常测试,找出并验证尽可能多的不变量。
常见问题
断言的使用误区
断言通常用于确保应该为真的事情为真,但如果在家族树软件中过度使用断言限制某些关系(如断言乱伦关系不存在),则可能导致软件无法处理现实中可能出现的情况,应将不合理的断言移除,将错误提示改为警告,并提供“仍然添加”的选项。
数据结构不合理
树结构可能无法很好地处理家族树中的循环问题,使用图结构可以避免此类问题。但在选择图结构后,还需要考虑算法的复杂度和数据存储的效率问题。
显示问题
当存在循环时,简单的图形化显示可能会造成混乱。可以采用上述“幽灵”节点的显示方法,但需要注意用户体验,确保用户能够清晰理解家族关系。
家族树软件中的循环问题
https://119291.xyz/posts/family-tree-software-cycle-problem/