Питер, 2021. — 352 с. — (Библиотека программиста) — ISBN 978-5-4461-1739-0.
Эта книга написана для разработчиков, которые хотят создавать качественный софт. Затронуты все ключевые показатели ПО: скорость, затраты памяти, надежность, удобочитаемость, потоковая безопасность, универсальность и элегантность. Реальные задачи и прикладные примеры кода на Java помогут надежно усвоить концепции. В конце каждой главы подведены итоги, даются ответы на вопросы и упражнения и указывается дополнительная литература.
Предисловие.
Введение.
Благодарности.
О книге.
Об авторе.
Об обложке.
От издательства.Отправная точка.
Свойства кода и постановка задачи.
Свойства кода.
Внутренние и внешние свойства.
Функциональные и нефункциональные свойства.
Преимущественно внешние свойства.
Правильность.
Стабильность.
Удобство использования.
Эффективность.
Преимущественно внутренние свойства кода.
Удобочитаемость.
Возможность повторного использования.
Удобство тестирования.
Удобство сопровождения.
Взаимодействие свойств кода.
Специфичные свойства.
Потокобезопасность.
Лаконичность.
Сквозной пример: система резервуаров для воды.
API.
Сценарий использования.
Модель данных и представления.
Хранение объема воды.
Хранение информации о соединениях.
Hello, резервуары! [Novice].
Поля и конструктор.
Методы getAmount и addWater.
Метод connectTo.
Эталонная реализация.
Код [Reference].
Диаграммы распределения памяти.
Методы.
Требования к памяти.
Требования к памяти в Reference.
Временная сложность.
Временная сложность в Reference.
Применим изученное.
Свойства программного кода.
Жажда скорости: эффективность по времени.
Добавление воды с постоянным временем [Speed1].
Временная сложность.
Добавление соединений за постоянное время [Speed2].
Представление групп в виде циклических списков.
Отложенные обновления.
Лучший баланс: алгоритмы поиска объединений [Speed3].
Поиск представителя группы.
Соединение деревьев.
Временная сложность в наихудшем случае.
Амортизированная временная сложность.
Амортизированный анализ массивов с изменяемым размером.
Сравнение реализаций.
Эксперименты.
Теория и практика.
А теперь совсем другое.
Быстрая вставка.
Быстрые запросы.
Все операции.
Реальные сценарии использования.
Применим изученное.
Эффективность по затратам памяти.
Первые шаги [Memory1].
Временная сложность и затраты памяти.
Простые массивы.
Временная сложность и затраты памяти.
Отказ от объектов [Memory3].
API без объектов.
Поля и метод getAmount.
Создание резервуаров фабричным методом.
Соединение резервуаров по идентификаторам.
Временная сложность и затраты памяти.
Черная дыра [Memory4].
Временная сложность и затраты памяти.
Баланс затрат памяти и времени.
А теперь совсем другое.
Малое количество дубликатов.
Большое количество дубликатов.
Реальные сценарии использования.
Применим изученное.
Надежность за счет мониторинга.
Контрактное проектирование.
Предусловия и постусловия.
Инварианты.
Правильность и стабильность.
Проверка контрактов.
Более широкая картина.
Контрактное проектирование резервуаров.
Резервуары, проверяющие свои контракты [Contracts].
Проверка контракта addWater.
Проверка контракта connectTo.
Резервуары, проверяющие свои инварианты [Invariants].
Проверка инвариантов в connectTo.
Проверка инвариантов в addWater.
А теперь совсем другое.
Контракты.
Эталонная реализация.
Проверка контрактов.
Проверка инвариантов.
Реальные сценарии использования.
Применим изученное.
Надежность за счет тестирования.
Основные понятия тестирования.
Покрытие в тестировании.
Тестирование и контрактное проектирование.
JUnit.
Тестирование резервуаров [UnitTests].
Инициализация тестов.
Тестирование addWater.
Тестирование connectTo.
Выполнение тестов.
Оценка покрытия кода.
Тестируемость [Testable].
Управляемость.
Наблюдаемость.
Isolation: разделение зависимостей.
А теперь совсем другое.
Повышение удобства тестирования.
Набор тестов.
Реальные сценарии использования.
Применим изученное.
Удобочитаемость.
Разный взгляд на удобочитаемость.
Корпоративные руководства по стилю программирования.
Составляющие удобочитаемости.
Структурные факторы удобочитаемости.
Управляющие команды.
Выражения и локальные переменные.
Внешние факторы удобочитаемости.
Комментарии.
Выбор имен.
Пропуски и отступы.
Код [Readable].
Документирование заголовка класса комментариями Javadoc.
Чистка метода connectTo.
Чистка addWater.
Напоследок об удобочитаемости.
А теперь совсем другое.
Реальные сценарии использования.
Применим изученное.
Потокобезопасность.
Проблемы потокобезопасности.
Уровни конкурентности.
Политика конкурентности для резервуаров.
Взаимоблокировки.
Атомарные последовательности блокировок.
Упорядоченные последовательности блокировок.
Скрытое состояние гонки.
Потокобезопасные резервуары [ThreadSafe].
Синхронизация connectTo.
Синхронизация addWater и getAmount.
Неизменяемость.
API.
Реализация.
А теперь совсем другое.
Реальные сценарии использования.
Применим изученное.
Повторное использование.
Определение границ.
Общая структура.
API атрибутов.
Изменяемые коллекторы.
Адаптация Attribute для функциональных интерфейсов.
Обобщенная реализация резервуара.
Общие соображения.
Использование готового кода [Generic].
Обновленный сценарий использования.
Проектирование конкретного атрибута.
Определение класса для резервуара.
Посты в соцсетях.
А теперь совсем другое.
Интерфейс для параметрических функций.
Схема коммуникаций.
Реальные сценарии использования.
Применим изученное.
Приложения.
А. Программный гольф: компактность.
A.1. Самая короткая программа, которая у меня получилась [Golfing].
Дополнительная литература.
Б. Финальная версия класса для резервуара с водой.
Б.1. Улучшения удобочитаемости.
Б.2. Улучшения надежности.