Оглавление
Предисловие . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 9
Благодарности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Глава 1. Рождение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
1.1. Не используйте имена, заканчивающиеся на -er . . . . . . . . . . . . 17
1.2. Сделайте один конструктор главным . . . . . . . . . . . . . . . . . . . . . . 28
1.3. В конструкторах не должно быть кода . . . . . . . . . . . . . . . . . . . . . 34
Глава 2. Образование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
2.1. Инкапсулируйте как можно меньше . . . . . . . . . . . . . . . . . . . . . . . 43
2.2. Инкапсулируйте хотя бы что-нибудь . . . . . . . . . . . . . . . . . . . . . . 47
2.3. Всегда используйте интерфейсы . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
2.4. Тщательно выбирайте имена методов . . . . . . . . . . . . . . . . . . . . . . 54
Строители — это существительные . . . . . . . . . . . . . . . . . . . . . . 57
Манипуляторы — это глаголы . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Примеры . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
Методы, возвращающие логические значения . . . . . . . . . . . 63
2.5. Не используйте публичные константы . . . . . . . . . . . . . . . . . . . . . 64
Привнесение сцепления . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
Потеря цельности . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
2.6. Делайте классы неизменяемыми . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
Изменяемость идентичности . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78
Атомарность отказов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Временное сцепление . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Отсутствие побочных эффектов . . . . . . . . . . . . . . . . . . . . . . . . . 83
Никаких нулевых (NULL) ссылок . . . . . . . . . . . . . . . . . . . . . . . 84
Потокобезопасность . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
Меньшие и более простые объекты . . . . . . . . . . . . . . . . . . . . . . 89
2.7. Пишите тесты, а не документацию . . . . . . . . . . . . . . . . . . . . . . . . . 93
2.8. Используйте fake-объекты вместо
mock-объектов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
2.9. Делайте интерфейсы краткими, используйте
smart-классы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Глава 3. Работа . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
3.1. Предоставляйте менее пяти публичных методов . . . . . . . . . . 115
3.2. Не используйте статические методы . . . . . . . . . . . . . . . . . . . . . . 117
Объектное мышление против компьютерного . . . . . . . . . . . 119
Декларативный стиль против императивного . . . . . . . . . . . 122
6 Оглавление
Классы-утилиты . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132
Паттерн «Синглтон» . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133
Функциональное программирование . . . . . . . . . . . . . . . . . . . 138
Компонуемые декораторы . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
3.3. Не допускайте аргументов со значением NULL . . . . . . . . . . . . 146
3.4. Будьте лояльным и неизменяемым
либо константным . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
3.5. Никогда не используйте геттеры и сеттеры . . . . . . . . . . . . . . . . 171
Объекты против структур данных . . . . . . . . . . . . . . . . . . . . . . 172
Благими намерениями вымощена дорога в ад . . . . . . . . . . . 176
Все дело в префиксах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178
3.6. Не используйте оператор new вне вторичных
конструкторов . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 189
3.7. Избегайте интроспекции и приведения типов . . . . . . . . . . . . . 194
Глава 4. Уход на пенсию . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
4.1. Никогда не возвращайте NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . 202
Отказывать как можно скорее или как можно
безопаснее? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Альтернативы NULL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
4.2. Бросайте только проверяемые исключения . . . . . . . . . . . . . . . 211
Не ловите исключения без необходимости . . . . . . . . . . . . . . 214
Стройте цепочки исключений . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Восстанавливайтесь единожды . . . . . . . . . . . . . . . . . . . . . . . . . 219
Оглавление 7
Используйте аспектно-ориентированное
программирование . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Достаточно одного типа исключений . . . . . . . . . . . . . . . . . . . 224
4.3. Будьте либо константным, либо абстрактным . . . . . . . . . . . . . 230
4.4. Используйте принцип RAII . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
Эпилог . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239
8 Оглавление