Концепции и принципы ООП
Программа, разработанная с помощью ОО подхода (объектно-ориентированного), представляет собой действующую модель решаемой задачи.
Терминология
Объект - конструкция, в которой инкапсулировано состояние (свойства) и поведение (методы). По факту, методы реализуют поведение объекта. В чистом ОО языке программирования все данные являются объектами. От простых базовых типов данных до сложных экземпляров классов.
От общего к частному: ООП » (инкапсуляция, наследование, полиморфизм, [композиция]) » GRASP » GoF
Преимущества, цели и принципы ОО подхода
- Естественность. Построение модели на функциональном уровне, а не на уровне реализации. Использование объектов из конкретной доменной модели (предметной области).
- Надежность, сопровождение, расширение. Достигается за счет
изолированности компонент системы. Изменение одной компоненты не влияет (не должно влиять) на другие части.
- Повторное использование классов.
Инкапсуляция
Понятие инкапсуляции ООП полностью заимствовало из модульного программирования.
Три характерных признака эффективной инкапсуляции
- Абстракция - процесс упрощения сложной схемы взаимодействия объектов путём изъятия всех несущественных, оставляя только корневые объекты и супер-важные связи. Преимущества: упрощение решения и повторное использование объектов из разных доменных областей. Важно: грань между абстракцией и детализацией очень тонка.
- Сокрытие реализации (за интерфейсом) - нужно для защиты объектов от пользователя и наоборот.
- Делегирование ответственности.
Правила эффективной абстракции
- Нужно рассматривать общий случай, а не конкретный;
- Нужно распознать основной принцип, а не только общую последовательность;
- Абстрагируясь, нужно вспоминать о решаемой задаче;
- Абстракцию можно применять к задачам, которые уже решались вами не менее 3-х раз;
- Абстракция не всегда очевидна. А также не возможно написать абстрактную программу на любой случай;
Как эффективно скрывать реализацию и создавать слабосвязанные объекты
- Доступ к данным абстрактного типа должен осуществляться только через методы интерфейса (скрываем реализацию);
- Исключить возможность бесконтрольного доступа к структурам данных;
- Не следует угадывать тип данных, если поведение метода не описано в интерфейсе;
- Быть осторожным при написании 2-х тесно связанных типов;
Наследование
Наследование используется для простоты расширения класса. При наследовании нужно соблюдать сигнатуру методов (конструкторы тоже, с версии PHP 5.4). При наследовании допускается понижение строгости при указании области видимости (уровня доступа).
Полиморфизм
Полиморфизм ввели для простого и гибкого изменения программ.
Классы, методы, свойства
Типы классов:
- Абстрактный;
- Класс, который
содержит по крайней мере один абстрактный метод, должен быть определен как
абстрактный;
- Нельзя создать экземпляр абстрактного класса;
- Интерфейс;
- Методы интерфейсов не могут содержать реализацию и должны быть публичными;
- Класс не может реализовать два интерфейса, содержащих одноименную
функцию;
- Интерфейсы могут наследоваться;
- Сигнатуры методов в реализующем классе должны точно соответствовать сигнатурам в интерфейсе;
Типы методов:
- Абстрактный;
- Не содержат реализации, а требует ее в дочернем классе;
- Статический;
- Реализация не переопределяется (в отличие от абстрактных);