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

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

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

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

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

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

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

Отступ основного кода метода внутри четырех условий if
выглядит неэстетично, особенно если этот код в самом
внутреннем блоке ^состоит из множества строк. В таких случаях
часто можно упростить логику, если все ошибочные ситуации
проверять сначала, расчистив дорогу для номинального хода
алгоритма. Вот как это может выглядеть:

384 ЧАСТЬ IV Операторы
Простой код, использующий сторожевые операторы для прояснения
номинального варианта (Visual Basic)
1 Выполняем инициализацию. При обнаружении ошибок завершаем
работу.
If Not file.validName() Then Exit Sub
If Not file.0pen() Then Exit Sub
If Not encryptionKey.valid() Then Exit Sub
If Not file.Decrypt( encryptionKey ) Then Exit Sub
' Много кода.
В таком простом примере описанный способ выглядит аккуратным
решением, но промышленный код при обнаружении ошибки часто
требует большего количества служебных операций или действий по
очистке ресурсов. Вот более реалистичный пример:
Более реалистичный код, использующий сторожевые операторы для
прояснения номинального варианта (Visual Basic)
1 Выполняем инициализацию. При обнаружении ошибок завершаем
работу.
If Not file.validName() Then
errorStatus = FileError_InvalidFileName Exit Sub End If
If Not file.0pen() Then
errorStatus = FileError_CantOpenFile Exit Sub End If
If Not encryptionKey.valid() Then
errorStatus = FileError_InvalidEncryptionKey Exit Sub End If
If Not file.Decrypt( encryptionKey ) Then errorStatus =
FileError_CantDecryptFile Exit Sub End If
Здесь код номинального варианта.
Много кода.
В коде промышленного масштаба использование Exit Sub приводит
к написанию довольно большого количества кода до обработки
номинального варианта. Однако Exit Sub позволяет избежать
глубокой вложенности, присущей первому примеру, и если код
первого примера расширить с целью установки значений пере-
менной errorStatus, то вариант с Exit Sub покажется лучшим с
точки зрения группировки взаимосвязанных выражений. Когда вся
пыль осядет, подход с Exit Sub покажется более удобным для
чтения и сопровождения, и за небольшую цену.
ГЛАВА 17 Нестандартные управляющие структуры
385
Минимизируйте число возвратов из каждого метода Тяжело понять
логику метода, если при чтении его последних строк вы не
подозреваете о возможности выхода из него где-то вверху По
этой причине используйте операторы возврата благоразумно -
только если они улучшают читабельность.
При рекурсии метод решает небольшую часть задачи, разбивает
задачу на меньшие порции и вызывает сам себя для решения
каждой из этих порций. Обычно рекурсию применяют, когда
небольшую часть задачи легко решить, а саму задачу просто
разложить на составные части.
Рекурсия не часто бывает необходима, но при аккуратном
использовании она позволяет создавать элегантные решения, как
в этом примере, где алгоритм сортировки иллюстрирует отличное
применение рекурсии:
Пример алгоритма сортировки, использующего рекурсию (Java)
void QuickSort( int firstlndex, int lastlndex, String [] names
) { if ( lastlndex > firstlndex ) {
int midPoint = Partition( firstlndex, lastlndex, names );
Здесь выполняются рекурсивные вызовы.
В этом фрагменте алгоритм сортировки разрезает массив на две
части и затем вызывает сам себя для сортировки каждой половины
массива. Когда ему будет передан участок массива, слишком
короткий для сортировки, т. е. когда (lastlndex <=
firstlndex), он перестанет вызывать сам себя.
Для малой группы задач рекурсия позволяет создать простые,
элегантные решения. Для несколько большей группы задач она
позволяет создать простые, элегантные, трудные для понимания
решения. Для большинства задач она создает исключительно
запутанные решения - в таких случаях использование простых
итераций обычно более понятно. Поэтому применяйте рекурсию
выборочно.
Допустим, у вас есть тип данных, представляющий лабиринт.
Лабиринт - это обычно некая сетка, в узлах которой вы можете
повернуть направо, налево, переместиться вверх или вниз. Часто
существует возможность двигаться в нескольких направлениях.
Как вы будете разрабатывать программу для поиска пути через
лабиринт (рис 17-1)? Если вы используете рекурсию, ответ
довольно прост. Вы начинаете от входа и пробуете все возможные
повороты, пока не найдете выхода. Попадая в точку в первый
раз, вы пробуете повернуть налево, если это невозможно, то
пробуете пойти вверх или вниз. В конце концов вы пытаетесь
пойти направо. Вам не надо боять-
17.2. Рекурсия



QuickSort( firstlndex, midPoint-1, names ); QuickSort(
midPoint+1, lastlndex, names )
Примеры рекурсии
386 ЧАСТЬ IV Операторы
ся заблудиться, потому что на каждом перекрестке вы оставляете
несколько хлебных крошек и не поворачиваете в одну и ту же
сторону дважды.
Верх

Рис. 17-1. Рекурсия может быть мощным оружием в борьбе со
сложностью, если используется по назначению
Рекурсивный код может выглядеть, например, так:
Пример рекурсивного перемещения по лабиринту (C++)
Предыдущая << 1 .. 186 187 188 189 190 191 < 192 > 193 194 195 196 197 198 .. 426 >> Следующая