ООП и паттерны Flashcards
- Основные принципы ООП - инкапсуляция, наследование и полиморфизм. Как их можно использовать?
- Инкапсуляция - принцип, когда класс скрывает в себе логику работы с данными и сами данные, выставляя наружу только публичные методы.
(ограничение доступа одних компонентов к другим)
Делая свойство приватным, предотвращаем изменение его значения не через set метод.
- Наследование - принцип, при котором один класс(наследник) переиспользует все поля и методы другого класса(суперкласс).
Применить можно для однотипных сущностей, наследуясь от абстрактной.
- Полиморфизм - принцип, предполагающий взаимозаменяемость объектов с одинаковым интерфейсом
Язык PHP поддерживает полиморфизм в том смысле, что позволяет использовать вместо экземпляров родительского класса экземпляры подкласса.
- Что такое namespace и для чего он служит? Как ими пользоваться?
Один из способов инкапсуляции элементов.
Делает разрешимыми конфликты имен между вашим кодом и внутренними или сторонними классами.
Хотя любой корректный PHP-код может находиться внутри пространства имен, только классы (включая абстрактные и трейты), интерфейсы, функции и константы зависят от него.
Пространства имен объявляются с помощью зарезервированного слова namespace. Файл, содержащий пространство имен, должен содержать его объявление в начале перед любым другим кодом, кроме зарезервированного слова declare.
use импорт классов из других namespace
as создание псевдонима
- Что такое абстрактные классы и интерфейсы? Зачем они нужны?
Абстрактный класс предстовляет собой каркас для наследования других сущностей, у него не может быть объектов, все абстрактные методы должны быть определены в дочерних классах.
Интерфейс - класс, по сути являющийся контрактом, который должны выполнить реализующие его классы, преобретая тем самым взаимозаменяемость, содержит только сигнатуры методов.
Интерфейс описывает поведение.
a. В каких случаях следует использовать интерфейсы?
Интерфейсы стоит создавать когда есть общая задача и несколько вариантов ее решения, применяемых в зависимости от ситуации
b. Что такое трейты? Для чего они нужны?
Трейты - механиз обеспечения повторного использования кода в языках с поддержкой только одиночного наследования.
Трейты похожи на абстрактные классы. Они реализуют какую-то общую функциональность и с ними нельзя работать напрямую. Единственный способ использовать их – включение в другие классы.
- Что такое паттерны программирования? Для чего они нужны? Примеры.
Паттерны программирования - описывают типичные способы решения часто встречающихся проблем при поектировании программ
+ проверенные решения
+ стандартизация кода
+ общий программисткий словарь
Какие есть типы паттернов? Какую задачу решает каждый из них?
a. Поведенческие
b. Структурные
c. Порождающие
Порождающие - эти паттерны отвечают за удобное и безопасное создание новых объектов или даже целых семейств объектов (фабрика)
Структурные - разные способы построения связи между объектами (адаптер, декоратор).
Поведенческие - коммуникация между объектами (стратегия, наблюдатель)
- Что такое Инъекция Зависимости (Dependency Injection) (паттерн)? Зачем это нужно?
Паттерн, который позволяет писать слабосвязный код. Идея в том, чтобы одни компоненты слабо зависели от других. Чтобы без осложнений можно было подменить один код другим.
- Что такое Фабричный метод/фабрика (паттерн)? Зачем это нужно?
Фабричный метод - определяет общий интерфейс для создания объектов в базовом классе, позволяя дочерним элементам изменять тип создаваемых объектов. Паттерн предлагает создавать объект не напрямую через new, а через вызов особого фабричного метода. Чтобы система заработала, все возвращаемые объекты должны иметь общий интерфейс (мебель - стол, стулья)
Во-первых, если вам понадобится изменить, переименовать или заменить класс порождаемый позже, вы можете это сделать, и вам нужно будет изменить только код фабричного метода, а не в каждом месте вашего проекта, которое использует класс порождаемого.
Второе возможное преимущество состоит в том, что если создание объекта - сложная работа, вы можете выполнять всю работу на фабрике, вместо того, чтобы повторять ее каждый раз, когда вы хотите создать новый экземпляр.
В абстрактной фабрике речь идет уже не о продуктах, а о семействах продуктов (стол и стулья обычные, викторианские, минималистичные и т.д.)
Для начала надо определить общие интерфейсы для отдельных продуктов, далее создается АФ - общий интерфейс создания всех продуктов семейства, который возвращает абстрактные типы продуктов.
Для каждой вариации семейства продуктов создается своя фабрика, реализующая абстрактный интерфейс.
- Что такое магические методы? Для чего они нужны? Примеры.
Зарезервированные методы, начинающиеся с двойного подчеркивания, могут вызываться при совершении какого-то действия автоматически.
__get, __set, __isset, __unset
Они позволяют определить, каким образом будут взаимодействовать извне со свойствами, объявленными с модификатором доступа private или protected, либо вообще отсутствующими у объекта.
Метод __construct() автоматически вызывается, когда был создан экземпляр объекта. В нем вы можете задать начальные свойства объекта или установить зависимости.
- Что такое позднее статическое связывание? Для чего оно нужно?
позволяет объектам все также наследовать методы у родительских классов, но помимо этого дает возможность унаследованным методам иметь доступ к статическим константам, методам и свойствам класса потомка, а не только родительского класса.
PHP определят значение для self::NAME во время парсинга, а для static::NAME значение будет определено в момент запуска
a. Привести пример использования в Drupal8.
Каждый объект, который использует ContainerInjectionInterface (например, контроллеры, формы и блоки), должен реализовать фабричный метод create () для передачи зависимостей в конструктор класса, этот статический метод возвращает новый экземпляр класса с уже внедренной зависимостью, а для того чтобы этот экземпляр был от класса наследника, а не предка вызывается return new static, а не return new self
b. Что такое Инверсия Контроля? Зачем она нужна?
принцип проектирования, используемый для уменьшения связанности компонентов, применяется обычно к фреймворкам. Фреймворки предоставляют точки подключения, в которых вы можете писать свой код. Но при этом общим выполнением программы по-прежнему управляет фреймворк, время от времени вызывая ваш код. Инверсия заключается в том, что в отличии от традиционного подхода не вы вызываете библиотечный код, а библиотечный код вызывает вас.