Система Orphus

Горький вкус Java. Библиотека программиста

Библиотека программиста

Автор: Брюс Тейт
Издательство: "Питер", 2002
336 страниц

Материал предоставил: Валерий Лаптев
Найти в магазинах

Аннотация

Оглавление
Комментарии

Аннотация

Книга представляет собой систематизированный сборник ошибок серверного программирования на языке Java с описанием их причин и возможных решений. В ней приводятся анти-паттерны для таких фундаментальных концепций Java и J2EE, как сервлеты, JSP, компоненты EJB, модели подключений в корпоративных сетях и масштабирование. Книга написана для программистов Java среднего уровня, аналитиков или разработчиков архитектур, не желающих повторять чужие ошибки.

Оглавление

Предисловие

Предисловие Хейса Маккормика III
Предисловие автора
Благодарности
О книге

Предисловие

Структура книги

Часть I

Глава 1. Грустные истории об анти-паттернах

Свободное падение на языке Java
Анти-паттерны в жизни
Паттерны: изучение положительного опыта
Анти-паттерны: изучение чужих ошибок
Некоторые распространенные анти-паттерны
Анти-паттерны на практике
Идеи анти-паттернов не новы
Примеры из других областей
Детективная работа
Переработка решения и устранение анти-паттернов
Зачем была написана эта книга?
Подход, использованный в книге
Инструментарий, использованный в книге
Структура книги
Взгляд в будущее

Глава 2. Общая ситуация

Благодатная почва для анти-паттернов
Преимущества многоуровневых структур
Недостатки многоуровневых структур
Технологии Интернета
Влияние топологии Интернета на приложения
Безопасность в сетях организаций
Базовые стандарты Интернета и дополнительные уровни
Низкоуровневые коммуникации на базе TCP и IP
HTTP: транспортный протокол уровня приложения
HTML и XML
Мелкий анти-паттерн: Избыток объектов на веб-странице
Объектные технологии и анти-паттерны
Инкапсуляция
Наследование
Полиморфизм
Мелкие анти-паттерны: Избыточные уровни
Приход Java
Технологии Java и борьба с анти-паттернами
Каскадный метод
Итеративные методы
Мелкие анти-паттерны: Неполное преобразование процесса
Экстремальное программирование
Итоги
Анти-паттерны этой главы
Избыток объектов на веб-странице
Избыточные уровни
Неполное преобразование процесса

Часть II

Глава 3. Сервлеты

Ошибки на старте
Исторический анти-паттерн: Волшебная кнопка
Паттерн "Модель-представление-контроллер"
Отсутствие разделения модели и представления
Выделение модели
Анти-паттерн: Волшебный сервлет
Может ли сервлет использоваться в качестве модели?
Ловушка "Волшебного сервлета"
Причины появления "Волшебного сервлета"
Решение: переработка с применением команд
Выделение модели
Инкапсуляция модели в объектах команд
Выделение модельной логики
Отделение возврата
Использование JSP при возврате
Итоги
Анти-паттерны этой главы
Волшебный сервлет

Глава 4. JSP

На середине пути
Признаки опасности
Анти-паттерн: Монолитная страница JSP
Отделение модели от представления
Решение: переработка в архитектуру "Модель-представление-контроллер"
Анти-паттерн: Составная страница JSP
Нужно ли объединять страницы JSP?
Пример с объединением двух интерфейсов
Решение: разбиение JSP
Принятие решений в контроллере
Мелкие анти-паттерны: Слишком крупные и мелкие команды
Чрезмерная группировка команд
Решение: переработка с правильной гранулярностью
Рекомендации по выбору гранулярности
Мелкий анти-паттерн: Жирная команда
Анти-паттерны JSP
Анти-паттерны этой главы
Монолитная страница JSP
Составная страница JSP
Крупные и мелкие команды
Жирные команды

Глава 5. Кэширование

