Чи інші люди виправляють помилки, коли їх бачать, чи чекають, поки не відбудеться збої / втрата даних / люди вмирають, перш ніж виправити це?
Приклад 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
об’єкт, тепер, коли він правильно побудований, дозволить запустити якийсь код, який раніше ніколи не робив, і тепер я можу отримати збій.
Я не можу ставити на це життя вашої дружини.
І я можу перевірити це звідси до вівторка, я не можу присягнути на життя вашої дочки, що я не вніс регресу.
Чи повинен я:
- Виправити код і звинуватити його у злому? або
- Залиште помилку та звинувачуйте, коли клієнт її знайде?