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