null
Використання залежить від застосування / мови
Зрештою, вибір використання чи null
дійсного значення програми багато в чому визначається вашим додатком та мовою програмування / інтерфейсом / краєм.
На фундаментальному рівні я рекомендую спробувати використовувати окремі типи, якщо є окремі класи значень. null
це може бути варіант, якщо ваш інтерфейс дозволяє це і є лише два класи властивості, які ви намагаєтесь представляти. Опускання властивості може бути варіантом, якщо ваш інтерфейс чи формат це дозволяє. Новий тип сукупності (клас, об’єкт, тип повідомлення) може бути іншим варіантом.
Для вашого рядкового прикладу, якщо це є мовою програмування, я б задав собі кілька питань.
- Я планую додавати майбутні типи значень? Якщо так, то
Option
, можливо, буде краще для вашого інтерфейсу.
- Коли мені потрібно перевірити дзвінки споживачів? Статично? Динамічно? Раніше? Після? Зовсім? Якщо ваша мова програмування підтримує його, використовуйте переваги статичного введення тексту, оскільки це дозволяє уникнути кількості коду, який ви повинні створити для перевірки.
Option
ймовірно, найкраще заповнює цей випадок, якщо ваш рядок був ненульовим. Однак вам, мабуть, доведеться все-таки перевірити введення користувачем на null
предмет значення рядка, тому я, мабуть, відкладу назад до першого рядка опитування: скільки типів значень потрібно / я хочу представляти.
- Чи
null
вказує на помилку програміста в моїй програмуванні? На жаль, null
часто це значення за замовчуванням для неініціалізованих (або не явно ініціалізованих) покажчиків чи посилань на деяких мовах. Чи null
прийнятне значення як значення за замовчуванням? Чи безпечно це як значення за замовчуванням? Інколи null
вказує на розміщені значення. Чи слід надати споживачам мого інтерфейсу вказівку на ці потенційні проблеми управління пам’яттю чи ініціалізацію в їхній програмі? Який режим відмови такого дзвінка на тлі таких проблем? Чи викликає абонент у тому самому процесі або потоці, що і мій, так що такі помилки є високим ризиком для моєї програми?
Залежно від ваших відповідей на ці питання, ви, ймовірно, зможете відточити те, чи null
підходить ваш інтерфейс чи ні .
Приклад 1
- Ваш додаток є критично важливим для безпеки
- Ви використовуєте певний тип ініціалізації купи під час запуску, і
null
це можливе значення рядка, передане назад у разі неможливості виділення місця для рядка.
- Є потенціал, що така струна потрапляє у ваш інтерфейс
Відповідь: null
мабуть, не підходить
Обґрунтування: null
у цьому випадку фактично використовується для позначення двох різних типів значень. Перше може бути значенням за замовчуванням, яке може захотіти встановити користувач вашого інтерфейсу. На жаль, друге значення - це прапор, який вказує на те, що ваша система не працює належним чином. У таких випадках ви, ймовірно, хочете вийти з ладу максимально безпечно (що б це не означало для вашої системи).
Приклад 2
- Ви використовуєте структуру C, яка має
char *
член.
- Ваша система не використовує розподіл купи, і ви використовуєте перевірку MISRA.
- Ваш інтерфейс приймає цю структуру як вказівник і перевіряє, чи не вказує структура
NULL
- Значення за замовчуванням та безпечне значення
char *
для вашого API можна вказати одним значеннямNULL
- Після ініціалізації вашого користувача, ви хочете надати користувачеві можливість не явно ініціалізувати його
char *
.
Відповідь: NULL
може бути доречним
Обґрунтування: Є невеликий шанс, що ваша структура пройде NULL
перевірку, але неініціалізована. Однак ваш API може не змогти це врахувати, якщо у вас немає якоїсь контрольної суми на значення структури та / або перевірку діапазону адреси структури. Лінійки MISRA-C можуть допомогти користувачам вашого API, позначивши використання конструкцій перед їх ініціалізацією. Однак, що стосується char *
члена, якщо вказівник на структуру вказує на ініціалізовану структуру, NULL
це значення за замовчуванням не визначеного члена в ініціалізаторі структури. Тому NULL
може слугувати безпечним за замовчуванням значенням char *
члена структури у вашій програмі.
Якщо він знаходиться в інтерфейсі серіалізації, я б задав собі наступні запитання щодо того, використовувати чи нуль у рядку чи ні.
- Чи
null
вказує на потенційну помилку клієнта? Для JSON в JavaScript це, мабуть, ні, оскільки null
не обов'язково використовується як вказівка на помилку розподілу. У JavaScript він використовується як явна вказівка відсутності об'єкта у посиланні, що задається проблематично. Однак там є аналізатори без сеансів JavaScript та серіалізатори, які позначають JSON null
на рідний null
тип. Якщо це так, це починає обговорювати питання про те, чи null
нормальне використання мови для вашого конкретного мови, парсера та серіалізатора.
- Чи впливає явна відсутність значення властивості більше, ніж значення однієї властивості? Іноді а
null
фактично вказує на те, що у вас повністю новий тип повідомлення. Вашим споживачам може бути більш чітким формат серіалізації, щоб просто вказати зовсім інший тип повідомлення. Це гарантує, що їх логіка перевірки та застосування можуть мати чіткий поділ між двома розрізненнями повідомлень, які надає ваш веб-інтерфейс.
Загальні поради
null
не може бути значенням на краю чи інтерфейсі, які не підтримують його. Якщо ви використовуєте щось надзвичайно вільне за своєю суттю під час введення значень властивостей (наприклад, JSON), спробуйте висунути якусь форму схеми чи перевірки на програмне забезпечення для споживачів (наприклад, схема JSON ), якщо можете. Якщо це API мови програмування, перевіряйте введення користувача, якщо це можливо, статично (шляхом набору тексту) або настільки голосно, наскільки це чутно під час виконання (так само практикуйте захисне програмування на інтерфейсах, що стоять перед споживачами). Як важливо, документуйте або визначте край, щоб не виникало жодних питань щодо:
- Який тип (-ів) цінності приймає дана властивість
- Які діапазони значень дійсні для даної властивості.
- Як має бути структурований агрегатний тип Які властивості повинні / повинні / можуть бути наявними у сукупному типі?
- Якщо це якийсь тип контейнера, скільки елементів може містити або повинен містити контейнер і які типи значень містить контейнер?
- Який порядок, якщо такий є, повертаються властивості або екземпляри типу контейнера чи агрегатів?
- Які побічні ефекти існують при встановленні певних значень та які побічні ефекти при читанні цих значень?