В современном мире разработки успешность приложения уже не определяется параметром «просто работает». Хороший программист должен знать возможности языка, практические приемы проектирования и платформенные средства для достижения максимальной производительности и жизнеспособности программ. Эта книга написана для разработчиков, которые хотят создавать качественный софт. Затронуты все ключевые показатели ПО: скорость, затраты памяти, надежность, удобочитаемость, потоковая безопасность, универсальность и элегантность. Реальные задачи и прикладные примеры кода на Java помогут надежно усвоить концепции.
Пройдя все этапы создания центрального проекта книги, вы сможете уверенно выбрать правильный путь оптимизации собственного приложения.
Author(s): Марко Фаэлла
Series: Библиотека программиста
Edition: 1
Publisher: Питер
Year: 2021
Language: Russian
Commentary: Vector PDF
Pages: 352
City: СПб.
Tags: Algorithms; Multithreading; Java; Reliability; Monitoring; Memory Management; Best Practices; Testing; Algorithm Complexity; Code Readability; Code Reusability; Software Quality
Предисловие
Введение
Благодарности
О книге
Об авторе
Об обложке
От издательства
Часть IОтправная точка
Глава 1. Свойства кода и постановка задачи
1.1. Свойства кода
1.1.1. Внутренние и внешние свойства
1.1.2. Функциональные и нефункциональные свойства
1.2. Преимущественно внешние свойства
1.2.1. Правильность
1.2.2. Стабильность
1.2.3. Удобство использования
1.2.4. Эффективность
1.3. Преимущественно внутренние свойства кода
1.3.1. Удобочитаемость
1.3.2. Возможность повторного использования
1.3.3. Удобство тестирования
1.3.4. Удобство сопровождения
1.4. Взаимодействие свойств кода
1.5. Специфичные свойства
1.5.1. Потокобезопасность
1.5.2. Лаконичность
1.6. Сквозной пример: система резервуаров для воды
1.6.1. API
1.6.2. Сценарий использования
1.7. Модель данных и представления
1.7.1. Хранение объема воды
1.7.2. Хранение информации о соединениях
1.8. Hello, резервуары! [Novice]
1.8.1. Поля и конструктор
1.8.2. Методы getAmount и addWater
1.8.3. Метод connectTo
Итоги
Дополнительная литература
Глава 2. Эталонная реализация
2.1. Код [Reference]
2.1.1. Диаграммы распределения памяти
2.1.2. Методы
2.2. Требования к памяти
2.2.1. Требования к памяти в Reference
2.3. Временнˆая сложность
2.3.1. Временная сложность в Reference
2.4. Применим изученное
Итоги
Ответы на вопросы и упражнения
Дополнительная литература
Часть IIСвойства программного кода
Глава 3. Жажда скорости: эффективность по времени
3.1. Добавление воды с постоянным временем [Speed1]
3.1.1. Временная сложность
3.2. Добавление соединений за постоянное время [Speed2]
3.2.1. Представление групп в виде циклических списков
3.2.2. Отложенные обновления
3.3. Лучший баланс: алгоритмы поиска объединений [Speed3]
3.3.1. Поиск представителя группы
3.3.2. Соединение деревьев
3.3.3. Временная сложность в наихудшем случае
3.3.4. Амортизированная временная сложность
3.3.5. Амортизированный анализ массивов с изменяемым размером
3.4. Сравнение реализаций
3.4.1. Эксперименты
3.4.2. Теория и практика
3.5. А теперь совсем другое
3.5.1. Быстрая вставка
3.5.2. Быстрые запросы
3.5.3. Все операции
3.6. Реальные сценарии использования
3.7. Применим изученное
Итоги
Ответы на вопросы и упражнения
Дополнительная литература
Глава 4. Эффективность по затратам памяти
4.1. Первые шаги [Memory1]
4.1.1. Временная сложность и затраты памяти
4.2. Простые массивы
4.2.1. Временная сложность и затраты памяти
4.3. Отказ от объектов [Memory3]
4.3.1. API без объектов
4.3.2. Поля и метод getAmount
4.3.3. Создание резервуаров фабричным методом
4.3.4. Соединение резервуаров по идентификаторам
4.3.5. Временная сложность и затраты памяти
4.4. Черная дыра [Memory4]
4.4.1. Временная сложность и затраты памяти
4.5. Баланс затрат памяти и времени
4.6. А теперь совсем другое
4.6.1. Малое количество дубликатов
4.6.2. Большое количество дубликатов
4.7. Реальные сценарии использования
4.8. Применим изученное
Итоги
Ответы на вопросы и упражнения
Дополнительная литература
Глава 5. Надежность за счет мониторинга
5.1. Контрактное проектирование
5.1.1. Предусловия и постусловия
5.1.2. Инварианты
5.1.3. Правильность и стабильность
5.1.4. Проверка контрактов
5.1.5. Более широкая картина
5.2. Контрактное проектирование резервуаров
5.3. Резервуары, проверяющие свои контракты [Contracts]
5.3.1. Проверка контракта addWater
5.3.2. Проверка контракта connectTo
5.4. Резервуары, проверяющие свои инварианты [Invariants]
5.4.1. Проверка инвариантов в connectTo
5.4.2. Проверка инвариантов в addWater
5.5. А теперь совсем другое
5.5.1. Контракты
5.5.2. Эталонная реализация
5.5.3. Проверка контрактов
5.5.4. Проверка инвариантов
5.6. Реальные сценарии использования
5.7. Применим изученное
Итоги
Ответы на вопросы и упражнения
Дополнительная литература
Глава 6. Надежность за счет тестирования
6.1. Основные понятия тестирования
6.1.1. Покрытие в тестировании
6.1.2. Тестирование и контрактное проектирование
6.1.3. JUnit
6.2. Тестирование резервуаров [UnitTests]
6.2.1. Инициализация тестов
6.2.2. Тестирование addWater
6.2.3. Тестирование connectTo
6.2.4. Выполнение тестов
6.2.5. Оценка покрытия кода
6.3. Тестируемость [Testable]
6.3.1. Управляемость
6.3.2. Наблюдаемость
6.3.3. Isolation: разделение зависимостей
6.4. А теперь совсем другое
6.4.1. Повышение удобства тестирования
6.4.2. Набор тестов
6.5. Реальные сценарии использования
6.6. Применим изученное
Итоги
Ответы на вопросы и упражнения
Дополнительная литература
7
Глава 7. Удобочитаемость
7.1. Разный взгляд на удобочитаемость
7.1.1. Корпоративные руководства по стилю программирования
7.1.2. Составляющие удобочитаемости
7.2. Структурные факторы удобочитаемости
7.2.1. Управляющие команды
7.2.2. Выражения и локальные переменные
7.3. Внешние факторы удобочитаемости
7.3.1. Комментарии
7.3.2. Выбор имен
7.3.3. Пропуски и отступы
7.4. Код [Readable]
7.4.1. Документирование заголовка класса комментариями Javadoc
7.4.2. Чистка метода connectTo
7.4.3. Чистка addWater
7.5. Напоследок об удобочитаемости
7.6. А теперь совсем другое
7.7. Реальные сценарии использования
7.8. Применим изученное
Итоги
Ответы на вопросы и упражнения
Дополнительная литература
Глава 8. Потокобезопасность
8.1. Проблемы потокобезопасности
8.1.1. Уровни конкурентности
8.1.2. Политика конкурентности для резервуаров
8.2. Взаимоблокировки
8.2.1. Атомарные последовательности блокировок
8.2.2. Упорядоченные последовательности блокировок
8.2.3. Скрытое состояние гонки
8.3. Потокобезопасные резервуары [ThreadSafe]
8.3.1. Синхронизация connectTo
8.3.2. Синхронизация addWater и getAmount
8.4. Неизменяемость
8.4.1. API
8.4.2. Реализация
8.5. А теперь совсем другое
8.6. Реальные сценарии использования
8.7. Применим изученное
Итоги
Ответы на вопросы и упражнения
Дополнительная литература
9
Глава 9. Повторное использование
9.1. Определение границ
9.2. Общая структура
9.2.1. API атрибутов
9.2.2. Изменяемые коллекторы
9.2.3. Адаптация Attribute для функциональных интерфейсов
9.3. Обобщенная реализация резервуара
9.4. Общие соображения
9.5. Использование готового кода [Generic]
9.5.1. Обновленный сценарий использования
9.5.2. Проектирование конкретного атрибута
9.5.3. Определение класса для резервуара
9.6. Посты в соцсетях
9.7. А теперь совсем другое
9.7.1. Интерфейс для параметрических функций
9.7.2. Схема коммуникаций
9.8. Реальные сценарии использования
9.9. Применим изученное
Итоги
Ответы на вопросы и упражнения
Дополнительная литература
Приложения
Приложение А. Программный гольф: компактность
A.1. Самая короткая программа, которая у меня получилась [Golfing]
Дополнительная литература
Приложение Б. Финальная версия класса для резервуара с водой
Б.1. Улучшения удобочитаемости
Б.2. Улучшения надежности