Даешь кэширование!
Анти-паттерн: Отсутствие кэша
Плохой вариант: BBS без кэширования
Модель, представление и контроллер в треугольнике ShowBoard
Модель, представление и контроллер для вывода обсуждения
Модель, представление и контроллер для добавления нового сообщения
Проблемы производительности
Решение: кэширование
Решение 1. Аппаратный кэш
Решение 2. Кэширование команд
Реализация кэша в примере с форумом
Возможные усовершенствования кэша команд
Мелкие анти-паттерны, связанные с кэшированием
Параллельный доступ к статическому кэшу
Разрастание кэша
Анти-паттерн: Монопольная синхронизация чтения/записи
Снижение производительности вследствие конфликтов между операциями чтения
Правильная организация совместного доступа с использованием блокировок чтения/записи
Решение проблем с кэшированием
Анти-паттерны этой главы
Отсутствие кэша
Монопольная синхронизация чтения/записи

Глава 6. Управление памятью

Утечка памяти и анти-паттерны
Управление памятью
Уборка мусора
Подсчет ссылок
Достижимость объектов
Переход с C++ на Java
Возникновение утечки памяти в Java
Поиск утечек памяти в Java
Анти-паттерн: Неиспользуемый слушатель
Опасные привычки
Решение 1. Явное удаление слушателей
Решение 2. Сокращение жизненного цикла якорного объекта
Решение 3. Ослабление ссылки
Ссылочные объекты упрощают управление памятью
Анти-паттерн: Утечка в коллекциях
Проблемы с кэшами и сеансовыми данными
Решение 1. Поиск стандартных признаков
Решение 2. Жесткое сопоставление парных операций
Решение 3. Использование мягких ссылок при кэшировании
Решение 4. Использование коллекций со слабыми ссылками
Решение 5. Использование finally
Борьба с утечкой памяти
Выявление утечки памяти
Принятие решения об исправлении
Изоляция проблемы
Определение причины и исправление ошибки
Страховка от будущего повторения утечки памяти
Мелкие анти-паттерны: Стадо поросят
Коллекции
Иерархия наследования
Итоги
Анти-паттерны этой главы
Неиспользуемый слушатель
Утечка в коллекциях

Глава 7. Подключения и привязка

Создание подключений
Анти-паттерн: Суета с подключениями
Создание и закрытие подключения при каждом обращении
Решение: пул подключений
Переработка интернет-форума для поддержки пулов подключений
Использование метода getPooledConnection
Архитектура коннекторов J2EE
Анти-паттерн: Разделенное закрытие
Проявления анти-паттерна при обработке исключений
Решение: закрытие подключения в блоке finally
Анти-паттерн: Жесткое подключение
Коммуникационный буфер
Преждевременное связывание
Решение 1. Разделение с использованием сообщений XML
Решение 2. Отложенное связывание с использованием веб-служб
Мелкие анти-паттерны при использовании XML
Золотой молоток
Сложности с переходами
Мелкие анти-паттерны: Негибкий XML
Конфликты имен
Негибкие конструкции
Контейнеры с переменным содержимым
Контроль версии
Итоги
Анти-паттерны этой главы
Суета с подключениями
Разделенное закрытие
Жесткое подключение
Неправильное использование XML
Негибкий XML

Глава 8. EJB

Краткий обзор Enterprise JavaBeans
Распределенная архитектура на базе компонентов
Разновидности EJB
Интернет-форум на базе EJB
Структура приложения EJB
Построение удаленного интерфейса
Создание домашнего интерфейса
Реализация класса компонента
Класс компонента Board
Определение первичного ключа
Создание дескриптора применения
Использование модели
Анти-паттерн: Лишние обращения
Оценка затрат в распределенной модели
Интерфейс с избытком коммуникационных циклов
Решение: группировка циклов в фасаде
Корни анти-паттерна
Переработка интернет-форума с применением фасада
Анти-паттерн: Квадратная пробка для круглой дыры
Мелкий анти-паттерн: Объединение данных под управлением компонента
Решение: объединение под управлением компонента
Мелкий анти-паттерн: Применение компонентов с данными при решении простых задач
Мелкий анти-паттерн: Компоненты с данными, используемые только для чтения
Мелкий анти-паттерн: Компоненты с данными, используемые только для записи
Многостраничные списки
Общее решение: правильный выбор типа компонента для конкретной задачи
Мелкий анти-паттерн: Бездумное применение EJB
EJB и кэширование
Реализация кэширования в фасаде
Итоги
Анти-паттерны этой главы
Лишние обращения
Квадратная пробка для круглой дыры
Бездумное применение EJB

