我是一些家谱软件(用C++和Qt编写)的开发人员。直到我的一位客户给我邮寄了一份错误报告,我才发现问题。问题是,客户有两个孩子和自己的女儿,因此,由于错误,他无法使用我的软件。
这些错误是我对正在处理的族图的各种断言和不变量的结果(例如,在走完一个循环后,程序声明X不能既是Y的父亲又是Y的祖父)。
如何在不删除所有数据断言的情况下解决这些错误?
我是一些家谱软件(用C++和Qt编写)的开发人员。直到我的一位客户给我邮寄了一份错误报告,我才发现问题。问题是,客户有两个孩子和自己的女儿,因此,由于错误,他无法使用我的软件。
这些错误是我对正在处理的族图的各种断言和不变量的结果(例如,在走完一个循环后,程序声明X不能既是Y的父亲又是Y的祖父)。
如何在不删除所有数据断言的情况下解决这些错误?
当前回答
一些答案显示了保持断言/不变量的方法,但这似乎是滥用断言/不变量。断言是为了确保应该是真的东西是真的,不变量是为了确保不应该改变的东西不会改变。
你在这里断言的是乱伦关系是不存在的。显然它们确实存在,因此您的断言是无效的。您可以解决这个断言,但真正的错误在于断言本身。应删除断言。
其他回答
复制父项(或使用符号链接/引用)。
例如,如果您使用的是分层数据库:
$ #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
我讨厌评论这种糟糕的情况,但最简单的方法是在你的图中创建一个虚拟顶点,作为回到乱伦父亲的代理。
我想,你有一些价值,可以唯一地识别一个人,你可以根据这个人进行检查。
这是一个棘手的问题。假设您希望将结构保持为树,我建议如下:
假设这样:A和自己的女儿有孩子。
A在节目中以A和B的身份加入节目。一旦扮演了父亲的角色,我们就称之为男朋友。
添加一个is_same_for_out()函数,该函数告诉程序的输出生成部分,所有内部指向B的链接在数据表示时都应该指向a。
这将为用户带来一些额外的工作,但我想IT将相对容易实现和维护。
在此基础上,您可以进行代码同步A和B,以避免不一致。
这种解决方案肯定不是完美的,但却是第一种方法。
这就是为什么像“Go”这样的语言没有断言的原因之一。它们被用来处理那些你可能没有想到的案例,所有这些都太频繁了。你只应该断言不可能,而不仅仅是不可能。做后者会给断言带来坏名声。每次你输入assert(,走开十分钟,认真思考一下。
在你特别令人不安的案例中,在罕见但可能的情况下,这样的断言是假的,这是可以想象的,也是令人震惊的。因此,在你的应用程序中处理它,如果只是说“这个软件不是为处理你所呈现的场景而设计的”。
断言你的曾、曾、曾祖父是你的父亲是不可能的,这是合理的做法。
如果我是为一家被雇佣来测试你的软件的测试公司工作的话,我当然会提出这种情况。为什么?每一个年轻而聪明的“用户”都会做同样的事情,并对由此产生的“错误报告”津津乐道。
你应该关注真正为你的软件创造价值的东西。为一个消费者提供服务所花费的时间是否值得许可证的价格?可能不会。
我建议您向这位客户道歉,告诉他他的情况超出了您的软件范围,并向他退款。