Эта книга посвящена хорошему программированию. Она полна реальных примеров кода. Мы будем рассматривать код с различных направлений: сверху вниз, снизу вверх и даже изнутри. Прочитав книгу, вы узнаете много нового о коде. Более того, вы научитесь отличать хороший код от плохого. Вы узнаете, как писать хороший код и как преобразовать плохой код в хороший.
Книга состоит из трех частей. В первой части излагаются принципы, паттерны и приемы написания чистого кода приводится большой объем примеров кода. Вторая часть состоит из практических сценариев нарастающей сложности. Каждый сценарий представляет собой упражнение по чистке кода или преобразованию проблемного кода в код с меньшим количеством проблем. Третья часть книги — концентрированное выражение ее сути. Она состоит из одной главы с перечнем эвристических правил и «запахов кода», собранных во время анализа. Эта часть представляет собой базу знаний, описывающую наш путь мышления в процессе чтения, написания и чистки кода.
Author(s): Мартин Роберт
Series: Библиотека программиста
Publisher: Питер
Year: 2010
Language: Russian
Pages: 466
Содержание ...... 6
Предисловие ...... 15
Введение ...... 21
Глава 1. Чистый код ...... 24
Да будет код ...... 25
Плохой код ...... 26
Грандиозная переработка ...... 27
Отношение ...... 28
Искусство чистого кода? ...... 29
Что такое «чистый код»? ...... 30
Мы — авторы ...... 37
Предыстория и принципы ...... 38
Литература ...... 39
Глава 2. Содержательные имена (Тим Оттингер) ...... 40
Имена должны передавать намерения программиста ...... 41
Избегайте дезинформации ...... 42
Используйте осмысленные различия ...... 43
Используйте удобопроизносимые имена ...... 45
Избегайте схем кодирования имен ...... 46
Префиксы членов классов ...... 47
Избегайте мысленных преобразований ...... 48
Избегайте остроумия ...... 49
Воздержитесь от каламбуров ...... 50
Используйте имена из пространства задачи ...... 51
Добавьте содержательный контекст ...... 52
Несколько слов напоследок ...... 54
Глава 3. Функции ...... 56
Компактность! ...... 59
Правило одной операции ...... 60
Секции в функциях ...... 61
Чтение кода сверху вниз: правило понижения ...... 62
Команды switch ...... 63
Аргументы функций ...... 65
Стандартные унарные формы ...... 66
Бинарные функции ...... 67
Тернарные функции ...... 68
Глаголы и ключевые слова ...... 69
Избавьтесь от побочных эффектов ...... 70
Разделение команд и запросов ...... 71
Используйте исключения вместо возвращения кодов ошибок ...... 72
Обработка ошибок как одна операция ...... 73
Не повторяйтесь ...... 74
Как научиться писать такие функции? ...... 75
Завершение ...... 76
Литература ...... 79
Глава 4. Комментарии ...... 80
Хорошие комментарии ...... 82
Представление намерений ...... 83
Прояснение ...... 84
Предупреждения о последствиях ...... 85
Усиление ...... 86
Бормотание ...... 87
Избыточные комментарии ...... 88
Недостоверные комментарии ...... 90
Журнальные комментарии ...... 91
Шум ...... 92
Не используйте комментарии там, где можно использовать функцию или переменную ...... 94
Комментарии за закрывающей фигурной скобкой ...... 95
Закомментированный код ...... 96
Нелокальная информация ...... 97
Заголовки функций ...... 98
Пример ...... 99
Литература ...... 102
Глава 5. Форматирование ...... 103
Вертикальное форматирование ...... 104
Газетная метафора ...... 105
Вертикальное разделение концепций ...... 106
Вертикальное сжатие ...... 107
Вертикальные расстояния ...... 108
Горизонтальное форматирование ...... 113
Горизонтальное разделение и сжатие ...... 114
Горизонтальное выравнивание ...... 115
Отступы ...... 117
Вырожденные области видимости ...... 118
Правила форматирования от дядюшки Боба ...... 119
Глава 6. О6ъекты и структуры данных 121
Абстракция данных ...... 122
Антисимметрия данных/объектов ...... 124
Крушение поезда ...... 127
Скрытие структуры ...... 128
Объекты передачи данных ...... 129
Активные записи ...... 130
Литература ...... 131
Глава 7. Обработка ошибок (Майк Физерс) ...... 132
Используйте исключения вместо кодов ошибок ...... 133
Начните с написания команды try-catch-finally ...... 134
Используйте непроверяемые исключения ...... 136
Определяйте классы исключений в контексте потребностей вызывающей стороны ...... 137
Определите нормальный путь выполнения ...... 139
Не возвращайте null ...... 140
Не передавайте null ...... 141
Литература ...... 142
Глава 8. Границы (Джеймс Тренинг) ...... 143
Использование стороннего кода ...... 144
Изучение log4j ...... 146
Учебные тесты: выгоднее, чем бесплатно ...... 148
Использование несуществующего кода ...... 149
Литература ...... 150
Глава 9. Модульные тесты ...... 151
Три закона TTD ...... 152
О чистоте тестов ...... 153
Тесты как средство обеспечения изменений ...... 154
Чистые тесты ...... 155
Двойной стандарт ...... 158
Одна проверка на тест ...... 160
Одна концепция на тест ...... 162
EI.R.S.T ...... 163
Литература ...... 164
Глава 10. Классы (совместно с Джеффом Ланrром) 164
Строение класса ...... 165
Классы должны быть компактными! ...... 166
Принцип единой ответственности (SRP) ...... 168
Связность ...... 170
Поддержание связности приводит к уменьшению классов ...... 171
Структурирование с учетом изменений ...... 177
Изоляция изменений ...... 180
Литература ...... 181
Глава 11. Системы (Кевин Дин Уомплер) ...... 182
Отделение конструирования системы от ее использования ...... 183
Фабрики ...... 185
Внедрение зависимостей ...... 186
Масштабирование ...... 187
Поперечные области ответственности ...... 190
Посредники ...... 191
АОП-инфраструктуры на «чистом» Java ...... 193
Аспекты AspectJ ...... 196
Испытание системной архитектуры ...... 197
Применяйте стандарты разумно, когда они приносят очевидную пользу ...... 198
Системам необходимы предметно-ориентированные языки ...... 199
Литература ...... 199
Глава 12. Формирование архитектуры 200
Четыре правила ...... 201
Правила № 2-4: переработка кода ...... 202
Отсутствие дублирования ...... 203
Выразительность ...... 205
Литература ...... 207
Глава 13. Многопоточность (Бретт Л. Шухерт) ...... 208
Зачем нужна многопоточность? ...... 209
Мифы и неверные представления ...... 210
Трудности ...... 211
Следствие: ограничивайте область видимости данных ...... 212
Следствие: потоки должны быть как можно более независимы ...... 213
Потоково-безопасные коллекции ...... 214
Модель «производители-потребители» ...... 215
Модель «обедающих философов» ...... 216
Синхронизированные секции должны иметь минимальный размер ...... 217
О трудности корректного завершения ...... 218
Рассматривайте непериодические сбои как признаки возможных проблем многопоточности ...... 219
Обеспечьте логическую изоляцию конфигураций многопоточного кода ...... 220
Применяйте инструментовку кода для повышения вероятности сбоев ...... 221
Ручная инструментовка ...... 222
Автоматизированная инструментовка ...... 223
Заключение ...... 224
Литература ...... 225
Глава 14. Последовательное очищение ...... 226
Реализация Args ...... 227
Args: черновик ...... 234
На этом я остановился ...... 246
О постепенном усовершенствовании ...... 247
Аргументы String ...... 249
Заключение ...... 287
Глава 15. Внутреннее строение JUnit ...... 288
Инфраструктура J Unit ...... 289
Заключение ...... 303
Глава 16. Переработка SerialDate ...... 304
Прежде всего — заставить работать 304 Потом очистить код ......307
Заключение ...... 321
Литература ...... 322
Глава 17. Запахи и эвристические правила ...... 323
С4: Плохо написанный комментарий ...... 324
Е2: Тестирование состоит из нескольких этапов ...... 325
G1: Несколько языков в одном исходном файле ...... 326
G4: Отключенные средства безопасности ...... 327
G5: Дублирование ...... 328
G6: Код на неверном уровне абстракции ...... 329
G8: Слишком много информации ...... 330
G11: Непоследовательность ...... 331
G14: Функциональная зависть ...... 332
G15: Аргументы-селекторы ...... 333
G16: Непонятные намерения ...... 334
G18: Неуместные статические методы ...... 335
G20: Имена функций должны описывать выполняемую операцию ...... 336
G22: Преобразование логических зависимостей в физические ...... 337
G24: Соблюдайте стандартные конвенции ...... 339
G25: Заменяйте «волшебные числа» именованными константами ...... 340
G27: Структура важнее конвенций ...... 341
G30: Функции должны выполнять одну операцию ...... 342
G31: Скрытые временные привязки ...... 343
G33: Инкапсулируйте граничные условия ...... 344
G34: Функции должны быть написаны на одном уровне абстракции ...... 345
G35: Храните конфигурационные данные на высоких уровнях ...... 346
G36: Избегайте транзитивных обращений ...... 347
J2: Не наследуйте от констант ...... 348
J3: Константы против перечислений ...... 349
N1: Используйте содержательные имена ...... 350
N2: Выбирайте имена на подходящем уровне абстракции ...... 352
N4: Недвусмысленные имена ...... 353
N6: Избегайте кодирования ...... 354
ТЗ: Не пропускайте тривиальные тесты ...... 355
Т8: Закономерности покрытия кода часто несут полезную информацию ...... 356
Литература ...... 357
Припожение А. Мноrопоточность II 357
Пример приложения «клиент/сервер» ...... 358
Знайте свои библиотеки ...... 368
Зависимости между методами могут нарушить работу многопоточного кода ...... 371
Повышение производительности ...... 376
Взаимная блокировка ...... 378
Тестирование многопоточного кода ...... 382
Средства тестирования многопоточного кода ...... 385
Полные примеры кода ...... 386
Приложение Б. org.jfree.date.SerialDate ...... 391
Приложение В. Перекрестные ссылки ...... 456
Эпилог ...... 459
Алфавитный указатель ...... 460