Представьте, что у меня есть функция с ошибкой:
Псевдокод:
void Foo(LPVOID o)
{
//implementation details omitted
}
Проблема в том, что пользователь прошел null
:
Object bar = null;
...
Foo(bar);
Тогда функция может аварийно завершить работу из-за нарушения прав доступа; но это может также произойти, чтобы работать хорошо. Ошибка заключается в том, что функция должна проверять недопустимый случай передачи null
, но этого никогда не было. Это никогда не было проблемой, потому что разработчикам доверяли знать, что они делают.
Если я теперь изменю функцию на:
Псевдо-код:
void Foo(LPVOID o)
{
if (o == null) throw new EArgumentNullException("o");
//implementation details omitted
}
тогда люди, которые счастливо пользовались этой функцией и случайно не получили нарушения доступа, теперь внезапно начнут видеть EArgumentNullException
.
Продолжаю ли я позволять людям неправильно использовать функцию и создавать новую версию функции? Или я исправляю функцию, чтобы включить то, что она должна была иметь изначально?
Так что теперь моральная дилемма. Добавляете ли вы когда-либо новые проверки работоспособности, проверки безопасности, утверждения в существующий код? Или вы называете старую функцию заброшенной, и у вас есть новая?
Считайте, что ошибка настолько распространена, что Microsoft пришлось ее исправлять для разработчиков:
MessageBox(GetDesktopWindow, ...);
Вы никогда, никогда, никогда не захотите создать оконную модель для рабочего стола. Вы заблокируете систему. Продолжаете ли вы позволять разработчикам блокировать компьютер пользователя? Или вы измените функцию на:
MessageBox(HWND hWndParent, ...)
{
if (hWndParent == GetDesktopWindow)
throw new Exception("hWndParent cannot be the desktop window. Use NULL instead.");
...
}
На самом деле Microsoft изменила диспетчер окон, чтобы автоматически исправить неверный параметр:
MessageBox(HWND hWndParent, ...)
{
if (hWndParent == GetDesktopWindow)
hWndParent = 0;
...
}
В моем вымышленном примере нет способа исправления функции - если мне не дали объект, я не могу сделать то, что мне нужно с ним сделать.
Вы рискуете сломать существующий код, добавив проверку параметров? Вы позволяете существующему коду продолжать работать неправильно, получая неверные результаты?