Що таке метакласи в perl

Що таке метакласи. Для чого потрібні метакласи. Що таке метаоб'ектний протокол. Що таке Class :: MOP. Для чого використовується Class :: MOP.

Що таке метакласи?

В ООП метаклассом є клас, екземплярами якого не є об'єкти, як зазвичай, а класи. Так само, як звичайний клас визначає поведінку деяких об'єктів, метаклассом визначає поведінку деяких класів і їх примірників.

Не всі мови програмування, що підтримують парадигму ООП, підтримують метакласи. При цьому, рівень підтримки метаклассом кожним мовою може досить сильно відрізнятися. Відрізняються також і реалізації протоколу метаоб'ектов, принципи, які керують взаємодією об'єктів, класів і метаклассом.

Серед найпопулярніших мов, метакласи підтримують: Objective-C, Python, Perl і Ruby.

Іноді ідею метаклассом порівнюють з шаблоном проектування «Фабрика».

Для чого потрібні метакласи?

Ідея метаклассом виникає в об'єктно-орієнтованих мовах програмування. З її допомогою реалізується завершений рекурсивний дизайн системи. Зручно при роботі з ієрархіями класів.

Для Perl в чистому вигляді, ідея метаклассом абсолютно чужорідна. Хоча цікава з точки зору архітектури та реалізації.

Що таке метаоб'ектний протокол?

Метаоб'ектний протокол - це механізм для визначення і використання нових метаклассом.

Метаоб'ектний протокол визначає безліч функцій, які містять методи для класів. Програмування на рівні метаоб'ектного протоколу - це визначення нових класів разом з методами для цих класів.

Метакласи в perl

У чистому Perl 5 такі поняття, як пакет, клас, метод, конструктор не мають чітких відмінностей і кордонів. Поняття атрибута взагалі відсутня.

Реалізація метаклассом в Perl здійснюється за допомогою метаоб'ектного протоколу, який представлений системою Class :: MOP. Class :: MOP і метакласи широко використовуються популярним Moose (Офіційне визначення: «Moose - розширення для Perl 5, що дозволяє спростити реалізацію ООП». Я не згодна з тим, що Moose щось там спрощує. На мій погляд, все абсолютно навпаки) .

Class :: MOP чітко розмежовує поняття класів, методів, пакетів, додає поняття атрибута. Moose, завдяки Class :: MOP, наближає ООП в perl до загальноприйнятих стандартів.

Тобто по суті, Class :: MOP - це більше, ніж просто спосіб створювати метакласи.

Метаоб'ектний протокол в perl, Class :: MOP

Метаоб'ектний протокол створює абстрактні поняття класів, методів, об'єктів, атрибутів. Ці абстракції можуть бути використані для перевірки і управління тими елементами системи, які вони описують.

Для непідготовленої людини все вищенаписане звучить, як повна маячня. Тому, краще всього почати розбирати метакласи і метаоб'ектний протокол на прикладах.

Метаоб'ектний протокол в perl реалізований модулем Class :: MOP і включає в себе 4 подпротокола:

  • Class protocol - Засіб управління класами. Реалізується через Class :: MOP :: Class.
  • Attribute protocol - Реалізує управління атрибутами класів. Реалізується через Class :: MOP :: Attribute. Може бути розширений за допомогою наслідування.
  • Method protocol - Засіб для роботи з методами об'єктної системи. Реалізується через Class :: MOP :: Method.
  • Instance protocol - Забезпечує деякий рівень абстракції для створення екземплярів об'єктів. Реалізується через Class :: MOP :: Instance

Instance protocol сьогодні розглядатися не буде.

Class protocol

Class :: MOP :: Class - клас метаоб'екта. Даний протокол є найбільшою і найскладнішою частиною Class :: MOP.

Class :: MOP :: Class є підкласом Class :: MOP :: Module. Class :: MOP :: Module, в свою чергу, є підкласом Class :: MOP :: Package. Package Protocol надає абстракцію для perl-пакетів і методи для роботи з простором імен.

Створений об'єкт буде об'єктом метаклассом.

Якщо ви спробуєте повторно створити об'єкт, то просто отримаєте посилання на вже створений екземпляр.

методи для управління успадкуванням

Можна отримати список всіх підкласів, або, навпаки, стати спадкоємцем якогось класу. Методи працюють з @ISA.

методи для роботи з методами класу

Можна використовувати цей тип методів, для створення методів класу, їх видалення і зміни. Дані методи у своїй роботі будуть посилатися на об'єкти Class :: MOP :: Method.

методи для роботи з атрибутами класів

Методи працюватимуть з об'єктами класу Class :: MOP :: Attribute. Методи використовуються для завдання, пошуку, читання і видалення атрибутів класів.

методи для заморозки

Це можливість додати певний код, який, при виклику методу класу буде виконуватися до виконання (before модифікатор), після виконання (модифікатор after) і під час виконання основного коду (around модифікатор).

Приклад використання Class :: MOP :: Class

Розширення функціональності існуючого класу

Існуючий клас, модуль Meta.pm:

До того моменту, концепція метаклассом вже стала цілком зрозумілою.

Attribute protocol

Атрібутний протокол - це винахід Class :: MOP. Perl 5 не підтримує атрибути. Тим важливіше розібратися, що це таке.

Атрибут класу або об'єкта - це змінна, пов'язана з класом або об'єктом. Доступ до атрибутів здійснюється по їх імені. Цим атрибути відрізняються від даних, які містить об'єкт, і доступ до яких здійснюється тільки через методи об'єкта.
У програміста perl закономірно виникає питання - нафіга це потрібно? Відповідь: не всі користуються таким класним мовою, як perl.

У деяких об'єктно-орієнтованих мовах програмування (наприклад, в Java) не існує глобальних змінних. В цьому випадку, атрибути класів є єдиним способом зберігання і використання глобальних даних.

Робота з атрибутами в Class :: MOP :: Class. на мій погляд, потворна і не зручна. Ось приклад.

Файл модуля Meta4.pm:

Схожі статті