Главная страница
Навигация по странице:

  • Глава 7. Обработка ошибок

  • Глава 8 . Границы

  • Глава 9 . Модульные тесты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150

  • Глава 10 . Классы

  • Глава 11 . Системы

  • Глава 12. Формирование архитектуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200

  • Глава 13. Многопоточность

  • Глава 14. Последовательное очищение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225

  • Глава 15. Внутреннее строение JUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287

  • Глава 16. Переработка SerialDate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303

  • Глава 17. Запахи и эвристические правила . . . . . . . . . . . . . . . . . . . . . . . . . . 322

  • Создание, анализ ирефакторинг


    Скачать 3.16 Mb.
    НазваниеСоздание, анализ ирефакторинг
    Дата29.09.2022
    Размер3.16 Mb.
    Формат файлаpdf
    Имя файлаChistyj_kod_-_Sozdanie_analiz_i_refaktoring_(2013).pdf
    ТипКнига
    #706087
    страница2 из 49
    1   2   3   4   5   6   7   8   9   ...   49
    Глава 6. Объекты и структуры данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
    Абстракция данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 121
    Антисимметрия данных/объектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123
    Закон Деметры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
    Крушение поезда . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 126
    Гибриды . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
    Скрытие структуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
    Объекты передачи данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
    Активные записи . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129
    Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
    Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
    Глава 7. Обработка ошибок (Майк Физерс) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
    Используйте исключения вместо кодов ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
    Начните с написания команды try-catch-finally . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 7

    8
    Содержание
    Используйте непроверяемые исключения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135
    Передавайте контекст с исключениями . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
    Определяйте классы исключений в контексте потребностей вызывающей стороны . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
    Определите нормальный путь выполнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
    Не возвращайте null . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
    Не передавайте null . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
    Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
    Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
    Глава 8 . Границы (Джеймс Гренинг) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
    Использование стороннего кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
    Исследование и анализ границ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
    Изучение log4j . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
    Учебные тесты: выгоднее, чем бесплатно . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
    Использование несуществующего кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
    Чистые границы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
    Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
    Глава 9 . Модульные тесты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
    Три закона TTD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
    О чистоте тестов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 152
    Тесты как средство обеспечения изменений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 153
    Чистые тесты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
    Предметно-ориентированный язык тестирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
    Двойной стандарт . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
    Одна проверка на тест . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159
    Одна концепция на тест . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
    F .I .R .S .T . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
    Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
    Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
    Глава 10 . Классы (совместно с Джеффом Лангром) . . . . . . . . . . . . . . . . . . . . . . . 164
    Строение класса . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
    Инкапсуляция . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
    Классы должны быть компактными! . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 165
    Принцип единой ответственности (SRP) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
    Связность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
    Поддержание связности приводит к уменьшению классов . . . . . . . . . . . . . . . . . . . . 170
    Структурирование с учетом изменений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176
    Изоляция изменений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
    Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
    Глава 11 . Системы (Кевин Дин Уомплер) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
    Как бы вы строили город? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182
    Отделение конструирования системы от ее использования . . . . . . . . . . . . . . . . . . . . . . . 182
    Отделение main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
    Фабрики . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184
    Внедрение зависимостей . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 185 8

    Оглавление
    9
    Масштабирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 186
    Поперечные области ответственности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
    Посредники . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 190
    АОП-инфраструктуры на «чистом» Java . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192
    Аспекты AspectJ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
    Испытание системной архитектуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196
    Оптимизация принятия решений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
    Применяйте стандарты разумно, когда они приносят очевидную пользу . . . . . . . . . . 197
    Системам необходимы предметно-ориентированные языки . . . . . . . . . . . . . . . . . . . 198
    Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
    Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
    Глава 12. Формирование архитектуры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
    Четыре правила . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200
    Правило № 1: выполнение всех тестов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
    Правила № 2–4: переработка кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
    Отсутствие дублирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
    Выразительность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204
    Минимум классов и методов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
    Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
    Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
    Глава 13. Многопоточность (Бретт Л. Шухерт) . . . . . . . . . . . . . . . . . . . . . . . . . 207
    Зачем нужна многопоточность? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
    Мифы и неверные представления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209
    Трудности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
    Защита от ошибок многопоточности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
    Принцип единой ответственности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 211
    Следствие: ограничивайте область видимости данных . . . . . . . . . . . . . . . . . . . . . . . . 211
    Следствие: используйте копии данных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
    Следствие: потоки должны быть как можно более независимы . . . . . . . . . . . . . . . . 212
    Знайте свою библиотеку . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
    Потоково-безопасные коллекции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
    Знайте модели выполнения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
    Модель «производители-потребители» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
    Модель «читатели-писатели» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
    Модель «обедающих философов» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
    Остерегайтесь зависимостей между синхронизированными методами . . . . . . . . . . . . 216
    Синхронизированные секции должны иметь минимальный размер . . . . . . . . . . . . . . . 216
    О трудности корректного завершения . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
    Тестирование многопоточного кода . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
    Рассматривайте непериодические сбои как признаки возможных проблем многопоточности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218
    Начните с отладки основного кода, не связанного с многопоточностью . . . . . . . . 219
    Реализуйте переключение конфигураций многопоточного кода . . . . . . . . . . . . . . . 219
    Обеспечьте логическую изоляцию конфигураций многопоточного кода . . . . . . . 219
    Протестируйте программу с количеством потоков, превышающим количество процессоров . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
    Протестируйте программу на разных платформах . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 9

    10
    Содержание
    Применяйте инструментовку кода для повышения вероятности сбоев . . . . . . . . 220
    Ручная инструментовка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
    Автоматизированная инструментовка . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
    Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
    Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 224
    Глава 14. Последовательное очищение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
    Реализация Args . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
    Как я это сделал? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
    Args: черновик . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
    На этом я остановился . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
    О постепенном усовершенствовании . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
    Аргументы String . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 248
    Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
    Глава 15. Внутреннее строение JUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287
    Инфраструктура JUnit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
    Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
    Глава 16. Переработка SerialDate . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
    Прежде всего — заставить работать . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
    …Потом очистить код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 306
    Заключение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
    Литература . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
    Глава 17. Запахи и эвристические правила . . . . . . . . . . . . . . . . . . . . . . . . . . 322
    Комментарии . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
    C1: Неуместная информация . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
    C2: Устаревший комментарий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
    C3: Избыточный комментарий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
    C4: Плохо написанный комментарий . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
    C5: Закомментированный код . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
    Рабочая среда . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
    E1: Построение состоит из нескольких этапов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
    E2: Тестирование состоит из нескольких этапов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 324
    Функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
    F1: Слишком много аргументов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
    F2: Выходные аргументы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
    F3: Флаги в аргументах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
    F4: Мертвые функции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
    Разное . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
    G1: Несколько языков в одном исходном файле . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
    G2: Очевидное поведение не реализовано . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
    G3: Некорректное граничное поведение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
    G4: Отключенные средства безопасности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
    G5: Дублирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
    G6: Код на неверном уровне абстракции . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
    G7: Базовые классы, зависящие от производных . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329 10

    Оглавление
    1   2   3   4   5   6   7   8   9   ...   49


    написать администратору сайта