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

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

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

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

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

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

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

с трудностями при преобразовании кода, использующего goto.
Вот более точная реорганизация кода без goto:
Пример действительно эквивалентного кода, переписанного без
goto (C++)
do {
GetData( inputFile, data ); if ( !eof( inputFile )) {
DoSomething( data );
}
} while ( ( data != -1 ) && ( !eof( inputFile ) ) );
Даже при правильном преобразовании кода этот пример все же
искусственный, потому что он показывает тривиальный вариант
использования goto. Это не тот случай, когда толковые
программисты выбирают goto в качестве предпочтительной формы
управления.
В наши дни уже тяжело добавить что-нибудь стоящее к
теоретическим дебатам вокруг goto. Однако на что обычно не
обращают внимания, так это на ситуации, в кото
ГЛАВА 17 Нестандартные управляющие структуры
393
рых программист, полностью представляя себе альтернативы без
goto, все же решает использовать его для улучшения
читабельности и качества сопровождения.
Следующие разделы представляют случаи, в которых некоторые
опытные программисты приводят доводы в пользу goto. В
обсуждении рассматриваются примеры кода с операторами goto и
кода, переписанного без их использования, и оцениваются
достоинства и недостатки этих версий.
Обработка ошибок и операторы goto
Создание высокоинтерактивного кода заставляет обращать особое
внимание на обработку ошибок и освобождение ресурсов в случае
возникновения ошибки. Следующий пример стирает группу файлов.
Метод сначала получает группу файлов для удаления, затем
находит каждый файл, открывает его, перезаписывает, а затем
удаляет. Метод проверяет возникновение ошибок на каждом шаге.
Пример кода с goto, который обрабатывает ошибки и освобождает
ресурсы (Visual Basic)
1 Этот метод стирает группу файлов.
Sub PurgeFiles( ByRef errorState As Error_Code )
Dim filelndex As Integer Dim fileToPurge As Data_File Dim
fileList As File_List Dim numFilesToPurge As Integer
MakePurgeFileList( fileList, numFilesToPurge )
errorState = FileStatus_Success filelndex = 0
While ( filelndex < numFilesToPurge ) filelndex = filelndex +
1
If Not ( FindFile( fileList( filelndex ), fileToPurge ) ) Then
errorState = FileStatus_FileFindError
i- Здесь используется GoTo.
GoTo END_PR0C End If
If Not OpenFile( fileToPurge ) Then errorState =
FileStatus_FileOpenError
г- Здесь используется GoTo.
L> GoTo END_PR0C
End If
If Not OverwriteFile( fileToPurge ) Then
errorState = FileStatus_FileOverwriteError
394 ЧАСТЬ IV Операторы
г- Здесь используется GoTo.
GoTo END_PR0C End If
if Not Erase( fileToPurge ) Then
errorState = FileStatus FileEraseError
г- Здесь используется GoTo.
GoTo END_PR0C End If Wend
Здесь находится метка GoTo.
'END_PR0C:
DeletePurgeFileList( fileList, numFilesToPurge )
End Sub
Этот метод - типичный пример обстоятельств, при которых
опытные программисты решают использовать goto. Похожее
случается, когда методу надо выделить и освободить такие
ресурсы, как соединения с базами данных, память или временные
файлы. Альтернативой goto в таких ситуациях обычно является
дублирование кода для очистки ресурсов. В подобных случаях
программист может сравнить нежелательность применения goto с
головной болью от сопровождения дублированного кода и решить,
что goto - меньшее зло.
Вы можете переписать предыдущий пример без goto несколькими
способами, и все они будут иметь как плюсы, так и минусы.
Далее приведены возможные стратегии преобразования:
Переписать с помощью вложенных операторов if При
перезаписи с помощью вложенных ^располагайте блоки if так,
чтобы следующая проверка условия выполнялась, только если
предыдущая завершилась успешно. Это стандартный, приводимый в
учебниках подход к удалению операторов goto. Рассмотрим метод,
переписанный с помощью стандартного подхода:
Код, избавившийся от goto с помощью вложенных If (Visual
Basic)
1 Этот метод стирает группу файлов.
Sub PurgeFiles( ByRef errorState As Error_Code )
Dim filelndex As Integer Dim fileToPurge As Data_File Dim
fileList As File_List Dim numFilesToPurge As Integer
MakePurgeFileList( fileList, numFilesToPurge )
errorState = FileStatus_Success filelndex = 0
Перекрестная ссылка Этот метод также можно переписать,
используя операторы break и без goto. Об этом подходе см.
подраздел "Досрочное завершение цикла" раздела 16.2.
ГЛАВА 17 Нестандартные управляющие структуры
395

Условие While изменено - добавлена проверка errorState.
While ( filelndex < numFilesToPurge And errorState =
FileStatus_Success )
filelndex = filelndex + 1
If FindFile( fileList( filelndex ), fileToPurge ) Then If
OpenFile( fileToPurge ) Then
If OverwriteFile( fileToPurge ) Then If Not Erase( fileToPurge
) Then
errorState = FileStatus_FileEraseError End If
Else ' невозможно перезаписать файл
errorState = FileStatus_FileOverwriteError End If
Else ' невозможно открыть файл
errorState = FileStatus_FileOpenError End If Else ' файл не
найден
Эта строка расположена через 13 строк после условия If, к
Предыдущая << 1 .. 190 191 192 193 194 195 < 196 > 197 198 199 200 201 202 .. 426 >> Следующая