Выражайте намерение
Причина
Если намерение некоторого кода не указано (например, в именах или комментариях), невозможно определить, делает ли код то, что должен делать.
Пример
gsl::index i = 0;
while (i < v.size()) {
// ... что-то делаем с v[i] ...
}
Намерение «просто» перебрать элементы v здесь не выражено. Детали реализации индекса раскрыты (так что он может быть неправильно использован), и i существует за пределами области видимости цикла, что может быть как намеренным, так и нет. Читатель не может знать этого только по этому участку кода.
Лучше:
for (const auto& x : v) { /* делаем что-то со значением x */ }
Теперь нет явного упоминания механизма итерации, и цикл работает со ссылкой на элементы типа const, так что случайная модификация невозможна. Если модификация желательна, скажите об этом явно:
for (auto& x : v) { /* изменяем x */ }
Более подробно о цикле for смотрите ES.71. Иногда ещё лучше использовать именованный алгоритм. В этом примере используется for_each из Ranges TS, потому что он непосредственно выражает намерение:
for_each(v, [](int x) { /* делаем что-то со значением x */ });
for_each(par, v, [](int x) { /* делаем что-то со значением x */ });
Последний вариант явно указывает на то, что нас не интересует порядок, в котором обрабатываются элементы v.
Программист должен быть знаком с
и использовать их там, где это уместно.
Примечание
Альтернативно:
- Сказать, что делается, а не только как это делается
- Некоторые языковые конструкции выражают намерение лучше, чем другие.
Контроль
Сложно механически проверить.