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

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

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

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

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

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

Макконнелл С. Совершенный код. Мастер-класс — М.: Русская редакция, 2005. — 896 c.
ISBN: 5-469-00822-3
Скачать (прямая ссылка): soversheniykodmasterklass2005.djvu
Предыдущая << 1 .. 171 172 173 174 175 176 < 177 > 178 179 180 181 182 183 .. 426 >> Следующая

Сначала напишите код номинального хода алгоритма, затем
опишите исключительные случаи Пишите код так, чтобы нормальный
путь выполнения был очевиден. Убедитесь, что нестандартные об-
стоятельства не затмевают смысл основного алгоритма. Это важно
как с точки зрения читабельности, так и с точки зрения
производительности.
Убедитесь, что при сравнении на равенство ветвление корректно
Использование > вместо >= или < вместо <= - это аналог ошибки
потери единицы при
ГЛАВА 15 Условные операторы 347
обращении к массиву или вычислении индекса цикла. Чтобы ее
избежать, в операторе цикла следует рассматривать граничные
точки, а в условных операторах
- учитывать случаи равенства.
Размещайте нормальный вариант после if, а не пае- штш Другие
ле else Пишите код так, чтобы нормальный вариант разви-
способы йбрщшм с т$т
тия событий обрабатывался в первую очередь. Это совпада-
обработки ттШ описаны в
ет с главным принципом размещения действий, являющих- разд&ю
19А
ся результатом выбора, как можно ближе к точке этого выбора.
Вот пример кода, который выполняет неоднократную проверку
ошибок, беспорядочно разбросанную по тексту:
Пример кода, который беспорядочно обрабатывает многочисленные
ошибки (Visual Basic)
OpenFile( inputFile, status )
If ( status = Status_Error ) Then
i- Ошибочная ситуация.
L-> errorType = FileOpenError Else
i- Нормальная ситуация.
L-> ReadFile( inputFile, fileData, status )
If ( status = Status_Success ) Then
i- Нормальная ситуация.
L> SummarizeFileData( fileData, summaryData, status )
If ( status = Status_Error ) Then
Ошибочная ситуация.
L-> errorType = ErrorType_DataSummaryError
Else
|- Нормальная ситуация.
L-> PrintSummary( summaryData )
SaveSummaryData( summaryData, status )
If ( status = Status_Error ) Then
i- Ошибочная ситуация.
errorType = ErrorType_SummarySaveError Else
i- Нормальная ситуация.
l-> UpdateAllAccounts()
EraseUndoFile() errorType = ErrorType_None End If End If
Else
348 ЧАСТЬ IV Операторы
errorType = ErrorType_FileReadError
End If
End If
Этот код сложен для понимания, так как в нем перемешаны
нормальные и ошибочные ситуации. Тяжело проследить путь,
проходимый в коде при нормальных обстоятельствах. Кроме того,
так как ошибки иногда обрабатываются в блоке if а не else,
тяжело найти, в каких же ветвях if обрабатываются нормальные
ситуации. В переписанном примере нормальный путь
последовательно кодируется первым, а ошибочные ситуации -
последними. Это упрощает поиск и чтение номинального варианта
алгоритма.
Пример кода, который систематично обрабатывает большое
количество ошибок (Visual Basic)
OpenFile( input File, status )
If ( status = Status_Success ) Then
Нормальная ситуация.
С
Нормальная ситуация.
Нормальная ситуация.
If ( status = Status_Success ) Then
ReadFile( inputFile, fileData, status )
If ( status = Status_Success ) Then
SummarizeFileData( fileData, summaryData, status )
PrintSummary( summaryData ) SaveSummaryData( summaryData,
status ) If ( status = Status_Success ) Then

Нормальная ситуация.
UpdateAllAccounts() EraseUndoFile() errorType = ErrorType_None
Else

Ошибочная ситуация.
errorType = ErrorType_SummarySaveError End If Else

Ошибочная ситуация.
errorType = ErrorType_DataSummaryError End If Else

Ошибочная ситуация.
errorType = ErrorType_FileReadError End If Else
ГЛАВА 15 Условные операторы 349
г- Ошибочная ситуация.
Ч> errorType = ErrorType_FileOpenError End If
Здесь можно проследить главное направление ^-проверок, чтобы
выяснить нормальный вариант событий. Этот фрагмент позволяет
фокусировать чтение в основном направлении, а не преодолевать
исключительные ситуации, поэтому этот код в целом читабельнее.
Стек ошибочных условий, расположенный внизу вложения, -
признак хорошо написанного кода обработки ошибок.
Этот пример иллюстрирует один систематический подход к
обработке нормальных и ошибочных ситуаций. Другие решения этой
проблемы: использование предохранительных конструкций,
диспетчеризация полиморфных объектов, вынесение внутренних
проверок в отдельные методы - обсуждаются на протяжении всей
книги. Полный список существующих подходов см. в разделе 19.4.
Размещайте осмысленные выражения после оператора if Иногда
можно встретить код, в котором блок if пуст:
Пример пустого блока if (Java)
if ( SomeTest )
else
// делаем что-то
}
Опытные программисты не станут писать такой код хотя бы затем,
чтобы избежать лишней работы по вводу пустой строки и
оператора else. Этот код выглядит глупо и может быть легко
улучшен путем отрицания предиката в выражении if перемещения
кода из блока else в блок if и удаления блока else. Вот как
будет выглядеть код после таких изменений:
Пример преобразования пустого блока If (Java)
if ( ! someTest ) {
// делаем что-то
Перекрестная тшт Один из ключей к конструированию эф* фектишго
оператора co
rn логического выражения, Об эффективном применении логических
Предыдущая << 1 .. 171 172 173 174 175 176 < 177 > 178 179 180 181 182 183 .. 426 >> Следующая