Паттерны
и практики написания кода
FAQ
middle
junior
Бесплатный курс для программистов от бэкенд-инженера Авито — Юрия Афанасьева. Курс посвящен практикам и паттернам написания кода.
Он будет полезен как начинающим, так и middle-разработчикам.
> 15
лет
в коммерческой разработке
> 6
лет
в Авито
12
лет
писал на Php
4
года
на Golang
Юрий не только создал обучающий курс, он еще и скрам-мастер, а также организатор внутреннего комьюнити в Авито.
Юрий работает в департаменте монетизации Авито и за это время нанёс непоправимую пользу компании — разрабатывал и улучшал монетизационные продукты.
Об авторе курса
новый сезон
{
3 сезон
}
Rutube
VK
YouTube
премьера
1. История создания паттернов
VK
YouTube
Rutube
В этом вводном видео знакомимся с разными каталогами паттернов и их отличительными признаками. Поймём, чем принципы отличаются от паттернов, изучаем историю паттернов и методы правильной работы с ними.
2. Порождающие паттерны. Builder (Строитель) и Factory Method (Фабричный метод)
VK
YouTube
Rutube
Начинаем изучение порождающей группы паттернов и рассмотрим из них первые два — это Строитель и Фабричный метод. Первый позволяет создавать сложные объекты. Второй выносит операцию инстанцирования в специальные методы.
3. Порождающие паттерны. Abstract Factory (Абстрактная фабрика)
YouTube
VK
Rutube
Это видео полностью посвящено паттерну Абстрактная фабрика. Она занимается тем, что создаёт взаимозаменяемые группы объектов и позволяет выбирать именно ту, которая подходит в данном конкретном приложении.
4. Порождающие паттерны. Prototype (Прототип) и Singleton (Одиночка)
YouTube
VK
Rutube
Не будем рассматривать фабричные паттерны, а перейдём к другим вопросам, связанным с процессом порождения. Так, паттерн Прототип позволяет создать клон существующего объекта, без необходимости воспроизведения нужного ему состояния. Второй паттерн — это Одиночка, который снискал славу анти-паттерна. Тем не менее, будет полезно знать как можно сконфигурировать класс, который может иметь один единственный инстанс, при условии, что в ход не идёт рефлексия и чёрная магия.
5. Структурные паттерны. Adapter (Адаптер) и Composite (Компоновщик)
YouTube
VK
Rutube
Переходим к следующей группе — структурные паттерны. Первый из них — Адаптер, который приводит класс к интерфейсу, который ему изначально не соответствует. Затем рассмотрим Компоновщик. Он в ООП-парадигме позволяет создавать древовидную структуру данных.
6. Структурные паттерны. Decorator (Декоратор) и Facade (Фасад)
YouTube
VK
Rutube
Рассматриваем Декоратор, показывающий нам, как реализовывать альтернативный вариант наследованию классов. В отличии от наследования, паттерн имеет ряд существенных плюсов. Второй рассматриваемый паттерн — это Фасад. У него нет своей UML-диаграммы, зато он отлично справляется с организацией точки входа в сложную систему.
7. Структурные паттерны. Bridge (Мост), Proxy (Прокси) и Flyweight (Приспособленец)
YouTube
VK
Rutube
В заключительной серии по Структурным паттернам рассматриваем три оставшихся подхода. Первый из них — это Мост. Он позволяет развивать независимо абстракцию и связанную с ней реализацию. Затем изучим Заместителя. Его задача в контроле доступа к некоторому объекту для выполнения дополнительных задач. В конце кратко рассказываем про паттерн Приспособленец.
8. Поведенческие паттерны. Strategy (Стратегия) и State (Состояние)
YouTube
VK
Rutube
Изучаем третью, заключительную группу, которая называется Поведенческие паттерны. Начинаем с двух паттернов: Стратегия и Состояние. Они используют композицию для изменения поведения объекта, но делают это по-разному.
9. Поведенческие паттерны. Command (Команда) и Mediator (Посредник)
YouTube
VK
Rutube
Продолжаем изучать Поведенческие паттерны, рассматриваем Команду и Посредника. Первый из них относится к коду, как к транзакции, в которой строго выполняются все описанные действия. Благодаря такой архитектуре и инкапсуляции кода можно добавить к системе множество дополнительных действий. Например, логирование или отмену последних операций. Второй паттерн — брат паттерна Фасад, но вместо внешнего взаимодействия он обеспечивает связь между объектами конкретной системы.
10. Поведенческие паттерны. Observer (Наблюдатель) и Chain Of Responsibility (Цепочка обязанностей)
YouTube
VK
Rutube
Рассматриваем Наблюдателя и Цепочку обязанностей. Они оба связаны с отправкой и обработкой событий, но делают это по-разному. В паттерне Наблюдатель субъект создаёт сообщение и отправляет его всем своим подписчикам. Его задача в уведомлении всех слушателей о необходимости отреагировать на изменения. Связь между субъектом и наблюдателями определяется как «один ко многим». Что же касается Цепочки Обязанностей, то в нём формируется цепочка из объектов-обработчиков. Сначала событие отправляется первому объекту и, если он не смог его обработать, то происходит передача следующему. И так — пока не будет пройдена вся цепочка.
11. Поведенческие паттерны. Memento (Хранитель) и Template Method (Шаблонный метод)
YouTube
VK
Rutube
Изучаем ещё два Поведенческих паттерна и заканчиваем с этой группой. Первый из них — Хранитель. Он сохраняет историю изменений состояния объекта, а также может восстанавливать любое из них. Второй рассматриваемый паттерн — Шаблонный метод. Он объясняет, как создавать из классов шаблоны с алгоритмами для того, чтобы их было просто расширять наследниками. Используя его, вы сильно повышаете гибкость сущности и её возможности. Также он позволяет хорошо повышать вариативность расширяющих классов.
12. История паттернов и правила в их основе
YouTube
VK
Rutube
В этом заключительном видео мы отходим от практики и обсуждаем на две важные темы. Начинаем с истоков возникновения паттернов, а затем говорим о том, как урбанизм и проектирование городов помогли в создании книги «Паттерны проектирования». А еще — знакомимся с Кристофером Александром. В самом конце погружаемся в два фундаментальных правила, описанных в книге Design Patterns. Они входят в число ключевых подходов, на основе которых строятся многие паттерны, о которых мы рассказывали во всех предыдущих видео.
Полезные материалы
Эрик Фримен, Элизабет Фримен.
Паттерны проектирования.
Head First. Design Patterns
Эрик Гамма, Ричард Хелм, Ральф Джонсон, Джон Влиссидес.
Паттерны проектирования. Приемы объектно-ориентированного проектирования
Design Patterns. Elements of Reusable Object-Oriented
Software
предыдущие сезоны
{
2 сезон
VK
}
1. Принцип DRY
VK
В первой серии сезона рассматриваем принцип DRY, который борется с дубликатами в коде. Знакомимся с плюсами и минусами принципа, разбираем на практике примеры его использования и возможные подводные камни.
2. Бритва Оккама, KISS, YAGNI, BDUF
VK
Начинаем изучение порождающей группы паттернов и рассмотрим из них первые два — это Строитель и Фабричный метод. Первый позволяет создавать сложные объекты. Второй выносит операцию инстанцирования в специальные методы.
3. Закон Деметры, магические числа и другие принципы
VK
Рассказываем о том, как работают принцип наименьшего удивления, закон Деметры и магические числа. А ещё раскроем, почему стоит избегать преждевременных оптимизаций.
4. Принцип персональной ответственности (SRP)
VK
Начинаем погружение в SOLID-принципы. Рассматриваем плюсы и минусы принципа персональной ответственности, варианты его использования и показываем пример на коде учебного проекта.
5. Принцип открытости/закрытости (OCP)
VK
Продолжаем объяснять SOLID-принципы, а конкретно — принцип открытости/закрытости. Рассказываем, как принцип открытости/закрытости борется с изменениями в проекте и как с помощью него сконцентрировать задачи классов вокруг сложной бизнес-логики.
6. Принципы подстановки Лисков и разделения интерфейса (LSP и ISP)
VK
Рассматриваем сразу два SOLID-принципа за раз — подстановки Лисков и разделения интерфейса. На примерах разбираем их плюсы и минусы и рассказываем, как сделать код ещё более гибким.
7. Принцип инверсии зависимостей (DIP)
VK
Это видео завершает цикл про SOLID-принципы. Рассматриваем последний из них — принцип инверсии зависимости. Он объединяет в себе изученные ранее четыре принципа и выделяет создание объектов в отдельную абстракцию.
8. Hollywood Principle, IoC, Service Locator
VK
Разбираем Dependency Injection и подробно изучаем подходы Hollywood Principle, Inversion of Control и Service Locator. Обсуждаем, как и когда их можно применять, рассматриваем ситуации, когда эти подходы становятся излишними при работе с кодом.
9. Dependency Injection
VK
Говорим о принципе Dependency Injection и четырёх вариантах его реализации: через конструктор, сеттер-методы, интерфейс и свойство. Разбираем, в чём разница между принципами Dependency Injection, Dependency Inversion и Service Locator, и обсуждаем их плюсы и минусы.
10. DI-Container
VK
Рассматриваем Наблюдателя и Цепочку обязанностей. Они оба связаны с отправкой и обработкой событий, но делают это по-разному. В паттерне Наблюдатель субъект создаёт сообщение и отправляет его всем своим подписчикам. Его задача в уведомлении всех слушателей о необходимости отреагировать на изменения. Связь между субъектом и наблюдателями определяется как «один ко многим». Что же касается Цепочки Обязанностей, то в нём формируется цепочка из объектов-обработчиков. Сначала событие отправляется первому объекту и, если он не смог его обработать, то происходит передача следующему. И так — пока не будет пройдена вся цепочка.
Полезные материалы
Эндрю Хант, Дэвид Томас.
Программист-прагматик. Путь от подмастерья к мастеру
The Pragmatic Programmer. From Journey man to master
Ron Jeffries, Ann Anderson, Chet Hendrickson.
Extreme Programming. Installed
Роберт Мартин.
Чистая архитектура. Искусство разработки
программного обеспечения
Clean Architecture. A Craftsman’s Guide to
Software Structure and Design
Стив Макконнелл.
Совершенный код. Практическое руководство по разработке программного обеспечения
Code Complete. A Practical Handbook of Software Construction
Роберт Мартин.
Гибкая разработка
программ. Принципы, примеры, практика
Clean Architecture. A Craftsman’s Guide to
Software Structure and Design
Giancarlo Succi, Michele Marchesi.
Extreme Programming. Examined
Мартин Фаулер.
Рефакторинг. Улучшение существующего кода
Refactoring. Improving the Design of Existing Code
{
1 сезон
VK
}
1. Код-ревью и читаемость кода
VK
Первая тема посвящена важности читаемости кода и опасностям пренебрежения к его оформлению. Рассказываем, что такое код-ревью и как с ним работать, а также разбираем примеры кода, которые сложно читать.
2. Качество кода. От истории к классам.
VK
О целях и задачах классов, методов и переменных. Заодно немного вспомним историю и то, как развивались императивные программы, разберёмся, почему современные приложения стали такими сложными, а в разработке так много подходов и паттернов.
3. Вложенность и комментарии в коде
VK
Охватываем две больших темы: борьбу с сильной вложенностью кода и минимизацию использования комментариев. Посмотрим на примеры и разберёмся, как сделать код читаемым и понятным.
4. Работа с исключениями в коде
VK
Рассказываем про исключения. Разберемся, когда они нужны, а когда от них стоит отказаться. Также в самом конце подведём итоги и закроем большую тему качества кода, которой были посвящены последние несколько видео.
5. Проблемы больших проектов
VK
Разработка и поддержка проектов, развитие которых длится не менее года. Говорим о том, какие есть особенности в таких долгоживущих системах и как бороться со сложностями возникающие в них.
6. MVC, архитектура, проектирование и абстракции
VK
Рассматриваем самый известный и популярный в разработке паттерн, который реализуется практически во всех проектах — MVC. Затем разбираем разницу между проектированием и архитектурой. А завершаем ролик пониманием работы и воплощением абстракций в коде.
7. Проблемы плохих проектов
VK
В этом видео вы узнаете о проблемах в плохих проектах. Всего их будет семь. Рассматриваем каждый из них подробно и разбираемся, как их «лечить».
8. Подходы при проектировании
VK
Сравниваем и замечаем разницу диаметрально противоположных подходов при развитии продукта. Два варианта показывают разные точки зрения при проектировании. Стоит понимать, что здесь нет единственно верного решения. Каждое из них жизнеспособно и может быть применено в том или ином проекте. На примере интернет-магазина реализуем страницу оформления заказа.
9. Введение в GRASP-шаблоны
VK
Погружаемся в GRASP-шаблоны и определяем их место в процессе разработки. Также вы узнаете о том, что GRASP-шаблоны реализуются в рамках более общей темы под названием «объектно-ориентированный анализ и проектирование» (ООАП).
10. Low Coupling
VK
Рассматриваем Low coupling — слабую связанность — как этот подход экономит время, усилия и уменьшает количество ошибок при модификации проекта.
11. High Cohesion
VK
Изучаем High Cohesion — сильное сцепление — как этот подход фокусирует связанность методов для выполнения конкретного поведения компонента (класса).
12. UML-шаблоны
VK
Это видео всецело посвящено UML. Узнаете для чего он нужен и когда он наилучшим образом пригодится в работе. А также изучаем два его вида — диаграмма классов и последовательности.
Полезные материалы
Стив Макконнелл.
Совершенный код. Практическое руководство по разработке программного обеспечения
Code Complete. A Practical Handbook of Software Construction
Мартин Фаулер.
Refactoring. Improving the Design of Existing Code
Рефакторинг. Улучшение существующего кода
Маклафлин, Поллайс, Уэст.
Объектно-ориентированный анализ и проектирование
Head First. Object-Oriented Analysis & Design
Мартин Фаулер.
UML Основы. Краткое руководство по стандартному языку объектного моделирования
UML Distilled. A Brief Guide to the Standard Object Modeling Language
Мартин Фаулер.
Analysis Patterns. Reusable Object Models
Крэг Ларман.
Применение UML 2.0 и шаблонов проектирования. Введение в объектно-ориентированный анализ, проектирование и итеративную разработку.
Applying UML and Patterns. An Introduction to Object-Oriented Analysis and Design and Iterative Development
Роберт Мартин.
Чистый код. Создание, анализ и рефакторинг
Clean Code. A Handbook of Agile Software Craftsmanship
Часто задаваемые вопросы
VK
© ООО «Авито Тех» 2020–2025