Software: Ошибки и компромиссы при разработке ПО [Томаш Лелек] (pdf) читать постранично, страница - 2

Книга в формате pdf! Изображения и текст могут не отображаться!


 [Настройки текста]  [Cбросить фильтры]

. . . . . . . . . . . . . . . . . . . . . . . . . . 22
Для кого эта книга . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
Структура книги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
О коде . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
Форум liveBook . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25
Об авторах . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 26
Иллюстрация на обложке . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
От издательства . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Словарь паттернов проектирования . . . . . . . . . . . . . . . . . . . . . . . . 28
Глава 1. Введение . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
1.1. Последствия каждого решения и паттерна . . . . . . . . . . . . . . . . . 30
1.1.1. Решения в модульном тестировании . . . . . . . . . . . . . . . . . 31
1.1.2. Соотношение модульных и интеграционных тестов . . . . . . . . 32
1.2. Программные паттерны проектирования и почему .
они работают не всегда . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
1.2.1. Измерение скорости выполнения . . . . . . . . . . . . . . . . . . . 39

10  Оглавление
1.3. Архитектурные паттерны проектирования и почему .
они работают не всегда . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
1.3.1. Масштабируемость и эластичность . . . . . . . . . . . . . . . . . . 41
1.3.2. Скорость разработки . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
1.3.3. Сложность микросервисов . . . . . . . . . . . . . . . . . . . . . . . 43
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Глава 2. Дублирование кода не всегда плохо: дублирование кода .
и гибкость . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2.1. Общий код в кодовых базах и дублирование . . . . . . . . . . . . . . . . 47
2.1.1. Добавление нового бизнес-требования, для которого
дублирование кода необходимо . . . . . . . . . . . . . . . . . . . . . . . . 49
2.1.2. Реализация нового бизнес-требования . . . . . . . . . . . . . . . . 50
2.1.3. Оценка результата . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
2.2. Библиотеки и совместное использование кода в кодовых базах . . . . 52
2.2.1. Оценка компромиссов и недостатков .
совместно используемых библиотек . . . . . . . . . . . . . . . . . . . . . 53
2.2.2. Создание совместно используемой библиотеки . . . . . . . . . . 54
2.3. Выделение кода в отдельный микросервис . . . . . . . . . . . . . . . . . 55
2.3.1. Компромиссы и недостатки отдельного сервиса . . . . . . . . . . 58
2.3.2. Выводы о выделении отдельных сервисов . . . . . . . . . . . . . . 62
2.4. Улучшение слабой связанности за счет дублирования кода . . . . . . . 63
2.5. Проектирование API с наследованием для сокращения .
дублирования . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
2.5.1. Выделение базового обработчика запросов . . . . . . . . . . . . . 68
2.5.2. Наследование и сильная связанность . . . . . . . . . . . . . . . . . 70
2.5.3. Компромиссы между наследованием и композицией . . . . . . . 72
2.5.4. Дублирование внутреннее и ситуативное . . . . . . . . . . . . . . 73
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
Глава 3. Исключения и другие паттерны обработки ошибок в коде . . . . . . 75
3.1. Иерархия исключений . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
3.1.1. Универсальный и детализированный подход к обработке
ошибок . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 78

Оглавление  11
3.2. Лучшие паттерны для обработки исключений в собственном коде . . 81
3.2.1. Обработка проверяемых исключений .
в общедоступном API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 82
3.2.2. Обработка непроверяемых исключений .
в общедоступном API . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
3.3. Антипаттерны в обработке исключений . . . . . . . . . . . . . . . . . . . 85
3.3.1. Закрытие ресурсов при возникновении ошибки . . . . . . . . . . 87
3.3.2. Антипаттерн использования исключений .
для управления программной логикой . . . . . . . . . . . . . . . . . . . . 89
3.4. Исключения из сторонних библиотек . . . . . . . . . . . . . . . . . . . . 90
3.5. Исключения в многопоточных средах . . . . . . . . . . . . . . . . . . . . 93
3.5.1. Исключения в асинхронной программной .
логике с API обещаний . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 96
3.6. Функциональный подход к обработке ошибок с Try . . . . . . . . . . . 99
3.6.1. Использование Try в рабочем коде . . . . . . . . . . . . . . . . . 103
3.6.2. Объединение Try с кодом, выдающим исключение . . . . . . . 105
3.7. Сравнение производительности кода обработки исключений . . . . 106
Итоги . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 110
Глава 4. Баланс между гибкостью и сложностью . . . . . . . . . . . . . . . . . 112
4.1. Мощный, но не расширяемый API . . . . . . . . . . . . . . . . . . . . . 113
4.1.1. Проектирование нового компонента . . . . . . . . . . . . . . . . 113
4.1.2. Начиная с простого . . . . . . . . . . . . . . . .