Книги
чёрным по белому
Главное меню
Главная О нас Добавить материал Поиск по сайту Карта книг Карта сайта
Книги
Археология Архитектура Бизнес Биология Ветеринария Военная промышленность География Геология Гороскоп Дизайн Журналы Инженерия Информационные ресурсы Искусство История Компьютерная литература Криптология Кулинария Культура Лингвистика Математика Медицина Менеджмент Металлургия Минералогия Музыка Научная литература Нумизматика Образование Охота Педагогика Политика Промышленные производства Психология Путеводители Религия Рыбалка Садоводство Саморазвитие Семиотика Социология Спорт Столярное дело Строительство Техника Туризм Фантастика Физика Футурология Химия Художественная литература Экология Экономика Электроника Энергетика Этика Юриспруденция
Новые книги
Цуканов Б.И. "Время в психике человека" (Медицина)

Суворов С. "Танк Т-64. Первенец танков 2-го поколения " (Военная промышленность)

Нестеров В.А. "Основы проэктирования ракет класса воздух- воздух и авиационных катапульных установок для них" (Военная промышленность)

Фогль Б. "101 вопрос, который задала бы ваша кошка своему ветеринару если бы умела говорить" (Ветеринария)

Яблоков Н.П. "Криминалистика" (Юриспруденция)
Реклама

Совершенный код. Мастер-класс - Макконнелл С.

Макконнелл С. Совершенный код. Мастер-класс — М.: Русская редакция, 2005. — 896 c.
ISBN: 5-469-00822-3
Скачать (прямая ссылка): soversheniykodmasterklass2005.djvu
Предыдущая << 1 .. 180 181 182 183 184 185 < 186 > 187 188 189 190 191 192 .. 426 >> Следующая

пока не будете уверены, что при любых обстоятельствах он
завершен. Продумайте номинальные варианты, граничные точки и
каждый из исключительных случаев.
Сделайте условие завершения цикла очевидным Если вы
используете цикл for, не забавляетесь с индексом цикла и не
применяете операторы goto или break для выхода из него, то
условие завершения будет очевидным. Аналогично, если вы
используете циклы while или repeat-until и поместили все
управление в выражение while или repeat-until, условие
завершения также будет очевидным. Смысл в том, чтобы размещать
управление в одном месте.
Не играйте с индексом цикла for для завершения цикла Некоторые
программисты взламывают значение индекса цикла for для более
раннего завершения цикла. Вот пример:
Ш Пример неправильного обращения с индексом цикла (Java)
for ( int i=0; i < 100; i++ ) {
// Некоторый код
if (...) { г- Здесь индекс портится.
L> i = 100;
}
// Еще код
}
Смысл этого примера в завершении цикла при каком-то условии с
помощью установки значения i в 100, что больше, чем границы
диапазона цикла for от 0 до 99- Фактически все хорошие
программисты избегают такого способа - это при-
370 ЧАСТЬ IV Операторы
знак любительского подхода. Когда вы задаете цикл for,
манипуляции с его счетчиком должны быть под запретом. Для
получения большей управляемости условиями выхода используйте
цикл while.
Избегайте писать код, зависящий от последнего значения индекса
цикла
Использование значения индекса цикла после его завершения -
дурной тон. Конечное значение индекса меняется от языка к
языку и от реализации к реализации. Значения различаются,
когда цикл завершается нормально или аномально. Даже если вы
не задумываясь можете назвать это конечное значение, следую-
щему читателю кода, возможно, придется о нем задуматься. Более
правильным вариантом, к тому же более самодокументируемым,
будет присвоение последнего значения какой-либо переменной в
подходящем месте внутри цикла.
Этот код некорректно использует конечное значение индекса:
Пример кода, который неправильно применяет последнее значение
индекса цикла (C++)
for ( recordCount = 0; recordCount < MAX_RECORDS;
recordCount++ ) { if ( entry[ recordCount ] == testValue ) {
break;
}
}
// Много кода
Здесь неправильное применение завершающего значения индекса
цикла.
>if ( recordCount < MAX_REC0RDS ) { return( true );
}
else {
return( false );
>
В этом фрагменте вторая проверка recordCount < MaxRecords
производит впечатление, что цикл будет проходить по всем
элементам entry[] и вернет true, если найдет значение, равное
testValue, к false в противном случае. Тяжело помнить, будет
ли индекс инкрементироваться после конца цикла, поэтому легко
сделать ошибку потери единицы. Лучше переписать код так, чтобы
он не зависел от последнего значения индекса. Вот пример
обновленного кода:
Пример кода, который не делает ошибки при использовании
последнего значения индекса цикла (C++)
found = false;
for ( recordCount = 0; recordCount < MAX_REC0RDS;
recordCount++ ) { if ( entry[ recordCount ] == testValue ) {
found = true; break;
}
ГЛАВА 16 Циклы 371
// Много кода return( found );
Этот второй фрагмент использует дополнительную переменную и
располагает обращения к recordCount в более ограниченном
пространстве. Как часто бывает при применении вспомогательной
логической переменной, результирующий код становится яснее.
Рассмотрите использование счетчиков безопасности Счетчик
безопасности - это переменная, увеличивающаяся при каждом
проходе цикла, чтобы определить, не слишком ли много раз
выполняется цикл. Если вы пишете программу, в которой любая
ошибка будет катастрофической, вы можете использовать счетчики
безопасности, чтобы убедиться, что все циклы заканчиваются.
Такой цикл на C++ вполне может использовать счетчик
безопасности:
Пример цикла, который мог бы использовать счетчик безопасности
(C++)
do {
node = node->Next;
} while ( node->Next != NULL );
Вот тот же код с добавленным счетчиком безопасности:
Пример использования счетчика безопасности (C++)
safetyCounter = 0; do {
node = node->Next;
Здесь код счетчика безопасности.
safetyCounter++;
if ( safetyCounter >= SAFETY_LIMIT ) {
Assert( false, "Internal Error: Safety-Counter Violation." );
}
} while ( node->Next != NULL );
Счетчики безопасности не панацея. Добавляемые в код по одному,
они увеличивают сложность и могут привести к дополнительным
ошибкам. Так как они не применяются в каждом цикле, вы можете
забыть поддержать код счетчика при модификации циклов в той
части программы, где они все же используются. Но если счетчики
безопасности вводятся на уровне проектного стандарта для
критических циклов, вы будете ожидать их, и код этих счетчиков
будет не более подвержен ошибкам, чем любой другой.
Досрочное завершение цикла
Многие языки предоставляют средства для завершения цикла без
выполнения условий for или while. В данном обсуждении слово
break обозначает общий тер
Предыдущая << 1 .. 180 181 182 183 184 185 < 186 > 187 188 189 190 191 192 .. 426 >> Следующая