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

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

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

которому она относится.
errorState = FileStatus_FileFindError End If Wend
DeletePurgeFileList( fileList, numFilesToPurge )
End Sub
Тому, кто привык программировать без goto, возможно, будет
легче читать этот код, чем первоначальную версию. И если вы
используете данный вариант, вам не придется предстать перед
судом противников goto.
Основной недостаток этого подхода с вложенными if в том, кыяка
Q6 отсту_
что уровень вложенности глубок, даже слишком. Для пони- ш и
других вопросах разш-
мания кода вам нужно держать в голове весь набор вложен- ки
кода главу 31 Об уров-
ных ^одновременно. Более того, расстояние между кодом
ияхвложенности
ом,раздел 1М
обработки ошибок и кодом, ее инициирующим, слишком
велико: например, выражение, присваивающее переменной
errorState значение FileStatus_FileFindError, на 13 строк
отстоит от соответствующей проверки if.
В варианте с goto ни одно выражение не отстоит более чем на
четыре строки от условия, которое его вызывает. И вам нет
нужды держать в голове всю структуру одновременно. По сути вы
можете игнорировать все предыдущие условия, выполненные
успешно, и сосредоточиться на следующей операции. В этом
случае версия с goto гораздо удобнее для чтения и
сопровождения, чем с вложенными if.
Переписать код с использованием статусной переменной Чтобы
переписать код с использованием статусной переменной (также
называемой переменной состояния), создайте переменную, которая
будет показывать, не находится ли метод в состоянии ошибки. В
нашем случае метод уже содержит статусную переменную
errorState, так что вы можете использовать ее.

14-403
396 ЧАСТЬ IV Операторы
Код, избавившийся от 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 изменено - добавлена проверка errorState.
While ( filelndex < numFilesToPurge ) And ( errorState =
FileStatus_Success ) filelndex = filelndex + 1
If Not FindFile( fileList( filelndex ), fileToPurge ) Then
errorState = FileStatus_FileFindError End If
Проверяется статусная переменная.
If ( errorState = FileStatus_Success ) Then If Not OpenFile(
fileToPurge ) Then errorState = FileStatus_FileOpenError End
If End If
Проверяется статусная переменная.
If ( errorState = FileStatus_Success ) Then If Not
OverwriteFile( fileToPurge ) Then
errorState = FileStatus_FileOverwriteError End If End If
Проверяется статусная переменная.
If ( errorState = FileStatus_Success ) Then If Not Erase(
fileToPurge ) Then
errorState = FileStatus_FileEraseError End If End If Wend
DeletePurgeFileList( fileList, numFilesToPurge )
End Sub
Преимущество подхода со статусной переменной в том, что он
позволяет избежать глубоко вложенных структур if-tben-else,
используемых в предыдущем примере, и тем самым легче для
понимания. Кроме того, он помещает действия, еле-







ГЛАВА 17 Нестандартные управляющие структуры
397
дующие за проверкой if-then-else, ближе к месту самой
проверки, чем в случае с вложенными if и совсем не использует
блоки else.
Понимание версии с вложенными ^требует некоторой умственной
гимнастики. Вариант со статусной переменной легче для
понимания, потому что лучше моделирует способ человеческого
мышления. Вы ищете файл. Если все в порядке, вы открываете
файл. Если все до сих пор в порядке, вы перезаписываете файл.
Если все до сих пор в порядке...
Недостаток этого подхода в том, что использование статусных
переменных - не настолько распространенная практика, как
хотелось бы. Подробно документируйте их применение, иначе
некоторые программисты могут не понять, что вы имели в виду. В
данном примере применение хорошо названных перечислимых типов
оказывает существенную помощь.
Переписать с помощью try-finally Некоторые языки, включая
Visual Basic и Java, предоставляют конструкцию try-finally,
которая может быть использована для очистки ресурсов в случае
ошибки.
Чтобы переписать пример, используя подход с try-finally,
поместите код, который должен проверять возможные ошибки, в
блок try, а код очистки - в блок finally. Блок try задает
область обработки исключений, a finally выполняет любое осво-
бождение ресурсов. Блок finally будет вызываться всегда
независимо от того, будет ли сгенерировано исключение и будет
ли это исключение перехвачено в методе PurgeFilesQ.
Код, избавившийся от goto с помощью try-finally (Visual Basic)
' Этот метод стирает группу файлов. Исключения передаются
вызывающей стороне.
Sub PurgeFilesO
Dim filelndex As Integer
Dim fileToPurge As Data_File
Dim fileList As File_List
Dim numFilesToPurge As Integer
MakePurgeFileList( fileList, numFilesToPurge )
Try
filelndex = 0
Предыдущая << 1 .. 191 192 193 194 195 196 < 197 > 198 199 200 201 202 203 .. 426 >> Следующая