Черты Perl Moose Hash - PullRequest
       12

Черты Perl Moose Hash

0 голосов
/ 16 февраля 2012

У меня есть объект параметра в Moose, который имеет атрибуты файловых подстановочных знаков для glob

Так что у меня был метод, чтобы сделать это

sub getInputFileParams{
    my ($self) = @_;

    #the only parameters passed in are in fact the input files
    return keys(%{$self->{extraParams}});
}

, но потом я решил почему бы не повторить атрибутыв качестве хеша?

has 'extraParams' => (
    is        => 'ro',
    isa       => 'JobParameters::Base',
    default   => sub { {} },
    traits    => ['Hash'],
    handles   => {
       keys_extraParams => 'keys',
    },

);

Однако, это дросселирует, поскольку это не ссылка на хеш.я что-то пропустил или использую объект как хэш плохо

Ответы [ 2 ]

4 голосов
/ 16 февраля 2012

Да, использование объектов в качестве простых хешей - это плохо.

Вы получаете доступ к их внутреннему состоянию напрямую, что обходит любой интерфейс, который они могут представить, и делает ваш класс тесно связанным с внутренним представлением JobParameters:: Базовый класс.

Если вам необходимо получить содержимое объекта JobParameters :: Base в виде хэша, добавьте метод to_hash в JobParameters :: Base и делегируйте этому методу в своем атрибуте...

Это означает, что если позже вы добавите кеширование (например!) В JobParameters :: Base и используете ключ __cache для хранения внутренних данных, вы можете безопасно внести это изменение, также изменив метод to_hashудалить внутренние данные из хэша, который он возвращает.

Можно хранить атрибут как просто хеш, но если вы храните благословенный хеш, то не доходите до его мужества ...

0 голосов
/ 16 февраля 2012

У вас есть все инструменты в вашем определении класса Moose, вы просто не используете их - попробуйте это:

return $self->keys_extraParams

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...