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

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

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

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

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

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

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

16.2. Управление циклом
Что плохого может случиться с циклом? Любой ответ должен
включать некорректную или пропущенную инициализацию цикла,
невыполненную инициализацию накопительных переменных (или
других переменных, относящихся к циклу), неправильную
вложенность, неправильное завершение цикла, отсутствие инкре-
ментации переменной цикла или ее неправильную инкрементацию, а
также неправильное индексирование элемента массива с помощью
индекса цикла.
Вы можете предотвратить эти проблемы, соблюдая два правила.
Во-пер- вых, минимизируйте число факторов, влияющих на цикл.
Упрощайте, упрощайте и еще раз упрощайте! Во-вторых,
рассматривайте содержимое цикла так, будто это метод: вынесите
за пределы цикла все управление, какое только возможно. Явно
объявите все условия выполнения тела цикла. Не заставляйте
читателя смотреть внутрь цикла, чтобы понять его управление.
Думайте о цикле, как о черном ящике: окружающий код знает об
управляющих условиях, но не о содержимом цикла.
Пример представления цикла в виде черного ящика (C++) "
ггг "г Переярестна* ссыпка ?сяи вы
while ( ! inputFile. EndOfFileO && moreDataAvailable ) {
ШйПЩШ mmmrm White
При каких условиях этот цикл завершится? Очевидно, все, то
условие выхода находится
что вам известно, что или inputFileJindOfFileO
станет исти- *НУТРИ черного ящика. Даже
ж* тл + л ч ui если вы используете
только
ной, или MoreDataAvailable станет ложью. _
7 ПЛЫЛ \/ЛMkl Т&Пв-
Вход в цикл
Следуйте принципам, приведенным далее, при разработке
одно условие выхода, вы теряете преимущество рассмотрения
цикла е виде черного ящика.
входа в цикл.
366 ЧАСТЬ IV Операторы
Размещайте вход в цикл только в одном месте Разнообразие
структур, управляющих циклом, позволяет проводить проверку его
завершения в начале, середине или конце цикла. Эти структуры
имеют достаточно широкие возможности, чтобы вы могли
закодировать вход в цикл только сверху. Нет нужды делать вход
в цикл в нескольких местах.
Размещайте инициализационный код непосредственно перед циклом
Принцип схожести пропагандирует размещение взаимосвязанных
выражений вместе. Если взаимосвязанные выражения разбросаны по
всем методу, то при внесении исправлений их легко пропустить,
сделав изменения не полностью. Если же взаимосвязанные
выражения располагаются рядом, избежать ошибок при модификации
становится легче.
Поместите операторы инициализации цикла рядом с этим
Перекреста* ссылка Об ограни- ^ r ^ г
тт области видимости пере- циклом. Если вы этого не сделаете,
то, вполне вероятно, это
МФННЫХ цикла с**. подраздел приведет к ошибкам, когда вы
соберетесь преобразовать
^О||ШИ%т#01Щй"остыт^>е"ей* данный цикл в цикл большего
размера и забудете исправить
ных-индекодв цикла ошт инициализационный код Такая же ошибка
может возникши дата в этой тт. нуть, когда вы переместите
или скопируете код цикла в
другой метод, забыв переместить инициализационный код
Размещение кода инициализации вдали от цикла - в разделе
объявления данных или во вспомогательном разделе в начале
метода - грозит неприятностями с инициализацией.
Используйте while (true) для бесконечных циклов Вам может
понадобиться цикл, выполняющийся без завершения, - например,
цикл в таких изделиях, как кардиостимулятор или микроволновая
печь. Или цикл должен завершаться только в ответ на событие -
так называемый "событийный цикл". Вы можете закодировать такой
бесконечный цикл несколькими способами. Имитация цикла с по-
мощью выражений вида for i - 1 to 99999 - плохая идея,
поскольку конкретное значение границ цикла скрывает его смысл:
99999 может быть вполне допустимым значением. Кроме того,
такой фальшивый бесконечный цикл плохо поддается
сопровождению.
Идиома while( true ) считается стандартным способом написания
бесконечных циклов в C++, Java, Visual Basic и других языках,
поддерживающих операции сравнения. Некоторые программисты
предпочитают использовать for(;;) - это приемлемая
альтернатива.
Предпочитайте циклы for, если они применимы В цикле for
управляющий код находится в одном месте, что способствует
созданию легко читаемых циклов. При модификации ПО
программисты часто делают ошибку, изменяя код инициализации в
начале цикла while и забывая исправить соответствующий код в
конце цикла. В цикле for необходимый код расположен в начале
цикла, что упрощает модификацию кода. Если вы можете
использовать цикл for вместо других циклов, сделайте это.
Не используйте цикл for, если цикл while подходит больше
Обычным злоупотреблением гибкой структурой цикла for в языках
C++, С# и Java является размещение частей цикла while в
заголовке цикла for. Взгляните на цикл while, втиснутый в
заголовок цикла for.
ГЛАВА 16 Циклы 367
Ш Пример цикла while, злостно втиснутого в заголовок цикла for
(C++)
// Чтение всех записей из файла.
for ( inputFile.MoveToStart(), recordCount = 0;
!inputFile.EndOfFile(); recordCount++ ) {
inputFile.GetRecord();
Предыдущая << 1 .. 178 179 180 181 182 183 < 184 > 185 186 187 188 189 190 .. 426 >> Следующая