Виділення приватного класу даних (Private class data) - це структурний шаблон проєктування, який використовується для інкапсуляції атрибутів і маніпуляції нам ними. Частковий випадок рефакторингу - "".
Стандартна документація
Категорії документації для шаблону проєктування private class data описані згідно з матеріалами книги Gang of Four.
Ім'я та класифікація
- Назва шаблону
- Цей шаблон проєктування відомий як private class data.
- Класифікація шаблону
- Це один зі структурних шаблонів проєктування.
Мета
Шаблон проєктування private class data прагне до скорочення стороннього впливу на атрибути, обмежуючи їх область видимості. Він скорочує кількість атрибутів класу інкапсулюючи їх в Data об'єкт. Це дозволяє позбутись прав на зміну атрибутів, які за задумом, мають бути незмінними після того, як вони були ініціалізовані в конструкторі. Атрибути не можуть бути змінені навіть методами цільового класу.
Також відомий як
Pimpl (Private IMPLementation) чи непрозорий вказівник
Мотивація
Клас може змінювати значення атрибутів, навіть якщо такі зміни є небажані. Наприклад: після ініціалізації атрибутів в конструкторі класу. Використання шаблону проєктування private class data запобігає таким небажаним змінам.
Клас може мати одноразово-змінювані які не можуть бути оголошені з ключовим словом final. Використання цього шаблону дозволяє реалізувати одноразове надання значень цим атрибутам.
Ідея створення такого шаблону походить від тези про захист стану об'єкта класу шляхом мінімізації області видимості його атрибутів (даних).
Застосовність
Цей шаблон проєктування є застосовний для будь-якого класу в будь-якій об'єктно-орієнтованій мові програмування.
Структура
Учасники
Співпраця
Наслідки
Наслідки використання цього шаблону проєктування включають в себе наступне:
- Контроль прав на запис для атрибутів класу;
- Відділення даних від методів які використовують ці дані;
- Інкапсуляція ініціалізації атрибутів (даних) класу;
- Введення нового типу для службового слова final: незмінність після конструктора;
Реалізація
Шаблон проєктування private class data вирішує проблеми описані вище. Наслідками його застосування є:
- Клас даних доступається до кожного атрибута (змінної чи властивості) через getter [ 17 березня 2015 у Wayback Machine.].
- Клас даних змінює кожний атрибут (змінну чи властивість) після виходу з конструктора - лише через setter [ 17 березня 2015 у Wayback Machine.].
Зразки коду
Код на C#, наведений нижче, ілюструє те, яким чином можна застосувати цей шаблон:
public class Circle { private double radius; private Color color; private Point origin; public Circle(double radius, Color color, Point origin) { this.radius = radius; this.color = color; this.origin = origin; } public double Circumference { get { return 2 * Math.PI * this.radius; } } public double Diameter { get { return 2 * this.radius; } } public void Draw(Graphics graphics) { //... } }
Атрибути radius, color і origin, наведені вище не повинні змінюватись в конструкторі Circle(). Зверніть увагу що їх область видимості обмежена, оскільки вони оголошені як private, але методи класу Circle все ще можуть модифікувати їх. Надмірний вплив атрибутів створює (небажаний) зв'язок між методами які доступаються до атрибутів. Щоб зменшити область видимості атрибутів і, таким чином, зменшити зв'язність коду, ми застосуємо шаблон private class data, як показано нижче:
public class CircleData { private double radius; private Color color; private Point origin; public CircleData(double radius, Color color, Point origin) { this.radius = radius; this.color = color; this.origin = origin; } public double Radius { get { return this.radius; } } public Color Color { get { return this.color; } } public Point Origin { get { return this.origin; } } } public class Circle { private CircleData circleData; public Circle(double radius, Color color, Point origin) { this.circleData = new CircleData(radius, color, origin); } public double Circumference { get { return 2 * this.circleData.Radius * Math.PI; } } public double Diameter { get { return this.circleData.Radius * 2; } } public void Draw(Graphics graphics) { //... } }
Клас Circle тепер має атрибут типу CircleData який інкапсулює атрибути, які раніше були доступні напряму з класу Circle. Це застерігає методи класу від зміни атрибутів після того, як був викликаний конструктор класу Circle(). Зауважте, що не зважаючи на це, методи класу Circle все ще можуть повертати значення інкапсульованих атрибутів.
До застосування шаблону:
class Circle { private $radius; private $color; private $origin; public function __construct($radius, $color, $origin) { $this->radius = $radius; $this->color = $color; $this->origin = $origin; } public function getCircumference() { return 2 * M_PI * $this->radius; } public function getDiameter() { return 2 * $this->radius; } public function draw() { //... } }
class CircleData { private $radius; private $color; private $origin; public function __construct($radius, $color, $origin) { $this->radius = $radius; $this->color = $color; $this->origin = $origin; } public function getRadius() { return $this->radius; } public function getColor() { return $this->color; } public function getOrigin() { return $this->origin; } } class Circle { private $circleData; public function __construct($radius, $color, $origin) { $this->circleData = new CircleData($radius, $color, $origin); } public function getCircumference() { return $this->circleData->getRadius() * M_PI; } public function getDiameter() { return $this->circleData->getRadius() * 2; } public function draw() { //... } }
Застосування
Пов'язані шаблони проєктування
Посилання
- Sourcemaking.com article [ 2 жовтня 2015 у Wayback Machine.]
Вікіпедія, Українська, Україна, книга, книги, бібліотека, стаття, читати, завантажити, безкоштовно, безкоштовно завантажити, mp3, відео, mp4, 3gp, jpg, jpeg, gif, png, малюнок, музика, пісня, фільм, книга, гра, ігри, мобільний, телефон, android, ios, apple, мобільний телефон, samsung, iphone, xiomi, xiaomi, redmi, honor, oppo, nokia, sonya, mi, ПК, web, Інтернет
Vidilennya privatnogo klasu danih Private class data ce strukturnij shablon proyektuvannya yakij vikoristovuyetsya dlya inkapsulyaciyi atributiv i manipulyaciyi nam nimi Chastkovij vipadok refaktoringu Standartna dokumentaciyaKategoriyi dokumentaciyi dlya shablonu proyektuvannya private class data opisani zgidno z materialami knigi Gang of Four Im ya ta klasifikaciya Nazva shablonu Cej shablon proyektuvannya vidomij yak private class data Klasifikaciya shablonu Ce odin zi strukturnih shabloniv proyektuvannya Meta Shablon proyektuvannya private class data pragne do skorochennya storonnogo vplivu na atributi obmezhuyuchi yih oblast vidimosti Vin skorochuye kilkist atributiv klasu inkapsulyuyuchi yih v Data ob yekt Ce dozvolyaye pozbutis prav na zminu atributiv yaki za zadumom mayut buti nezminnimi pislya togo yak voni buli inicializovani v konstruktori Atributi ne mozhut buti zmineni navit metodami cilovogo klasu Takozh vidomij yak Pimpl Private IMPLementation chi neprozorij vkazivnik Motivaciya Klas mozhe zminyuvati znachennya atributiv navit yaksho taki zmini ye nebazhani Napriklad pislya inicializaciyi atributiv v konstruktori klasu Vikoristannya shablonu proyektuvannya private class data zapobigaye takim nebazhanim zminam Klas mozhe mati odnorazovo zminyuvani yaki ne mozhut buti ogolosheni z klyuchovim slovom final Vikoristannya cogo shablonu dozvolyaye realizuvati odnorazove nadannya znachen cim atributam Ideya stvorennya takogo shablonu pohodit vid tezi pro zahist stanu ob yekta klasu shlyahom minimizaciyi oblasti vidimosti jogo atributiv danih Zastosovnist Cej shablon proyektuvannya ye zastosovnij dlya bud yakogo klasu v bud yakij ob yektno oriyentovanij movi programuvannya Struktura Uchasniki Spivpracya Naslidki Naslidki vikoristannya cogo shablonu proyektuvannya vklyuchayut v sebe nastupne Kontrol prav na zapis dlya atributiv klasu Viddilennya danih vid metodiv yaki vikoristovuyut ci dani Inkapsulyaciya inicializaciyi atributiv danih klasu Vvedennya novogo tipu dlya sluzhbovogo slova final nezminnist pislya konstruktora Realizaciya Shablon proyektuvannya private class data virishuye problemi opisani vishe Naslidkami jogo zastosuvannya ye Klas danih dostupayetsya do kozhnogo atributa zminnoyi chi vlastivosti cherez getter 17 bereznya 2015 u Wayback Machine Klas danih zminyuye kozhnij atribut zminnu chi vlastivist pislya vihodu z konstruktora lishe cherez setter 17 bereznya 2015 u Wayback Machine Zrazki kodu Kod na C navedenij nizhche ilyustruye te yakim chinom mozhna zastosuvati cej shablon public class Circle private double radius private Color color private Point origin public Circle double radius Color color Point origin this radius radius this color color this origin origin public double Circumference get return 2 Math PI this radius public double Diameter get return 2 this radius public void Draw Graphics graphics Atributi radius color i origin navedeni vishe ne povinni zminyuvatis v konstruktori Circle Zvernit uvagu sho yih oblast vidimosti obmezhena oskilki voni ogolosheni yak private ale metodi klasu Circle vse she mozhut modifikuvati yih Nadmirnij vpliv atributiv stvoryuye nebazhanij zv yazok mizh metodami yaki dostupayutsya do atributiv Shob zmenshiti oblast vidimosti atributiv i takim chinom zmenshiti zv yaznist kodu mi zastosuyemo shablon private class data yak pokazano nizhche public class CircleData private double radius private Color color private Point origin public CircleData double radius Color color Point origin this radius radius this color color this origin origin public double Radius get return this radius public Color Color get return this color public Point Origin get return this origin public class Circle private CircleData circleData public Circle double radius Color color Point origin this circleData new CircleData radius color origin public double Circumference get return 2 this circleData Radius Math PI public double Diameter get return this circleData Radius 2 public void Draw Graphics graphics Klas Circle teper maye atribut tipu CircleData yakij inkapsulyuye atributi yaki ranishe buli dostupni napryamu z klasu Circle Ce zasterigaye metodi klasu vid zmini atributiv pislya togo yak buv viklikanij konstruktor klasu Circle Zauvazhte sho ne zvazhayuchi na ce metodi klasu Circle vse she mozhut povertati znachennya inkapsulovanih atributiv Kod na php Do zastosuvannya shablonu class Circle private radius private color private origin public function construct radius color origin this gt radius radius this gt color color this gt origin origin public function getCircumference return 2 M PI this gt radius public function getDiameter return 2 this gt radius public function draw I pislya class CircleData private radius private color private origin public function construct radius color origin this gt radius radius this gt color color this gt origin origin public function getRadius return this gt radius public function getColor return this gt color public function getOrigin return this gt origin class Circle private circleData public function construct radius color origin this gt circleData new CircleData radius color origin public function getCircumference return this gt circleData gt getRadius M PI public function getDiameter return this gt circleData gt getRadius 2 public function draw Zastosuvannya Pov yazani shabloni proyektuvannya Strukturni shabloni PosilannyaSourcemaking com article 2 zhovtnya 2015 u Wayback Machine