Часть III

Глава 9. Культура программирования

Зачем изучать культуру программирования?
Экстремальное программирование требует высокой культуры
Стандарты оформления кода как средство борьбы с анти-паттернами
Мелкие анти-паттерны: Нечитаемый код
Выбор имен
Стандарты выбора имен
Фигурные скобки и отступы
Комментарии
Табуляция и пробелы
Редакторы
Мелкие анти-паттерны: организация и видимость
Мелкие анти-паттерны: структура программы
Основные принципы объектно-ориентированного программирования
Низкоуровневые архитектурные факторы
Исключения
Мелкие анти-паттерны: утечки ресурсов и производительность
Правила тестирования
Написание хорошего руководства по стилю
Купить, позаимствовать, украсть?
Короткое руководство по стилю программирования от Contextual, Inc
Сводка стандартов оформления кода

Глава 10. Масштабируемость

Топологии, обеспечивающие хорошую производительность
Группировка однородного оборудования
Другие варианты топологии
Анти-паттерн: Запоздалая забота о производительности
Разработка без планирования производительности
Примеры из практики
Решение: планирование производительности
Анти-паттерн: Лишние обращения
Решение: кэш и фасад
Анти-паттерн: Плохое управление нагрузкой
Решение: управление нагрузкой
Полноценная балансировка нагрузки
Анти-паттерн: Хаотическое управление сеансовыми данными
Решение 1. Диспетчеризация с учетом сеансовой привязки
Решение 2. Использование распределенных средств управления состоянием
Решения на базе сеансовых компонентов
Решения на базе компонентов с данными
Анти-паттерн: Бестолковая оптимизация
Решение: использование правильной методики оптимизации
Итоги
Анти-паттерны этой главы
Запоздалая забота о производительности
Лишние обращения
Плохое управление нагрузкой
Хаотическое управление сеансовыми данными
Бестолковая оптимизация

Глава 11. Прощальные размышления

Анти-паттерны на разных уровнях
Карьерные перспективы
Понимание анти-паттернов улучшает программы
Понимание анти-паттернов улучшает программистов
Интеграция борьбы с анти-паттернами
Следующий шаг, последний шаг…

Алфавитный указатель

Комментарии

Лаптев Валерий

Одна из трех (первая – знаменитый Рефакторинг Мартина Фаулера, вторая - Типичные ошибки проектирования Эрика Аллена) переводных книжек о том, как не надо программировать, которые стали появляться последнее время. Направление действительно важное, поскольку на собственно опыте знаю, как легко новичок попадает в ловушки анти-паттернов – теперь этому есть название. Так же, как Мартин Фаулер, автор представляет фрагменты кода и проектировочные решения, обладающие различными недостатками, и описывает пути их возможного усовершенствования. На этом материале демонстрируются низкоуровневые проявления внутренних дефектов технологического процесса, недостаточной квалификации и тяги к упрощенным решениям. Программисты и специалисты-проектировщики найдут то, что непосредственно относится к их работе. В конце каждой главы приводится краткая сводка рассмотренных анти-паттернов. Собственно, по содержанию уже можно составить достаточно объективное мнение.

То, что надо изучать паттерны – это все признают. Вот как пишет об этом автор данной книги:

Паттерны: изучение положительного опыта

Паттерны проектирования представляют собой решения типовых задач в заданном контексте. Хорошим примером является паттерн "Модель-представление-контроллер", представленный в главе 3. Он обеспечивает общее решение проблемы отделения пользовательского интерфейса от бизнес-логики приложения. Хороший паттерн представляет решение, которое успешно применялось в нескольких разных ситуациях. … В роли программиста я использую их по нескольким причинам:

Активное применение паттернов меняет подход к программированию. Вы присоединяетесь к сообществу программистов, внутри которого распространяются паттерны, и занимаетесь исследованиями вместо того, чтобы браться за решение методом "грубой силы".

