Moose - это расширение объектной системы языка программирования Perl . Его заявленная цель [1] - привнести в Perl 5 возможности современного объектно-ориентированного языка и сделать объектно-ориентированное программирование на Perl более последовательным и менее утомительным.
Функции
Moose построен на основе Class :: MOP, протокола метаобъектов (он же MOP). Используя MOP, Moose обеспечивает полный самоанализ для всех классов, использующих Moose.
Классы
Moose позволяет программисту создавать классы :
- У класса есть ноль или более атрибутов .
- У класса есть ноль или более методов .
- Класс имеет ноль или более суперклассов (также называемых родительскими классами). Класс наследуется от своего суперкласса (ов). Moose поддерживает множественное наследование .
- У класса есть ноль или более модификаторов метода. Эти модификаторы могут применяться к его собственным методам, методам, унаследованным от его предков, или методам, предоставляемым ролями.
- Класс выполняет ноль или более ролей (также называемых чертами в других языках программирования).
- У класса есть конструктор и деструктор .
- У класса есть метакласс .
Атрибуты
Атрибут - это свойство класса, который его определяет.
- Атрибут всегда имеет имя и может иметь ряд других определяющих характеристик.
- Характеристики атрибута могут включать флаг чтения / записи, тип, имена методов доступа , делегирование , значение по умолчанию и отложенную инициализацию .
Роли
Роли в Moose основаны на чертах характера . Они выполняют ту же задачу, что и миксины , но составлены по горизонтали, а не унаследованы. Они также чем-то похожи на интерфейсы , но в отличие от интерфейсов могут обеспечивать реализацию по умолчанию. Роли могут применяться как к отдельным экземплярам, так и к классам.
- Роль имеет ноль или более атрибутов.
- У роли нет или более методов.
- У роли нет модификаторов метода или больше.
- У роли есть ноль или более обязательных методов.
Расширения
На CPAN есть несколько модулей расширения Moose . По состоянию на сентябрь 2012 г.[Обновить]в пространстве имен MooseX имеется 855 модулей в 266 дистрибутивах. [2] Большинство из них можно дополнительно установить с модулем Task :: Moose. [3]
Примеры
Это пример класса Point
и его подкласса Point3D
:
пакет Point ;использовать Moose ;использовать карпа ;имеет 'x' => ( isa => 'Num' , is => 'rw' );имеет 'y' => ( isa => 'Num' , is => 'rw' );sub clear { мой $ self = shift ; $ self- > х ( 0 ); $ self- > y ( 0 );}к югу set_to { @_ == 3 или карканье "Bad число аргументов" ; мой $ self = shift ; мой ( $ x , $ y ) = @_ ; $ self- > х ( $ х ); $ self- > y ( $ y );}пакет Point3D ;использовать Moose ;использовать карпа ;расширяет Point ;имеет 'z' => ( isa => 'Num' , is => 'rw' );после 'clear' => sub { my $ self = shift ; $ self- > z ( 0 );};к югу set_to { @_ == 4 или карканье "Bad число аргументов" ; мой $ self = shift ; мой ( $ x , $ y , $ z ) = @_ ; $ self- > х ( $ х ); $ self- > y ( $ y ); $ self- > z ( $ z );}
В классе есть новый set_to()
метод, Point3D
поэтому метод с тем же именем, определенный в Point
классе, не вызывается в случае Point3D
экземпляров. С clear()
другой стороны, метод не заменяется, а расширяется в подклассе, поэтому оба метода выполняются в правильном порядке.
То же самое и с MooseX::Declare
расширением:
используйте MooseX :: Declare ;class Point { имеет 'x' => ( isa => 'Num' , is => 'rw' ); имеет 'y' => ( isa => 'Num' , is => 'rw' ); метод clear { $ self- > x ( 0 ); $ self- > y ( 0 ); } метод set_to ( Num $ x , Num $ y ) { $ self- > x ( $ x ); $ self- > y ( $ y ); }}class Point3D extends Point { has 'z' => ( isa => 'Num' , is => 'rw' ); после очистки { $ self- > z ( 0 ); } метод set_to ( Num $ x , Num $ y , Num $ z ) { $ self- > x ( $ x ); $ self- > y ( $ y ); $ self- > z ( $ z ); }}
Смотрите также
- Система объектов Raku - вдохновение для Moose
- Joose , фреймворк JavaScript, вдохновленный Moose
- Catalyst , фреймворк для веб-приложений с использованием Moose
Рекомендации
- ^ "Moose - постмодернистская объектная система для Perl" . Проверено 6 марта 2017 .
- ^ Расширения Moose на CPAN
- ^ Задача :: Лось