Минулого тижня ми мали бурхливий аргумент щодо обробки нулів на рівні обслуговування нашого додатка. Питання в контексті .NET, але це буде те саме в Java та багатьох інших технологіях.
Питання полягало в тому, що: чи слід завжди перевіряти наявність нулів і змушувати код працювати незалежно від того, чи пускати виключення, коли нуль несподівано отримано?
З одного боку, перевірка наявності "null" там, де ви її не очікуєте (тобто не маєте користувальницького інтерфейсу, який би в ній оброблявся) - це, на мою думку, те саме, що записати пробний блок із порожнім уловом. Ви просто приховуєте помилку. Помилка може полягати в тому, що в коді щось змінилося, і нуль тепер є очікуваним значенням, або є якась інша помилка, і неправильний ідентифікатор передається методу.
З іншого боку, перевірка на наявність нулів може бути доброю звичкою в цілому. Більше того, якщо є перевірка, програма може продовжувати працювати, лише невелика частина функціоналу не матиме ніякого ефекту. Тоді замовник може повідомити про невелику помилку на кшталт "не можна видалити коментар" замість набагато більш серйозної помилки на зразок "не вдається відкрити сторінку X".
Якої практики ви дотримуєтесь і які ваші аргументи за чи проти будь-якого підходу?
Оновлення:
Я хочу додати детальну інформацію про наш конкретний випадок. Ми витягували деякі об’єкти з бази даних та виконували деяку обробку на них (скажімо, будуємо колекцію). Розробник, який написав код, не передбачав, що об’єкт може бути нульовим, тому він не включав жодних чеків, і коли сторінку завантажували, сталася помилка, і вся сторінка не завантажувалася.
Очевидно, що в цьому випадку мала бути перевірка. Тоді ми вступили в аргумент щодо того, чи слід перевіряти кожен оброблюваний об'єкт, навіть якщо він не буде відсутній, і чи слід мовчки перервати можливу обробку.
Гіпотетичною перевагою було б те, що сторінка продовжить працювати. Подумайте про результати пошуку на Stack Exchange у різних групах (користувачі, коментарі, питання). Метод може перевірити наявність нуля та перервати обробку користувачів (що через помилку є нульовим), але повернути розділи "коментарі" та "питання". Сторінка буде продовжувати працювати, за винятком того, що не буде відсутній розділ "користувачі" (це помилка). Чи повинні ми провалитись рано та зламати всю сторінку чи продовжувати працювати і чекати, коли хтось помітить, що розділ «користувачі» відсутній?
assert(foo != null, "foo is web control within the repeater, there's no reason to expect it to be null, etc, etc...");