Шаблон данных частного класса - Private class data pattern

Данные частного класса это шаблон дизайна в компьютерное программирование используется для инкапсуляции атрибутов класса и управления ими.

Стандартная документация

Следующие категории документации для данные частного класса шаблон проектирования следует прецеденту стиля документации шаблона проектирования, установленному Банда четырех.

Название и классификация

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

Намерение

В данные частного класса Паттерн проектирования направлен на уменьшение раскрытия атрибутов за счет ограничения их видимости. Это уменьшает количество атрибутов класса, инкапсулируя их в один Данные объект. Это позволяет разработчику класса удалять права записи атрибутов, которые должны быть установлены только во время построения, даже из методов целевого класса.

Также известен как

PIMPL (Частное внедрение) или Непрозрачный указатель

Мотивация

Класс может подвергать свои атрибуты (переменные класса) манипуляциям, когда манипуляции больше не желательны, например после строительства. Использование шаблона проектирования данных частного класса предотвращает такие нежелательные манипуляции.

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

Мотивация для этого шаблона проектирования исходит из цели проектирования - защиты состояния класса за счет минимизации видимости его атрибутов (данных).

Применимость

Этот шаблон проектирования применим к любому классу во многих объектно-ориентированных языках.

Структура

Участников

Сотрудничество

Последствия

Последствия использования этого шаблона проектирования включают следующее:

  • Управление доступом на запись к атрибутам класса;
  • Отделение данных от методов, которые их используют;
  • Инициализация атрибута (данных) класса инкапсуляции; и
  • Предоставление нового типа окончательный: final после конструктора.

Реализация

Шаблон проектирования данных частного класса решает указанные выше проблемы путем извлечения класс данных для целевого класса и предоставление экземпляру целевого класса экземпляра извлеченного класс данных.

  • В класс данных предоставляет каждый атрибут (переменную или свойство) через добытчик.
  • В класс данных предоставляет каждый атрибут, который должен измениться после построения, с помощью сеттер.

Образец кода

Следующее C # код иллюстрирует возможность использования шаблона проектирования данных частного класса:

общественный класс Круг{    частный двойной _радиус;    частный цвет _цвет;    частный Точка _origin;    общественный Круг(двойной радиус, цвет цвет, Точка происхождение)    {        этот._радиус = радиус;        этот._цвет = цвет;        этот._origin = происхождение;    }    общественный двойной Длина окружности => 2 * Математика.ПИ * этот._радиус;    общественный двойной Диаметр => 2 * этот._радиус;    общественный пустота Привлечь(Графика графика)    {        //...    }}

Атрибуты радиус, цвет, и происхождение выше не должно измениться после Круг() конструктор. Обратите внимание, что видимость уже ограничена, если их определить как частный, но выполняя методы класса Круг все еще можно изменить их.

Избыточное раскрытие атрибутов создает своего рода (нежелательную) связь между методами, которые обращаются к этим атрибутам. Чтобы уменьшить видимость атрибутов и, таким образом, уменьшить взаимосвязь, реализуйте шаблон проектирования данных частного класса следующим образом:

общественный класс CircleData{    частный двойной _радиус;    частный цвет _цвет;    частный Точка _origin;    общественный CircleData(двойной радиус, цвет цвет, Точка происхождение)    {        этот._радиус = радиус;        этот._цвет = цвет;        этот._origin = происхождение;    }    общественный двойной Радиус => этот._радиус;    общественный цвет цвет => этот._цвет;    общественный Точка Происхождение => этот._origin;}общественный класс Круг{    частный CircleData _circleData;    общественный Круг(двойной радиус, цвет цвет, Точка происхождение)    {        этот._circleData = новый CircleData(радиус, цвет, происхождение);    }    общественный двойной Длина окружности => 2 * этот._circleData.Радиус * Математика.ПИ;    общественный двойной Диаметр => этот._circleData.Радиус * 2;    общественный пустота Привлечь(Графика графика)    {        //...    }}

В Круг класс в результирующем коде имеет атрибут типа CircleData для инкапсуляции атрибутов, ранее представленных всем методам класса Круг. Эта инкапсуляция не позволяет методам изменять атрибуты после Круг() конструктор. Обратите внимание, однако, что любой метод Круг все еще может извлекать значения инкапсулированных атрибутов.

Известные применения

В Фреймворк Qt использует шаблон данных частного класса в своих разделяемых библиотеках.[1] Классы, реализующие шаблон, включают «d-указатель» на класс данных. Предоставляются методы для управления переменными-членами в классе данных, позволяющие вносить изменения без нарушения двоичной совместимости.

Смотрите также

использованная литература

  1. ^ "D-указатель". Получено 7 января 2017.