Что является надлежащим способом создать метод СБОРКИ в MooseX:: Объявить?

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

, Если Вы пишете библиотеку классов, разработанную для широкого потребления (как Платформа.NET, которая используется миллионами людей), который может быть проблемой. Однако, если Вы пишете, класс, используемый внутренне в небольшой кодовой базе (скажите < = 50 строк K), это - действительно не грандиозное предприятие, потому что ни на кого не оказали бы негативное влияние Ваши изменения. В этом случае это действительно просто сводится к персональному предпочтению.

5
задан Shog9 29 July 2009 в 23:48
поделиться

3 ответа

BUILD принимает аргумент, если вам не нужно просто скажите:

method BUILD($) { ... }
6
ответ дан 14 December 2019 в 01:14
поделиться

Это не удается, потому что BUILD требует сигнатуры метода с одним аргументом. По умолчанию MooseX :: Declare создает подпись, несовместимую со способом вызова BUILD . (Детали для меня неясны.) Я знаю, потому что однажды столкнулся с подобной ошибкой. Я, конечно, согласен, что сообщение об ошибке может быть более информативным; это верно для многих вещей Moose.

В общем, у меня это работает так:

use MooseX::Declare;

class Foo {
    has foo => (is => "rw", isa => "Str", default => "foo");

    method BUILD(Item $href) {
        print "I was called\n";
    }
}

Foo->new;

Надеюсь, что это поможет.

Вы можете повозиться с подписью и попробовать более конкретные типы; Я думаю, что Moose отправляет хэш-ссылку объекта, который еще не получил благословения, в качестве параметра.

5
ответ дан 14 December 2019 в 01:14
поделиться

Perl понимает подпрограмму , и поэтому выполняется запись в таблицу символов текущего пакета. & Foo :: BUILD, после Devel :: Declare и другой магии создали область видимости пакета из закрытия класса.

Moose специально ищет подпрограмму BUILD , чтобы вы могли управлять логикой конструктора. Я предполагаю (хотя я не проследил это полностью), что модули MooseX не мешают тому, что пытается сделать Moose. Так что собственный BUILD навсегда передается магии Moose для определения логики конструктора.

С другой стороны, ключевое слово method больше Devel :: Declare волшебства для создания методов в структуре метакласса.

-2
ответ дан 14 December 2019 в 01:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: