Я думаю, что ваш третий выбор лучше. Я делал аналогичные вещи со службами Windows в .Net 3.5 и обнаружил, что создание собственных потоков - хороший способ, особенно с потоками, которые взаимодействуют с веб-службами.
Я создаю рабочий экземпляр и отправляю ему обратный вызов, который сигнализирует службе, когда она завершена. Я храню готовые к запуску потоки в Queue
и очищаю их в соответствии с максимальным числом одновременных потоков, которое я хочу. Если все, что вас волнует, это количество запущенных сервисов, вы можете отслеживать их с помощью простого счетчика. Я предпочитаю хранить каждый работающий рабочий экземпляр в ключе Dictionary
, указанном потоком ManagedThreadId
, чтобы я мог легко сигнализировать о каждом экземпляре, если хочу аккуратно его выключить. Также удобно опрашивать запущенные экземпляры для проверки статуса.
Как уже отмечали все остальные, изучение основ того, как делается объектно-ориентированный объект на Perl, поможет вам не только с большинством пакетов, не относящихся к лосю, но и с самим Moose, поскольку в глубине души Moose в основном просто использует стандартную разметку Perl OO. В основном, когда вы освоитесь, вы поймете, что показывает Moose :: Manual :: Unsweetend , вы получите разумное понимание принципов объектно-ориентированного программирования в Perl. Книга Дэмиана Конвея по объектно-ориентированному Perl является отличным введением в период объектной ориентации, а не только с точки зрения Perl. Я настоятельно рекомендую прочитать его или хотя бы первую половину.
Наконец, нет причин использовать Mouse (альтернативу Moose), если вы не попадаете в две очень конкретные категории: у вас жесткие ограничения по времени запуска или жесткие требования к зависимости.
IMHO Я бы сначала выучил Moose. Зачем? Да, большая часть Perl OO не работает с Moose. Да, Moose работает медленно (хотя попробуйте Mouse ). Да, есть много практических причин, по которым вам в конечном итоге придется научиться делать это на горьком опыте. Но есть одна важная причина.
Потому что способ объектно-ориентированного программирования Perl искажает ваш мозг.
Дело в том, чтобы изучить хороший объектно-ориентированный объект, а не объектно-ориентированный объект Perl. Как только вы поймете концепцию объектно-ориентированного программирования, вы сможете применить эту технику к любому конкретному языку. Обратное не так.
Стандартный OO Perl не соответствует ' не даю вам вообще много. Вы должны сами собрать все свои части. Вы должны изучить все мелкие детали того, как все работает. Он учит вас сломанным концепциям вроде «объекты - это просто магические ссылки на хеш» и «методы - это просто подпрограммы с $ self в качестве первого аргумента» и «классы - это просто пакеты». Короче говоря, Perl OO учит вас обращать внимание на то, как все работает, что является ТОЧНОЙ ПРОТИВОПОЛОСТЬЮ того, как предполагается, что OO должно работать.
OO - это НЕ заботиться о деталях того, как все работает. Вся суть объекта в том, что вы просите его выполнить работу, и вам все равно, как он это делает. Хороший объект - это как хороший дворник. Вы просите уборщика помыть пол, а затем уходите. Когда вернешься, пол будет убран. Неважно, использовал ли дворник швабру, зубную щетку, их язычком или весь пол разорвали и установили новый. Пол чистый, и это все, что имеет значение.
Более того, единственный способ составления объектов, который Perl дает вам из коробки, - это наследование. Наследование - это то, что каждый изучает в первую очередь при изучении объектно-ориентированного подхода, его опасностей и искажений разума. OO ориентирован на ОБЪЕКТ, а не на наследование. Важным является инкапсуляция объекта, а не возможность совместного использования кода. Программист-новичок с наследственностью - все равно что дать пистолет ребенку. Множественное наследование - все равно что дать им гаубицу. Новички немедленно переходят к наследованию и создают большие запутанные иерархии. Они никогда не узнают ни о делегировании, ни о композиции, ни о ролях, ни о миксинах, ни о каких-либо из полдюжины гораздо лучших способов позволить объектам совместно использовать и создавать поведения.
Moose дает вам все это,
Moose - это хорошо, но решение об обучении зависит от ваших целей.
Если вы просто хотите писать свои собственные программы с использованием объектно-ориентированных технологий, то это вполне может стоить погружение в Moose (и беспокойство о других методах объектно-ориентированного программирования позже)
Если вы хотите стать «программистом на Perl», тогда вы столкнетесь с более OO-кодом, отличным от Moose, а не с OO-кодом Moose, так что вам следует научиться кодировать без лося в первую очередь. Я предлагаю объектно-ориентированный Perl Дэмиана Конвея в качестве хорошей отправной точки.
Большая часть мира Perl - это не Moose, поэтому вам все равно понадобятся основы для использования всех других модулей.
Честно говоря, я не уверен, насколько ценно знание исходных объектно-ориентированных примитивов Perl для написания нового кода. Я очень давно не использовал @ISA или «использовать базу» или «благословлять» в своем коде; любое ОО, которое я делаю, осуществляется через Moose MOP. (Конечно, я использую экземпляры без rebless, но я использую $ meta-> rebless_instance вместо просто «bless». Намного чище!)
В любом случае, я бы сначала научил себя Moose. Легко начать работу и сразу приступить к работе, и вы сможете уловить детали, когда станете более опытным в Perl и программировании в целом.
В качестве примера:
#!/usr/bin/env perl
use strict;
use warnings;
use feature ':5.10'; # for 'say'
use MooseX::Declare;
class Point {
has [qw/x y/] => ( is => 'ro', isa => 'Num', required => 1 );
method new_from_ordered_pair(ClassName $class: Num $x, Num $y){
return $class->new( x => $x, y => $y );
}
method distance(Point $a: Point $b){
return sqrt( ($a->x - $b->x)**2 + ($a->y - $b->y)**2 );
}
}
my $origin = Point->new_from_ordered_pair(0,0);
my $point = Point->new_from_ordered_pair(3,4);
say '(3,4) is '. $point->distance($origin). ' units away from the origin.';
Обратите внимание, что больше нет борьбы с подробности реализации Perl. Вы можете легко беспокоиться о деталях вашей программы, вместо того, чтобы делать объектно-ориентированный объект на Perl. Вам даже не нужно создавать файл "Point.pm", вы можете встроить определение класса.
Я также думаю, что этот код будет сразу понятен почти любому программисту - даже тем, кто не знаком с деталями Perl или Moose (или MooseX :: Declare).
(BTW) , этот пример немного странно работал с синтаксисом ":" в сигнатурах методов. Обычно вы получаете экземпляр себя с именем $ self в качестве первого аргумента. Если вы указываете что-то еще перед: в подписи, вы можете изменить тип и имя переменной. Я также написал "new_from_ordered_pair", чтобы вам не приходилось каждый раз вводить x => $ x, y => $ y
в качестве аргументов для new. просто сахар, который я считаю приятным; здесь не происходит ничего волшебного.)
Наконец, вы получаете здесь много «бесплатно». Попробуйте это и обратите внимание на полезные сообщения об ошибках:
Point->new; # x is required
Point->new_from_ordered_pair('foo', 'bar'); # x needs to be a number
$point->distance('some string'); # $b needs to be a Point
Вы получаете все это бесплатно, и это упрощает отладку вашей программы. Нет причин избегать этого, это действительно делает программирование более приятным (и делает вашу программу более надежной ... бесплатно!)
О, еще одна вещь. С Moose вы можете анализировать свои классы. Это может быть не важно сразу, но может быть приятно иметь. Откройте Devel :: REPL, введите 'do "test.pl"', чтобы загрузить класс Point, а затем произнесите что-то вроде:
map { $_->name } Point->meta->get_all_attributes;
Результат: ['x', 'y']
. Не имея исходного кода, вы можете узнать, какие атрибуты имеет класс. Попробуйте сделать это с помощью "простого" Perl OO. (Именно такие вещи делают возможным богатое пространство имен MooseX ::. Возможно, вам не понадобится интроспекция, но вы получите удовольствие от возможности использовать надежные модули из CPAN.)
О, еще одна вещь. С Moose вы можете анализировать свои классы. Это может быть не важно сразу, но может быть приятно иметь. Откройте Devel :: REPL, введите 'do "test.pl"', чтобы загрузить класс Point, а затем произнесите что-то вроде:
map { $_->name } Point->meta->get_all_attributes;
Результат: ['x', 'y']
. Не имея исходного кода, вы можете узнать, какие атрибуты имеет класс. Попробуйте сделать это с помощью "простого" Perl OO. (Именно такие вещи делают возможным богатое пространство имен MooseX ::. Возможно, вам не понадобится интроспекция, но вы получите удовольствие от возможности использовать надежные модули из CPAN.)
О, еще одна вещь. С Moose вы можете анализировать свои классы. Это может быть не важно сразу, но может быть приятно иметь. Откройте Devel :: REPL, введите 'do "test.pl"', чтобы загрузить класс Point, а затем произнесите что-то вроде:
map { $_->name } Point->meta->get_all_attributes;
Результат: ['x', 'y']
. Не имея исходного кода, вы можете узнать, какие атрибуты имеет класс. Попробуйте сделать это с помощью "простого" Perl OO. (Именно такие вещи делают возможным богатое пространство имен MooseX ::. Возможно, вам не понадобится интроспекция, но вы получите удовольствие от возможности использовать надежные модули из CPAN.)
О, еще одна вещь. С Moose вы можете анализировать свои классы. Это может быть не важно сразу, но может быть приятно иметь. Откройте Devel :: REPL, введите 'do "test.pl"', чтобы загрузить класс Point, а затем произнесите что-то вроде:
map { $_->name } Point->meta->get_all_attributes;
Результат: ['x', 'y']
. Не имея исходного кода, вы можете узнать, какие атрибуты имеет класс. Попробуйте сделать это с помощью "простого" Perl OO. (Именно такие вещи делают возможным богатое пространство имен MooseX ::. Возможно, вам не понадобится интроспекция, но вы получите удовольствие от возможности использовать надежные модули из CPAN.)
О, еще одна вещь. С Moose вы можете анализировать свои классы. Это может быть не важно сразу, но может быть приятно иметь. Откройте Devel :: REPL, введите 'do "test.pl"', чтобы загрузить класс Point, а затем произнесите что-то вроде:
map { $_->name } Point->meta->get_all_attributes;
Результат: ['x', 'y']
. Не имея исходного кода, вы можете узнать, какие атрибуты имеет класс. Попробуйте сделать это с помощью "простого" Perl OO. (Именно такие вещи делают возможным богатое пространство имен MooseX ::. Возможно, вам не понадобится интроспекция, но вы получите удовольствие от возможности использовать надежные модули из CPAN.)
О, еще одна вещь. С Moose вы можете анализировать свои классы. Это может быть не важно сразу, но может быть приятно иметь. Откройте Devel :: REPL, введите 'do "test.pl"', чтобы загрузить класс Point, а затем произнесите что-то вроде:
map { $_->name } Point->meta->get_all_attributes;
Результат: ['x', 'y']
. Не имея исходного кода, вы можете узнать, какие атрибуты имеет класс. Попробуйте сделать это с помощью "простого" Perl OO. (Именно такие вещи делают возможным богатое пространство имен MooseX ::. Возможно, вам не понадобится интроспекция, но вы получите удовольствие от возможности использовать надежные модули из CPAN.)
О, еще одна вещь. С Moose вы можете анализировать свои классы. Это может быть не важно сразу, но может быть приятно иметь. Откройте Devel :: REPL, введите 'do "test.pl"', чтобы загрузить класс Point, а затем произнесите что-то вроде:
map { $_->name } Point->meta->get_all_attributes;
Результат: ['x', 'y']
. Не имея исходного кода, вы можете узнать, какие атрибуты имеет класс. Попробуйте сделать это с помощью "простого" Perl OO. (Именно такие вещи делают возможным богатое пространство имен MooseX ::. Возможно, вам не понадобится интроспекция, но вы получите удовольствие от возможности использовать надежные модули из CPAN.)
map { $_->name } Point->meta->get_all_attributes;
Результат: ['x', 'y']
. Не имея исходного кода, вы можете узнать, какие атрибуты имеет класс. Попробуйте сделать это с помощью "простого" Perl OO. (Именно такие вещи делают возможным богатое пространство имен MooseX ::. Возможно, вам не понадобится интроспекция, но вы получите удовольствие от возможности использовать надежные модули из CPAN.)
map { $_->name } Point->meta->get_all_attributes;
Результат: ['x', 'y']
. Не имея исходного кода, вы можете узнать, какие атрибуты имеет класс. Попробуйте сделать это с помощью "простого" Perl OO. (Именно такие вещи делают возможным богатое пространство имен MooseX ::. Возможно, вам не понадобится интроспекция, но вы получите удовольствие от возможности использовать надежные модули из CPAN.)
Я начал использовать Moose, и он мне очень нравится. Я согласен с другими сообщениями, в которых говорится, что вам все еще следует научиться делать OO perl без Moose. Но это, как правило, сложно, и есть много способов сделать это. Я думаю, что если вы начинаете новый проект, то вам подойдет Moose.
Я также использовал Object :: InsideOut, который очень похож на Moose и также помогает защитить переменные вашего объекта от несанкционированного доступа.
Еще одно замечание: я понимаю, что объекты Perl 6 будут во многом похожи на объекты Moose ... поэтому изучение Moose подготовит вас к работе с Perl 6.
Сначала ознакомьтесь с основами. Если вы не сделали много объектно-ориентированного JavaScript, объектно-ориентированный Perl будет казаться немного странным, а некоторые вещи, которые делает Moose или любая другая библиотека, могут показаться странными.
Это должен был быть комментарий к сообщению Шверна, но он вырос.
Я бы сказал, что moose медленнее, чем "нормальный" Perl OO, но, во-первых, это не так уж важно для большая часть кода (преждевременная оптимизация) и, во-вторых, если вы выполняете __ PACKAGE __-> make_immutable
, тогда все равно удаляется много накладных расходов времени выполнения.
Я с бандой "сначала изучи лося". Мне нравится сознательно игнорировать детали Perl OO для кода, который я пишу (управление данными и простые приложения), и поэтому я предпочитаю использовать Moose для всего, даже для вещей, которые я делал бы процедурно в прошлом, потому что он делает много механики программирования намного проще
Moose полезен, но вы все равно можете захотеть узнать о perl OO, чтобы защитить себя от проблемы с утечкой абстракции .
Perl OO сам по себе довольно сложен, но эта книга позволяет легко усвоить: Промежуточный Perl . Настоятельно рекомендуется.
Выше много полезных ответов. Единственное, что я могу добавить, это то, что руководство Moose теперь доступно для покупки в виде книги или PDF. Если вы учитесь или просто используете Moose, это полезное справочное руководство, и оно напечатано красивой типографикой.
Раскрытие: мы создали книгу (Мистер Обезьяна), хотя мы не писали это (это был Дэйв Рольски и Стеван Литтл).