Expressions and statements
ES.2
Предпочитайте подходящие абстракции прямому использованию возможностей языка
Причина
«Подходящая абстракция» (например, библиотека или класс) ближе к понятиям предметной области, чем голые возможности языка, приводит к более короткому и понятному коду и, как правило, лучше протестирована.
Пример
vector<string> read1(istream& is) // хорошо
{
vector<string> res;
for (string s; is >> s;)
res.push_back(s);
return res;
}
Более традиционный низкоуровневый аналог длиннее, запутаннее, сложнее в реализации и, скорее всего, медленнее:
char** read2(istream& is, int maxelem, int maxstring, int* nread) // плохо: многословно и неполно
{
auto res = new char*[maxelem];
int elemcount = 0;
while (is && elemcount < maxelem) {
auto s = new char[maxstring];
is.read(s, maxstring);
res[elemcount++] = s;
}
*nread = elemcount;
return res;
}
После добавления проверки переполнения и обработки ошибок этот код становится весьма запутанным, и возникает проблема: нужно не забыть delete возвращённый указатель и C-строки, которые содержит массив.
Контроль
Нелегко. ??? Ищите запутанные циклы, вложенные циклы, длинные функции, отсутствие вызовов функций, неиспользование встроенных типов. Цикломатическая сложность?