Инкапсуляция. Сокрытие данных и функциональности от клиентского кода

Опубликовал read-php в 28.01.2011 Категория: Объекты и методология проектирования в ООП на PHP

Инкапсуляция — это просто сокрытие данных и функциональности от клиентского кода. И опять-таки, это ключевое понятие объектно-ориентированного программирования .

На самом простейшем уровне мы инкапсулируем данные, объявляя свойства как private или protected. Скрывая свойство от клиентского кода, мы вводим в действие интерфейс и тем самым предотвращаем случайное повреждение данных объекта.

Полиморфизм иллюстрирует другой вид инкапсуляции. Размещая различные реализации за общим интерфейсом, мы скрываем работающий в их основе механизм от клиентского кода. Это означает, что любые изменения, внесенные за этим интерфейсом, являются прозрачными для более широкой системы. Мы можем добавлять новые классы или менять код в классе, что не приведет к возникновению ошибок. Значение имеет только интерфейс, а не механизм, работающий в его основе. Чем более независимы эти механизмы, тем меньше вероятности, что внесенные изменения или поправки будут иметь «эффект домино» для ваших проектов.

Инкапсуляция— это, в некотором отношении, ключ к объектно-ориентированному программированию. Наша цель — сделать каждую часть как можно более независимой от других. Классы и методы должны получать столько информации, сколько необходимо для выполнения назначенных им задач, которые должны быть ограничены по контексту и четко определены.

Введение ключевых слов private, protected и public облегчает инкапсуляцию. Но инкапсуляция— это также и образ мыслей. В PHP 4 не предусмотрено формальной поддержки для сокрытия данных. О конфиденциальности необходимо было предупреждать с помощью документации и соглашений о наименовании. Например, символ подчеркивания — это обычный способ предупреждения о закрытом свойстве, var $_touchezpas;

Конечно, код должен быть внимательно проверен, потому что конфиденциальность не была строго определена. Но что интересно, ошибки случались редко, потому что структура и стиль кода довольно четко определяли, какие свойства трогать нельзя.

Кроме того, даже в PHP 5 мы можем нарушить правила и выяснить точный подтип объекта, который мы используем в контексте замены классов, просто передав его методу get_class ().

function workWithProducts( ShopProduct $prod ) {

if ( get_class( $prod ) == «cdproduct» ) {

// Обработка данных CD } else if ( get_class( $prod ) == «bookproduct» ) {

// Обработка данных книги

Для выполнения подобных действий должна быть серьезная причина, поскольку в целом это вносит определенный элемент сумбура. Запрашивая конкретный подтип, как в данном примере, мы устанавливаем жесткую зависимость. Если же специфика подтипа скрыта полиморфизмом, то можно совершенно безболезненно изменить иерархию наследования класса ShopProduct, не опасаясь негативных последствий. Но в нашем коде этому положен предел. Теперь, если нам нужно усовершенствовать классы CDProduct и BookProduct, мы должны помнить о возможности нежелательных побочных эффектов в методе workwithProducts ().

Из этого примера мы должны вынести два урока. Во-первых, инкапсуляция помогает создать ортогональный код. Во-вторых, степень инкапсуляции, которую можно ввести в силу, к делу не относится. Инкапсуляция— это методика, которую должны соблюдать в равной степени и классы, и их клиенты.

Комментариев нет

Добавить комментарий