Хороший объектно-ориентированный код удобно читать, изменять и исправлять. Универсальные практики проектирования объектов, собранные в этой книге, позволят улучшить ваш стиль кодирования. Эти правила подойдут к любому объектно-ориентированному языку, они делают код максимально понятным и надежным, а также повышают производительность как индивидуальных разработчиков, так и команд.
Книга «Объекты. Стильное ООП» познакомит вас с профессиональными техниками написания ОО-кода. Маттиас Нобак раскрывает правила создания объектов, определения методов, изменения и извлечения состояний и многое другое. Все примеры написаны на простом псевдокоде, который легко перевести в любой язык программирования. Кейс за кейсом вы изучите ключевые сценарии и задачи проектирования объектов, а затем шаг за шагом создадите простое веб-приложение, которое покажет, как должны взаимодействовать объекты разных типов.
Author(s): Маттиас Нобак
Series: Библиотека программиста
Publisher: Питер
Year: 2023
Language: Russian
Pages: 304
City: СПб.
Краткое содержание
Оглавление
Предисловие
Вступительное слово
Благодарности
О книге
Для кого эта книга
Структура книги
О коде в книге
Форум liveBook
Об авторе
Иллюстрации на обложке
От издательства
Глава 1. Программирование объектов: введение
1.1. Классы и объекты
1.2. Состояние
1.3. Поведение
1.4. Зависимости
1.5. Наследование
1.6. Полиморфизм
1.7. Композиция
1.8. Организация классов
1.9. Оператор возврата и исключения
1.10. Модульное тестирование
1.11. Динамические массивы
Заключение
Глава 2. Создание сервисов
2.1. Два типа объектов
2.2. Внедрение зависимостей и значений конфигурации в качестве аргументов конструктора
2.2.1. Хранение связанных файлов конфигурации
2.3. Внедряйте необходимые сущности, а не место их расположения
2.4. Все аргументы конструктора должны быть обязательными
2.5. Внедряйте зависимости только в конструкторе
2.6. Не существует необязательных зависимостей
2.7. Делайте все зависимости явными
2.7.1. Преобразуйте статические зависимости в зависимости объектов
2.7.2. Преобразуйте сложные функции в зависимости объектов
2.7.3. Делайте вызовы системных функций явными
2.8. Передавайте данные для выполнения задач как аргументы метода, а не аргументы конструктора
2.9. После инстанцирования сервиса его поведение должно оставаться неизменным
2.10. Не делайте ничего внутри конструктора, кроме инициализации свойств
2.11. Выдавайте исключение при недопустимом аргументе
2.12. Объявляйте сервисы как неизменяемые графы объектов с ограниченным рядом точек входа
Заключение
Ответы к упражнениям
Глава 3. Создание других объектов
3.1. Запрашивайте минимально необходимый для согласованного поведения объекта объем данных
3.2. Запрашивайте только данные, которые имеют смысл
3.3. Не используйте собственные классы исключений при проверке недопустимых аргументов
3.4. Проверяйте специфические исключения для недопустимых аргументов, анализируя сообщения исключений
3.5. Создавайте новые объекты, чтобы избежать многократной проверки инвариантов предметной области
3.6. Создавайте новые объекты для представления составных значений
3.7. Используйте проверки утверждений для аргументов конструктора
3.8. Не внедряйте зависимости, а передавайте их в качестве аргументов методов
3.9. Используйте именованные конструкторы
3.9.1. Создавайте объекты из значений примитивного типа
3.9.2. Не добавляйте без необходимости такие методы, как toString() или toInt()
3.9.3. Продумывайте и внедряйте понятия, специфичные для предметной области
3.9.4. Для введения ограничения можно использовать приватный конструктор
3.10. Не используйте заполнители свойств
3.11. Добавляйте в объект только то, что нужно
3.12. Не тестируйте конструкторы
3.13. Исключение из правила: объекты для передачи данных
3.13.1. Используйте публичный модификатор для свойств
3.13.2. Не выдавайте исключения, а собирайте ошибки при проверках
3.13.3. Если нужно, используйте заполнение свойств
Заключение
Ответы к упражнениям
Глава 4. Изменение объектов
4.1. Сущности: идентифицируемые объекты, которые отслеживают изменения и фиксируют события
4.2. Объекты-значения: заменяемые, анонимные и неизменяемые значения
4.3. Объекты для передачи данных: простые объекты с минимальным набором правил проектирования
4.4. Отдавайте предпочтение неизменяемым объектам
4.4.1. Заменяйте значения новыми, а не изменяйте их
4.5. Модификатор неизменяемого объекта должен возвращать модифицированную копию
4.6. В изменяемых объектах методы-модификаторы должны быть командными
4.7. В неизменяемых объектах методы-модификаторы должны иметь декларативные имена
4.8. Сравнивайте объекты целиком
4.9. При сравнении неизменяемых объектов проверяйте, что объекты равны, а не одинаковы
4.10. Вызов метода-модификатора должен всегда оставлять действительный объект
4.11. Метод-модификатор должен проверять, что запрашиваемое изменение состояния допустимо
4.12. Используйте запись внутренних событий для проверки изменяемых объектов
4.13. Не реализуйте текучие интерфейсы в изменяемых объектах
Заключение
Ответы к упражнениям
Глава 5. Использование объектов
5.1. Шаблон реализации методов
5.1.1. Проверка предусловий
5.1.2. Сценарии появления ошибок
5.1.3. Счастливый путь
5.1.4. Проверки постусловий
5.1.5. Возвращаемое значение
5.2. Некоторые правила для исключений
5.2.1. Используйте собственные классы исключений только при необходимости
5.2.2. Именование недопустимых аргументов или классов логических исключений
5.2.3. Именование классов исключений времени исполнения
5.2.4. Используйте именованные конструкторы для указания причин ошибки
5.2.5. Сопровождайте ошибки подробным описанием
Заключение
Ответы к упражнениям
Глава 6. Извлечение информации
6.1. Используйте методы-запросы для извлечения информации
6.2. Методы-запросы должны иметь возвращаемые значения единого типа
6.3. Избегайте использования методов-запросов, раскрывающих внутренние данные объектов
6.4. Задавайте специфичные методы и возвращаемые типы для необходимых запросов
6.5. Задавайте абстракцию для запросов, которые выходят за границы системы
6.6. Используйте заглушки в тестовых дублерах для методов-запросов
6.7. Методы-запросы должны использовать другие методы-запросы, а не командные методы
Заключение
Ответы к упражнениям
Глава 7. Выполнение задач
7.1. Используйте командные методы с именем в императивной форме
7.2. Ограничивайте область воздействия командного метода и используйте события для выполнения второстепенных задач
7.3. Создавайте сервис неизменяемым изнутри и снаружи
7.4. Когда что-то идет не так, выдавайте исключение
7.5. Используйте запросы для сбора информации, а командные методы — для последующих действий
7.6. Задавайте абстракции для команд, которые выходят за границы системы
7.7. Проверяйте имитацией (mock) только командные методы
Заключение
Ответы к упражнениям
Глава 8. Разделение функций
8.1. Отделяйте модели записи от моделей чтения
8.2. Создавайте модели чтения с учетом сценариев их использования
8.3. Создавайте модели чтения непосредственно из их источника данных
8.4. Построение моделей чтения из событий предметной области
Заключение
Ответы к упражнениям
Глава 9. Изменение поведения сервисов
9.1. Введите аргументы конструктора, чтобы сделать поведение настраиваемым
9.2. Введите аргументы конструктора, чтобы сделать поведение заменяемым
9.3. Создавайте абстракции, чтобы добиться более сложного поведения
9.4. Декорируйте существующее поведение
9.5. Используйте объекты уведомлений или прослушиватели событий для добавления поведения
9.6. Не используйте наследование для изменения поведения объекта
9.6.1. Когда можно использовать наследование?
9.7. Помечайте классы как final по умолчанию
9.8. Помечайте методы и свойства как private по умолчанию
Заключение
Ответы к упражнениям
Глава 10. Справочник объектов
10.1. Контроллеры
10.2. Службы приложений
10.3. Репозитории моделей записи
10.4. Сущности
10.5. Объекты-значения
10.6. Прослушиватели событий
10.7. Модели чтения и репозитории моделей чтения
10.8. Абстракции, конкретика, слои и зависимости
Заключение
Глава 11. Эпилог
11.1. Архитектурные шаблоны
11.2. Тестирование
11.2.1. Тестирование класса в сравнении с тестированием объекта
11.2.2. Разработка функций сверху вниз
11.3. Предметно-ориентированное проектирование
11.4. Заключение
Приложение. Стандарт кодирования для примеров кода