Однако автор ратует и за обязательное изучение антипаттернов и объясняет, что это такое.

Анти-паттерны: изучение чужих ошибок

В одной из книг, посвященных изучению анти-паттернов, автор приводит следующее определение: "обозначение часто встречающегося подхода к решению проблемы, приводящего к однозначно отрицательным последствиям". Мое внимание привлекли слова "часто встречающийся подход" и "однозначно отрицательные последствия". Во многих источниках эти негативные решения выдаются за образец правильного подхода. Некоторые анти-паттерны (такие, как "Волшебный сервлет") встречаются в программах, которые публикуются в учебниках, генерируются программами-мастерами или реализуются в библиотеках классов. Что касается отрицательных последствий, каждый, кто внимательно следит за развитием отрасли программирования, знает, что довольно высокий процент проектов завершается неудачей и проекты Java не являются исключением. На прошлых выходных я узнал, что одна из крупнейших компаний закрыла проект Java, использующий сервлеты и JSP, и заменила его новым проектом на базе CICS и C++!

Безумие, творящееся в нашей отрасли, в отдельных случаях объясняется злым умыслом. Некоторые фирмы продают программные продукты, заведомо неработоспособные или не доведенные до нормального состояния. Некоторые начальники сопротивляются изменениям и саботируют проекты. Некоторые из наших коллег ищут короткие обходные пути, зная, что последствия придется исправлять кому-то другому. И все же в большинстве случаев проблемы возникают из-за обычного невежества, безразличия или лени. Мы просто не утруждаем себя изучением стандартных анти-паттернов. Забывая о правиле экспоненциального роста затрат на исправление ошибок на стадии цикла разработки, мы тешим себя иллюзиями, что выбранное сегодня упрощенное решение можно будет исправить в будущем.

Некоторые распространенные анти-паттерны

Любой программист часто сталкивается с анти-паттернами, не имеющими ничего общего с Java. В этой книге они практически не рассматриваются, но я все же приведу несколько примеров, чтобы разжечь ваш аппетит.

Не правда ли, все очень знакомо? Для кого и зачем была написана эта книга, пишет сам автор.
В мире Java изучение и распространение проектировочных паттернов, "шаблонов" хорошо проверенных решений, имеет давние традиции. Об анти-паттернах этого сказать нельзя. Консультируя клиентов, я был поражен невероятным однообразием ошибок, которые обычно допускались нашими клиентами. Хотя конкретная проблема слегка изменялась в зависимости от предметной области или условий, общие недостатки проектирования, культуры программирования и даже технологии оставались на удивление одинаковыми. Я твердо убежден, что изучение анти-паттернов меняет подход к технологическому процессу программирования. Знание анти-паттернов делает нас более наблюдательными. Оно заставляет нас обмениваться знаниями с другими, помогает отойти от ежедневной рутины и внести в технологический процесс фундаментальные изменения, необходимые для его успешной работы.

Книга рассчитана на программиста средней квалификации. Если на вашей полке стоят все новые книги о паттернах Java, а в браузере имеются закладки для всех основных форумов, посвященных паттернам, - наверное, эта книга не для вас. Если вы еще не знаете Java, почитайте учебники для начинающих и только после этого беритесь за книгу. Но если вы, как большинство программистов Java, имеете среднюю квалификацию и не откажетесь от информации о типовых проблемах, встречающихся при программировании на Java, эта книга написана для вас. Она особенно пригодится тем, кто перешел на Java с более простых языков - например, сценарных или процедурных языков типа C.

И наконец, мое личное мнение. Книга чрезвычайно полезна, ее надо изучать и изучать, так же как Рефакторинг. То, что она, так же как и две другие книги, написана на Java, ни в коей мере не снижает ее ценности для других программистов. Непосредственно для них – третья часть. Но, конечно, особую ценность книга имеет как раз для Java-программистов, так как основное содержание составляет вторая часть, целиком и полностью посвященная конкретно Java-программированию.
По моему мнению, только один недостаток изложения – истории о каякерах и сплаве на лодках-каяках. Но может, кому-то именно это и понравится. Сам автор именно так и пишет.