Предисловие Хейса Маккормика III | 13 |
|
Предисловие автора | 15 |
|
Благодарности | 18 |
|
О книге | 20 |
Структура книги | 20 |
От издательства | 22 |
|
Часть I |
|
Глава 1 • Грустные истории об анти-паттернах | 24 |
|
Свободное падение на языке Java | 24 |
Анти-паттерны в жизни | 27 |
Паттерны: изучение положительного опыта | 28 |
Анти-паттерны: изучение чужих ошибок | 28 |
Некоторые распространённые анти-паттерны | 29 |
Анти-паттерны на практике | 30 |
Идеи анти-паттернов не новы | 31 |
Примеры из других областей | 32 |
Детективная работа | 33 |
Переработка решения и устранение анти-паттернов | 35 |
Зачем была написана эта книга? | 36 |
Подход, использованный в книге | 36 |
Инструментарий, использованный в книге | 36 |
Структура книги | 37 |
Взгляд в будущее | 39 |
|
Глава 2 • Общая ситуация | 40 |
|
Благодатная почва для анти-паттернов | 40 |
Преимущества многоуровневых структур | 41 |
Недостатки многоуровневых структур | 43 |
Технологии Интернета | 44 |
Влияние топологии Интернета на приложения | 45 |
Безопасность в сетях организаций | 46 |
Базовые стандарты Интернета и дополнительные уровни | 48 |
Низкоуровневые коммуникации на базе TCP и IP | 49 |
HTTP: транспортный протокол уровня приложения | 50 |
HTML и XML | 50 |
Мелкий анти-паттерн: Избыток объектов на веб-странице | 52 |
Объектные технологии и анти-паттерны | 53 |
Инкапсуляция | 54 |
Наследование | 55 |
Полиморфизм | 55 |
Мелкие анти-паттерны: Избыточные уровни | 56 |
Приход Java | 59 |
Технологии Java и борьба с анти-паттернами | 59 |
Каскадный метод | 61 |
Итеративные методы | 62 |
Мелкие анти-паттерны: Неполное преобразование процесса | 63 |
Экстремальное программирование | 64 |
Итоги | 65 |
Анти-паттерны этой главы | 66 |
Избыток объектов на веб-странице | 66 |
Избыточные уровни | 67 |
Неполное преобразование процесса | 67 |
|
Часть II |
|
Глава 3 • Сервлеты | 70 |
|
Ошибки на старте | 71 |
Исторический анти-паттерн: Волшебная кнопка | 71 |
Паттерн «Модель-представление-контроллер» | 72 |
Отсутствие разделения модели и представления | 73 |
Выделение модели | 73 |
Анти-паттерн: Волшебный сервлет | 75 |
Может ли сервлет использоваться в качестве модели? | 76 |
Ловушка «Волшебного сервлета» | 78 |
Причины появления «Волшебного сервлета» | 82 |
Решение: переработка с применением команд | 83 |
Выделение модели | 84 |
Инкапсуляция модели в объектах команд | 84 |
Выделение модельной логики | 85 |
Отделение возврата | 90 |
Использование JSP при возврате | 92 |
Итоги | 94 |
Анти-паттерны этой главы | 95 |
Волшебный сервлет | 95 |
|
Глава 4 • JSP | 97 |
|
На середине пути | 97 |
Признаки опасности | 98 |
Анти-паттерн: Монолитная страница JSP | 99 |
Отделение модели от представления | 100 |
Решение: переработка в архитектуру «Модель-представление-контроллер» | 102 |
Анти-паттерн: Составная страница JSP | 103 |
Нужно ли объединять страницы JSP? | 104 |
Пример с объединением двух интерфейсов | 105 |
Решение: разбиение JSP | 109 |
Принятие решений в контроллере | 109 |
Мелкие анти-паттерны: Слишком крупные и мелкие команды | 113 |
Чрезмерная группировка команд | 114 |
Решение: переработка с правильной гранулярностью | 114 |
Рекомендации по выбору гранулярности | 116 |
Мелкий анти-паттерн: Жирная команда | 117 |
Анти-паттерны JSP | 117 |
Анти-паттерны этой главы | 118 |
Монолитная страница JSP | 118 |
Составная страница JSP | 119 |
Крупные и мелкие команды | 119 |
Жирные команды | 120 |
|
Глава 5 • Кэширование | 121 |
|
Даёшь кэширование! | 121 |
Анти-паттерн: Отсутствие кэша | 123 |
Плохой вариант: BBS без кэширования | 124 |
Модель, представление и контроллер в треугольнике ShowBoard | 126 |
Модель, представление и контроллер для вывода обсуждения | 128 |
Модель, представление и контроллер для добавления нового сообщения | 132 |
Проблемы производительности | 138 |
Решение: кэширование | 138 |
Решение 1. Аппаратный кэш | 139 |
Решение 2. Кэширование команд | 139 |
Реализация кэша в примере с форумом | 141 |
Возможные усовершенствования кэша команд | 146 |
Мелкие анти-паттерны, связанные с кэшированием | 148 |
Параллельный доступ к статическому кэшу | 149 |
Разрастание кэша | 149 |
Анти-паттерн: Монопольная синхронизация чтения/записи | 150 |
Снижение производительности вследствие конфликтов между |
операциями чтения | 151 |
Правильная организация совместного доступа с использованием |
блокировок чтения/записи | 151 |
Решение проблем с кэшированием | 153 |
Анти-паттерны этой главы | 154 |
Отсутствие кэша | 154 |
Монопольная синхронизация чтения/записи | 155 |
|
Глава 6 • Управление памятью | 156 |
|
Утечка памяти и анти-паттерны | 156 |
Управление памятью | 157 |
Уборка мусора | 158 |
Подсчёт ссылок | 159 |
Достижимость объеюов | 160 |
Переход с C++ на Java | 160 |
Возникновение утечки памяти в Java | 161 |
Поиск утечек памяти в Java | 162 |
Анти-паттерн: Неиспользуемый слушатель | 163 |
Опасные привычки | 164 |
Решение 1. Явное удаление слушателей | 166 |
Решение 2. Сокращение жизненного цикла якорного объекта | 168 |
Решение 3. Ослабление ссылки | 168 |
Ссылочные объекты упрощают управление памятью | 168 |
Анти-паттерн: Утечка в коллекциях | 169 |
Проблемы с кэшами и сеансовыми данными | 171 |
Решение 1. Поиск стандартных признаков | 171 |
Решение 2. Жёсткое сопоставление парных операций | 172 |
Решение 3. Использование мягких ссылок при кэшировании | 172 |
Решение 4. Использование коллекций со слабыми ссылками | 173 |
Решение 5. Использование finally | 173 |
Борьба с утечкой памяти | 173 |
Выявление утечки памяти | 174 |
Принятие решения об исправлении | 175 |
Изоляция проблемы | 176 |
Определение причины и исправление ошибки | 176 |
Страховка от будущего повторения утечки памяти | 178 |
Мелкие анти-паттерны: Стадо поросят | 178 |
Коллекции | 179 |
Иерархия наследования | 180 |
Итоги | 181 |
Анти-паттерны этой главы | 181 |
Неиспользуемый слушатель | 181 |
Утечка в коллекциях | 182 |
|
Глава 7 • Подключения и привязка | 183 |
|
Создание подключений | 183 |
Анти-паттерн: Суета с подключениями | 184 |
Создание и закрытие подключения при каждом обращении | 185 |
Решение: пул подключений | 186 |
Переработка интернет-форума для поддержки пулов подключений | 188 |
Использование метода getPooledConnection | 190 |
Архитектура коннекторов J2EE | 191 |
Анти-паттерн: Разделённое закрытие | 192 |
Проявления анти-паттерна при обработке исключений | 194 |
Решение: закрытие подключения в блоке finally | 194 |
Анти-паттерн: Жёсткое подключение | 196 |
Коммуникационный буфер | 197 |
Преждевременное связывание | 200 |
Решение 1. Разделение с использованием сообщений XML | 200 |
Решение 2. Отложенное связывание с использованием веб-служб | 202 |
Мелкие анти-паттерны при использовании XML | 203 |
Золотой молоток | 203 |
Сложности с переходами | 204 |
Мелкие анти-паттерны: Негибкий XML | 205 |
Конфликты имён | 205 |
Негибкие конструкции | 208 |
Контейнеры с переменным содержимым | 209 |
Контроль версии | 212 |
Итоги | 213 |
Анти-паттерны этой главы | 213 |
Суета с подключениями | 213 |
Разделенное закрытие | 214 |
Жёсткое подключение | 214 |
Неправильное использование XML | 215 |
Негибкий XML | 216 |
|
Глава 8 • EJB | 217 |
|
Краткий обзор Enterprise JavaBeans | 217 |
Распределённая архитектура на базе компонентов | 218 |
Разновидности EJB | 219 |
Интернет-форум на базе EJB | 220 |
Структура приложения EJB | 221 |
Построение удалённого интерфейса | 222 |
Создание домашнего интерфейса | 224 |
Реализация класса компонента | 225 |
Класс компонента Board | 225 |
Определение первичного ключа | 231 |
Создание дескриптора применения | 231 |
Использование модели | 234 |
Анти-паттерн: Лишние обращения | 234 |
Оценка затрат в распределённой модели | 234 |
Интерфейс с избытком коммуникационных циклов | 236 |
Решение: группировка циклов в фасаде | 237 |
Корни анти-паттерна | 238 |
Переработка интернет-форума с применением фасада | 239 |
Анти-паттерн: Квадратная пробка для круглой дыры | 245 |
Мелкий анти-паттерн: Объединение данных под управлением компонента | 246 |
Решение: объединение под управлением компонента | 247 |
Мелкий анти-паттерн: Применение компонентов сданными |
при решении простых задач | 247 |
Мелкий анти-паттерн: Компоненты с данными, используемые |
только для чтения | 249 |
Мелкий анти-паттерн: Компоненты сданными, используемые |
только для записи | 249 |
Многостраничные списки | 249 |
Общее решение: правильный выбор типа компонента |
для конкретной задачи | 250 |
Мелкий анти-паттерн: Бездумное применение EJB | 251 |
EJB и кэширование | 252 |
Реализация кэширования в фасаде | 252 |
Итоги | 253 |
Анти-паттерны этой главы | 254 |
Лишние обращения | 254 |
Квадратная пробка для круглой дыры | 255 |
Бездумное применение EJB | 256 |
|
Часть III |
|
Глава 9 • Культура программирования | 258 |
|
Зачем изучать культуру программирования? | 259 |
Экстремальное программирование требует высокой культуры | 259 |
Стандарты оформления кода как средство борьбы с анти-паттернами | 260 |
Мелкие анти-паттерны: Нечитаемый код | 262 |
Выбор имён | 262 |
Стандарты выбора имён | 263 |
Фигурные скобки и отступы | 267 |
Комментарии | 269 |
Табуляция и пробелы | 272 |
Редакторы | 273 |
Мелкие анти-паттерны: организация и видимость | 273 |
Мелкие анти-паттерны: структура программы | 276 |
Основные принципы объектно-ориентированного программирования | 277 |
Низкоуровневые архитектурные факторы | 278 |
Исключения | 280 |
Мелкие анти-паттерны: утечки ресурсов и производительность | 281 |
Правила тестирования | 283 |
Написание хорошего руководства по стилю | 284 |
Купить, позаимствовать, украсть? | 285 |
Короткое руководство по стилю программирования от Contextual, Inc | 285 |
Сводка стандартов оформления кода | 288 |
|
Глава 10 • Масштабируемость | 292 |
|
Топологии, обеспечивающие хорошую производительность | 293 |
Группировка однородного оборудования | 295 |
Другие варианты топологии | 297 |
Анти-паттерн: Запоздалая забота о производительности | 298 |
Разработка без планирования производительности | 299 |
Примеры из практики | 301 |
Решение: планирование производительности | 301 |
Анти-паттерн: Лишние обращения | 304 |
Решение: кэш и фасад | 301 |
Анти-паттерн: Плохое управление нагрузкой | 307 |
Решение: управление нагрузкой | 308 |
Полноценная балансировка нагрузки | 311 |
Анти-паттерн: Хаотическое управление сеансовыми данными | 312 |
Решение 1. Диспетчеризация с учётом сеансовой привязки | 312 |
Решение 2. Использование распределённых средств управления |
состоянием | 312 |
Решения на базе сеансовых компонентов | 313 |
Решения на базе компонентов с данными | 313 |
Анти-паттерн: Бестолковая оптимизация | 314 |
Решение: использование правильной методики оптимизации | 315 |
Итоги | 317 |
Анти-паттерны этой главы | 317 |
Запоздалая забота о производительности | 317 |
Лишние обращения | 318 |
Плохое управление нагрузкой | 319 |
Хаотическое управление сеансовыми данными | 319 |
Бестолковая оптимизация | 320 |
|
Глава 11 • Прощальные размышления | 321 |
|
Анти-паттерны на разных уровнях | 322 |
Карьерные перспективы | 322 |
Понимание анти-паттернов улучшает программы | 323 |
Понимание анти-паттернов улучшает программистов | 323 |
Интеграция борьбы с анти-паттернами | 324 |
Следующий шаг, последний шаг | 326 |
|
Алфавитный указатель | 328 |