Концепции и принципы ООП

Категория: PHP

Программа, разработанная с помощью ОО подхода (объектно-ориентированного), представляет собой действующую модель решаемой задачи.

Терминология

Объект - конструкция, в которой инкапсулировано состояние (свойства) и поведение (методы). По факту, методы реализуют поведение объекта. В чистом ОО языке программирования все данные являются объектами. От простых базовых типов данных до сложных экземпляров классов.

От общего к частному: ООП » (инкапсуляция, наследование, полиморфизм, [композиция]) » GRASP » GoF

Преимущества, цели и принципы ОО подхода

  1. Естественность. Построение модели на функциональном уровне, а не на уровне реализации. Использование объектов из конкретной доменной модели (предметной области).
  2. Надежность, сопровождение, расширение. Достигается за счет изолированности компонент системы. Изменение одной компоненты не влияет (не должно влиять) на другие части.
  3. Повторное использование классов.

Инкапсуляция

Инкапсуляция - упрощенно, это объединение атрибутов и методов в одной сущности ("черном ящике"). Инкапсуляция является объектно-ориентированной характеристикой модульности. И позволяет разбить программу на модули, выполняющие определённые ф-ции, детали реализации которых скрыты за интерфейсом.

Интерфейс - описывает общедоступные методы предоставляемые компонентом, через которые можно посылать сообщения объекту. Благодаря инкапсуляции программа не привязывается к конкретным объектам.

Понятие инкапсуляции ООП полностью заимствовало из модульного программирования.

Три характерных признака эффективной инкапсуляции

  1. Абстракция - процесс упрощения сложной схемы взаимодействия объектов путём изъятия всех несущественных, оставляя только корневые объекты и супер-важные связи. Преимущества: упрощение решения и повторное использование объектов из разных доменных областей. Важно: грань между абстракцией и детализацией очень тонка.
  2. Сокрытие реализации (за интерфейсом) - нужно для защиты объектов от пользователя и наоборот.
  3. Делегирование ответственности.

Правила эффективной абстракции

  1. Нужно рассматривать общий случай, а не конкретный;
  2. Нужно распознать основной принцип, а не только общую последовательность;
  3. Абстрагируясь, нужно вспоминать о решаемой задаче;
  4. Абстракцию можно применять к задачам, которые уже решались вами не менее 3-х раз;
  5. Абстракция не всегда очевидна. А также не возможно написать абстрактную программу на любой случай;

Как эффективно скрывать реализацию и создавать слабосвязанные объекты

  1. Доступ к данным абстрактного типа должен осуществляться только через методы интерфейса (скрываем реализацию);
  2. Исключить возможность бесконтрольного доступа к структурам данных;
  3. Не следует угадывать тип данных, если поведение метода не описано в интерфейсе;
  4. Быть осторожным при написании 2-х тесно связанных типов;

Наследование

Наследование используется для простоты расширения класса. При наследовании нужно соблюдать сигнатуру методов (конструкторы тоже, с версии PHP 5.4). При наследовании допускается понижение строгости при указании области видимости (уровня доступа).

Полиморфизм

Полиморфизм ввели для простого и гибкого изменения программ.


Классы, методы, свойства

Типы классов:

  • Абстрактный;
    • Класс, который содержит по крайней мере один абстрактный метод, должен быть определен как абстрактный;
    • Нельзя создать экземпляр абстрактного класса;
  • Интерфейс;
    • Методы интерфейсов не могут содержать реализацию и должны быть публичными;
    • Класс не может реализовать два интерфейса, содержащих одноименную функцию;
    • Интерфейсы могут наследоваться;
    • Сигнатуры методов в реализующем классе должны точно соответствовать сигнатурам в интерфейсе;

Типы методов:

  • Абстрактный;
    • Не содержат реализации, а требует ее в дочернем классе;
  • Статический;
    • Реализация не переопределяется (в отличие от абстрактных);


категория: PHP