其他人看到错误时会修复错误,还是等到崩溃/数据丢失/人死后才修复错误?
例子1
Customer customer = null;
...
customer.Save();
该代码显然是错误的,而且无法解决-在空引用上调用方法。它碰巧不会崩溃,因为Save
碰巧不访问任何实例数据;因此就像调用静态函数一样。但是任何地方的任何微小更改都可能突然导致不会崩溃的代码损坏:开始崩溃。
但是,更正代码也是不可想象的:
Customer customer = null;
...
customer = new Customer();
try
...
customer.Save();
...
finally
customer.Free();
end;
可能会导致崩溃;一个没有通过全面测试的单元测试和手动用户测试发现的。
例子2
float speed = 0.5 * ((G * mass1 * mass2) / R) * Pow(time, 2);
认识物理学的人会认识到分母应该是R 2。
代码是错误的,这是绝对错误的。高估速度会导致反火箭发射得太早,杀死所有飞船上的人。
但是也有可能过高估计速度掩盖了另一个问题:在航天飞机移动得太快时,安全气囊无法展开。如果我们突然修改了代码:
float speed = 0.5 * ((G * mass1 * mass2) / Pow(R, 2)) * Pow(time, 2);
现在速度是准确的,安全气囊突然在不应该展开的时候展开。
例子3
这是我最近遇到的一个示例,检查字符串是否包含无效字符:
if (StrPos(Address, "PO BOX") >= 0)
{
//Do something
}
如果事实证明Do something
分支中存在错误,该怎么办?修复明显不正确的代码:
if (StrPos("PO BOX", Address) >= 0)
{
//Do something
}
修复了代码,但引入了一个错误。
我认为它有两种可能性:
- 修复代码,并因破坏代码而受到指责
- 等待代码崩溃,并因存在错误而受到指责
什么是你政治上怎么办?
示例4-当今的真实错误
我正在构造一个对象,但是调用了错误的构造函数:
Customer customer = new Customer();
事实证明,“无参数”构造函数实际上是继承链中更远的一个参数化构造函数:
public Customer(SomeObjectThatNobodyShouldBeUsingDirectly thingy = null)
public Customer(InjectedDependancy depends)
调用它是一个错误,因为它绕过了所有后续的构造方法。
我可以更改对象的沿袭,以不暴露出如此危险的构造函数,但现在我必须将代码更改为:
Customer customer = new Customer(depends);
但我不能保证此更改不会破坏任何内容。就像上面的示例1一样,也许某人某处在某种神秘的条件下,以某种方式依赖于构造Customer
为无效且充满垃圾的构造。
也许Customer
现在该对象已正确构造,它可以运行以前从未执行过的代码,现在我可能崩溃。
我不能打赌你妻子的一生。
从现在到星期二,我都可以对其进行测试,我不能对您女儿的生活发誓我没有引入回归。
我要:
- 修复代码并因破坏代码而受到指责?要么
- 留下错误,并在客户发现错误时受到指责吗?