Philosophy
P.5
Предпочитайте проверку во время компиляции проверке во время выполнения
Причина
Ясность кода и производительность. Вам не нужно писать обработчики ошибок для ошибок, обнаруженных во время компиляции.
Пример
// Int — псевдоним для целых чисел
int bits = 0; // плохо: ненужный код
for (Int i = 1; i; i <<= 1)
++bits;
if (bits < 32)
cerr << "Int too small\n";
Этот пример не достигает того, к чему стремится (потому что переполнение не определено) и должен быть заменён простым static_assert:
// Int — псевдоним для целых чисел
static_assert(sizeof(Int) >= 4); // правильно: проверка во время компиляции
Или, что ещё лучше, просто используйте систему типов и замените Int на int32_t.
Пример
void read(int* p, int n); // читает максимум n целых чисел в *p
int a[100];
read(a, 1000); // плохо, выход за пределы
лучше
void read(span<int> r); // читает в диапазон целых чисел r
int a[100];
read(a); // лучше: позвольте компилятору определить количество элементов
Альтернативная формулировка: Не откладывайте на время выполнения то, что можно хорошо сделать во время компиляции.
Контроль
- Искать аргументы-указатели.
- Искать проверки диапазона во время выполнения.