Maxint — очень хорошее число для недопустимого идентификатора. Мы никогда не достигнем этого.
TL;DR: не связывайте настоящие идентификаторы с недействительными. На самом деле: избегайте идентификаторов.
Проблемы
- Нарушение биекции
- Вы можете получить неверный идентификатор раньше, чем думаете
- Также не используйте null для недопустимых идентификаторов.
- Связывание флагов от вызывающего объекта с функциями
Решения
- Смоделируйте особые случаи с помощью специальных объектов.
- Избегайте 9999, -1 и 0, поскольку они являются допустимыми объектами предметной области и связаны с реализацией.
- Ввести нулевой объект
Контекст
На заре вычислительной техники типы данных были строгими.
Потом мы придумали Ошибку на миллиард долларов.
Затем мы выросли и моделируем специальные сценарии с полиморфными специальными значениями.
Образец кода
Неправильный
#include "stdio.h" #include "stdlib.h" #include "stdbool.h" #define INVALID_VALUE 999
int main(void) { int id = get_value(); if (id==INVALID_VALUE) { return EXIT_FAILURE; // id is a flag and also a valid domain value } return id; }
int get_value() { // something bad happened return INVALID_VALUE; }
// returns EXIT_FAILURE (1)
Верно
#include "stdio.h" #include "stdlib.h" #include "stdbool.h" // No INVALID_VALUE defined
int main(void) { int id; id = get_value(); if (!id) { return EXIT_FAILURE; // Sadly, C Programming Language has no exceptions } return id; }
get_value() { // something bad happened return false; }
// returns EXIT_FAILURE (1)
Обнаружение
[X] Полуавтоматический
Мы можем проверить специальные константы и специальные значения в коде.
Теги
- Нулевой
Заключение
Мы должны использовать числа для связи с внешними идентификаторами.
Если внешний идентификатор не существует, то это не число.
связи
Больше информации
Отказ от ответственности
Code Smells — это всего лишь мое мнение.
Кредиты
Фото Markus Spiske на Unsplash
Жуки прячутся в углах и собираются на границах.
Борис Бейзер
Эта статья является частью серии CodeSmell.