Course program← Объектно ориентированное программирование
1История ООП
2Объект и Класс
3Базовые концепции ООП
4Принцип проектирования GRASP
5Принцип проектирования SOLID
6Паттерны GOF
7Методические материалы

Словарик терминов

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 – грамматика языка выражается классами, а разбор – их обходом.