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

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

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

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

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

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

Макконнелл С. Совершенный код. Мастер-класс — М.: Русская редакция, 2005. — 896 c.
ISBN: 5-469-00822-3
Скачать (прямая ссылка): soversheniykodmasterklass2005.djvu
Предыдущая << 1 .. 192 193 194 195 196 197 < 198 > 199 200 201 202 203 204 .. 426 >> Следующая

While ( filelndex < numFilesToPurge ) filelndex = filelndex +
1 FindFile( fileList( filelndex ), fileToPurge )
OpenFile( fileToPurge )
OverwriteFile( fileToPurge )
Erase( fileToPurge )
Wend
Finally
DeletePurgeFileList( fileList, numFilesToPurge )
End Try End Sub
Этот подход предполагает, что все вызовы функций в случае
ошибки генерируют исключения, а не возвращают коды ошибок.
398 ЧАСТЬ IV Операторы
Преимущество подхода с применением try-finally в том, что он
проще, чем с goto и не использует goto. Кроме того, он
позволяет избежать глубоко вложенных структур if-then-else.
Ограничением данного варианта с try-finally является то, что
он должен быть последовательно реализован во всем коде. Если
бы предыдущий пример был частью программы, использующей коды
ошибок наряду с исключениями, то коду исключения пришлось бы
устанавливать код ошибки для всех возможных ошибок, и это
требование сделало бы фрагмент примерно таким же сложным, как
и другие варианты.
Сравнение рассмотренных подходов
В защиту каждой из четырех приведенных методик есть что
сказать. Подход с goto позволяет избежать глубокой вложенности
и ненужных проверок, но, увы, он содержит goto. Подход с
вложенными ^позволяет обойтись без goto, но его глубокая
вложенность преувеличивает картину логической сложности
метода. Подход со статусной переменной избегает goto и
глубокой вложенности, но добавляет дополнительные проверки. И,
наконец, подход с try-finally тоже позволяет избежать как
goto, так и глубокой вложенности, но доступен не во всех
языках.
Вариант с try-finally наиболее предпочтителен в языках,
предоставляющих такую конструкцию и в системах, еще не
стандартизовавших какой-то иной подход. Если этот вариант
невозможен, то подход со статусной переменной немного предпоч-
тительнее, чем goto и вложенные if так как он читабельнее и
лучше моделирует задачу, однако это не делает его лучшим во
всех ситуациях.
Все эти методики работают хорошо, если последовательно
применяются ко всему коду проекта. Рассмотрите все плюсы и
минусы, а затем примите решение на уровне проекта о том, какой
подход предпочесть.
Операторы goto и совместное использование кода в блоке else
Одна из возможных ситуаций, в которой некоторые программисты
захотят использовать goto, - это случай, когда у вас есть две
проверки условия и блок else и вы хотите выполнить код одного
из условий и блока else. Вот пример варианта, который может
кого-нибудь подвигнуть к использованию goto:
Ш Пример совместного использования кода в блоке else с помощью
goto (C++)
if ( statusOk ) {
if ( dataAvailable ) { importantVariable = x; goto MID_L00P;
Перекрестная ссылка Полный список методик, которые можно
применять в аналогичных ситуациях, перечислен в подразделе
"Сводка методик уменьшения глубины вложенности" раздала 19x4.
ГЛАВА 17 Нестандартные управляющие структуры 399
else {
importantVariable = GetValueO;
MID_L00P:
// Много кода.
}
Это хороший, логически извилистый пример: его практически
невозможно читать в том виде, в каком он есть, и тяжело
правильно переписать без goto. Если вам кажется, что вы легко
преобразуете его в вариант без goto, попросите кого- нибудь
проверить ваш код! Несколько экспертов-программистов
переписали его некорректно.
Вы можете изменить этот код разными способами. Можно
продублировать код, вынести общий код в отдельный метод и
вызывать его из двух мест или повторно проверять одно и то же
условие. В большинстве языков новая версия будет больше и
медленнее оригинала, но совсем не намного. Поэтому, если этот
код не исключительно критичен к скорости и объему, перепишите
его, не задумываясь об эффективности.
Лучший способ переписать этот код - вынести участок //Много
кода в отдельный метод. После этого вы сможете вызывать его из
тех мест, где раньше располагались goto и метка его перехода.
Это позволит сохранить оригинальную структуру условного
оператора. Вот как это выглядит:
Пример совместного использования кода в блоке else с помощью
вынесения общего кода в отдельный метод (C++)
if ( statusOk ) {
if ( dataAvailable ) { importantVariable = x;
Dol_otsOfCode( importantVariable );
}
}
else {
importantVariable = GetValueO;
Dol_otsOfCode( importantVariable );
}
В общем случае написание нового метода - лучший подход. Однако
иногда выносить дублированный код в отдельный метод
непрактично. В этом случае как обходной маневр можно
предложить реструктурирование условных выражений так, чтобы
оставить код в том же методе, а не выносить в отдельный:
Пример совместного использования кода в блоке else без
применения goto (C++)
if ( ( statusOk && dataAvailable ) || !statusOk ) { if (
statusOk && dataAvailable ) { importantVariable = x;
400 ЧАСТЬ IV Операторы
else {
importantVariable = GetValueO;
}
// Много кода.
}
Перекрестная ешлка Иной подход к данной проблеме - ис-
пользование таблицы решений (см. главу 18).
верять дважды в первом условии if Кроме того, вы также можете
Предыдущая << 1 .. 192 193 194 195 196 197 < 198 > 199 200 201 202 203 204 .. 426 >> Следующая