This lesson is not translated yet – the Russian original is below.
Короткие определения всего, что встречается в курсе, – чтобы не перечитывать урок целиком ради одного слова. Формулировки здесь намеренно сжатые: за подробностями и примерами – в соответствующий урок.
Объект и класс
- Класс (class) – описание типа: какие у объектов этого типа данные и какое поведение.
- Объект (object) – экземпляр класса, живущий в памяти со своим состоянием.
- Экземпляр (instance) – то же, что объект, если нужно подчеркнуть связь с классом.
- Поле (field) – переменная внутри объекта, часть его состояния.
- Свойство (property) – доступ к данным через пару «прочитать/записать», за которой может стоять любая логика.
- Метод (method) – функция, привязанная к классу и работающая с его данными.
- Конструктор (constructor) – метод, который приводит новый объект в пригодное к работе состояние.
- Деструктор / финализатор – код, отрабатывающий при уничтожении объекта; в языках со сборщиком мусора момент вызова не гарантирован.
- Сборщик мусора (garbage collector) – механизм, освобождающий память под объекты, на которые больше никто не ссылается.
- Состояние (state) – текущие значения полей объекта.
- Поведение (behavior) – то, что объект умеет делать, набор его методов.
- Сигнатура (signature) – имя метода вместе с типами параметров и возвращаемого значения.
- Контракт (contract) – обещание метода: что он требует на входе и что гарантирует на выходе.
Четыре механизма
- Инкапсуляция (encapsulation) – данные и работающий с ними код собраны в одном классе, а наружу торчит только то, что нужно вызывающему.
- Сокрытие (information hiding) – закрытие деталей реализации, чтобы их можно было менять, не ломая пользователей класса.
- Модификатор доступа (access modifier) –
private,protected,publicи их аналоги: чем именно записывается сокрытие. - Наследование (inheritance) – класс получает данные и поведение другого класса и расширяет их.
- Базовый и производный класс (base / derived) – от кого наследуют и кто наследует; в других языках – суперкласс и подкласс.
- Переопределение (override) – производный класс заменяет реализацию метода базового.
- Перегрузка (overload) – несколько методов с одним именем и разными параметрами; выбор делает компилятор.
- Виртуальный метод (virtual method) – метод, реализацию которого выбирают по фактическому типу объекта во время выполнения.
- Таблица виртуальных методов (vtable) – служебная таблица адресов, через которую этот выбор и происходит.
- Полиморфизм (polymorphism) – один и тот же вызов работает с объектами разных типов.
- Статический полиморфизм – выбор реализации на компиляции: перегрузка, дженерики, шаблоны.
- Динамический полиморфизм – выбор реализации во время выполнения: виртуальные методы и интерфейсы.
- Дженерики / шаблоны (generics, templates) – код, параметризованный типом: один алгоритм для многих типов без потери проверок.
- Утиная типизация (duck typing) – подходит любой объект с нужными методами, без объявленного общего типа.
- Абстракция (abstraction) – выделение существенного и отбрасывание деталей: что объект делает, а не как.
- Интерфейс (interface) – контракт без реализации: список того, что тип обязан уметь.
- Абстрактный класс (abstract class) – наполовину готовый класс: часть поведения реализована, часть оставлена наследникам.
Связи между объектами
- Ассоциация (association) – один объект знает про другой и пользуется им.
- Агрегация (aggregation) – объект содержит другие, но те живут своей жизнью и переживают его.
- Композиция (composition) – объект владеет частями и уничтожает их вместе с собой.
- Делегирование (delegation) – объект перекладывает работу на другой объект вместо того, чтобы наследовать поведение.
- Зацепление (coupling) – насколько сильно классы завязаны друг на друга; чем слабее, тем дешевле изменения.
- Связность (cohesion) – насколько содержимое класса служит одной задаче; чем выше, тем понятнее класс.
- Хрупкий базовый класс (fragile base class) – ситуация, когда правка базового класса ломает наследников.
- Ромбовидное наследование (diamond problem) – конфликт при наследовании одного предка по двум путям.
- Божественный объект (god object) – класс, который знает и умеет всё; типичный итог неверно распределённой ответственности.
Проектирование
- Ответственность (responsibility) – обязанность класса: что он обязан знать и что делать.
- GRASP – девять правил распределения ответственностей (Крейг Ларман).
- Information Expert – ответственность берёт тот, у кого больше всего данных для неё.
- Creator – объекты создаёт тот, кто их агрегирует или преимущественно использует.
- Controller – объект, принимающий системные события и раздающий работу, сам логики не содержит.
- Low Coupling – минимум связей между классами.
- High Cohesion – одна задача на класс.
- Polymorphism (как правило GRASP) – ветвление по типу заменяется полиморфным вызовом.
- Pure Fabrication – искусственный класс, которого нет в предметной области, ради чистоты остальных.
- Indirection – посредник между двумя классами, чтобы развязать их напрямую.
- Protected Variations – изолировать точку возможных изменений устойчивым интерфейсом.
- SOLID – пять принципов проектирования классов (собраны Робертом Мартином).
- SRP – у класса одна причина для изменения.
- OCP – открыт для расширения, закрыт для изменения.
- LSP – наследник должен подставляться вместо предка, не ломая поведения.
- ISP – лучше несколько узких интерфейсов, чем один широкий.
- DIP – зависеть от абстракций, а не от конкретных реализаций.
- Внедрение зависимостей (dependency injection) – зависимости передают объекту снаружи, а не создаёт он сам.
- Инверсия управления (inversion of control) – каркас вызывает ваш код, а не наоборот.
- Рефакторинг (refactoring) – изменение структуры кода без изменения поведения.
- Запах кода (code smell) – признак, по которому видно, что структуру пора менять.
Паттерны
- Паттерн проектирования (design pattern) – типовое решение повторяющейся задачи проектирования: имя, проблема, решение, последствия.
- GoF – «банда четырёх», авторы книги «Design Patterns» (1994).
- Порождающие паттерны – про создание объектов.
- Структурные паттерны – про сборку объектов в более крупные структуры.
- Поведенческие паттерны – про распределение обязанностей и общение объектов.
Разобранные в курсе паттерны одной строкой:
- Singleton – ровно один экземпляр на всё приложение и общая точка доступа к нему.
- Factory Method – создание объекта вынесено в метод, который переопределяют наследники.
- Abstract Factory – семейство согласованных объектов создаётся через один интерфейс.
- Builder – пошаговая сборка сложного объекта отделена от его представления.
- Prototype – новый объект получается копированием готового.
- Adapter – чужой интерфейс переводится в тот, который ждёт ваш код.
- Bridge – абстракция и реализация разводятся по разным иерархиям.
- Composite – с деревом объектов работают так же, как с одним объектом.
- Facade – одно простое окно в сложную подсистему.
- Proxy – подставной объект перед настоящим: доступ, кеш, ленивая загрузка.
- Strategy – взаимозаменяемые алгоритмы за общим интерфейсом.
- Observer – подписчики узнают об изменении объекта без жёсткой связи с ним.
- Command – вызов упакован в объект: его можно передать, отложить, отменить.
- State – поведение меняется вместе с внутренним состоянием, без каскада
if. - Iterator – обход коллекции без раскрытия её устройства.
- Mediator – объекты общаются через посредника, а не напрямую.
- Memento – состояние объекта сохраняется и восстанавливается, не ломая инкапсуляцию.
- Chain of Responsibility – запрос идёт по цепочке обработчиков, пока кто-то его не возьмёт.
- Interpreter – грамматика языка выражается классами, а разбор – их обходом.