Я должен изучить Perl 5 OO или Американского лося сначала? [закрытый]

Я думаю, что ваш третий выбор лучше. Я делал аналогичные вещи со службами Windows в .Net 3.5 и обнаружил, что создание собственных потоков - хороший способ, особенно с потоками, которые взаимодействуют с веб-службами.

Я создаю рабочий экземпляр и отправляю ему обратный вызов, который сигнализирует службе, когда она завершена. Я храню готовые к запуску потоки в Queue и очищаю их в соответствии с максимальным числом одновременных потоков, которое я хочу. Если все, что вас волнует, это количество запущенных сервисов, вы можете отслеживать их с помощью простого счетчика. Я предпочитаю хранить каждый работающий рабочий экземпляр в ключе Dictionary, указанном потоком ManagedThreadId, чтобы я мог легко сигнализировать о каждом экземпляре, если хочу аккуратно его выключить. Также удобно опрашивать запущенные экземпляры для проверки статуса.

41
задан MPelletier 30 June 2011 в 20:16
поделиться

10 ответов

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

Наконец, нет причин использовать Mouse (альтернативу Moose), если вы не попадаете в две очень конкретные категории: у вас жесткие ограничения по времени запуска или жесткие требования к зависимости.

37
ответ дан 27 November 2019 в 00:06
поделиться

IMHO Я бы сначала выучил Moose. Зачем? Да, большая часть Perl OO не работает с Moose. Да, Moose работает медленно (хотя попробуйте Mouse ). Да, есть много практических причин, по которым вам в конечном итоге придется научиться делать это на горьком опыте. Но есть одна важная причина.

Потому что способ объектно-ориентированного программирования Perl искажает ваш мозг.

Дело в том, чтобы изучить хороший объектно-ориентированный объект, а не объектно-ориентированный объект Perl. Как только вы поймете концепцию объектно-ориентированного программирования, вы сможете применить эту технику к любому конкретному языку. Обратное не так.

Стандартный OO Perl не соответствует ' не даю вам вообще много. Вы должны сами собрать все свои части. Вы должны изучить все мелкие детали того, как все работает. Он учит вас сломанным концепциям вроде «объекты - это просто магические ссылки на хеш» и «методы - это просто подпрограммы с $ self в качестве первого аргумента» и «классы - это просто пакеты». Короче говоря, Perl OO учит вас обращать внимание на то, как все работает, что является ТОЧНОЙ ПРОТИВОПОЛОСТЬЮ того, как предполагается, что OO должно работать.

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

Более того, единственный способ составления объектов, который Perl дает вам из коробки, - это наследование. Наследование - это то, что каждый изучает в первую очередь при изучении объектно-ориентированного подхода, его опасностей и искажений разума. OO ориентирован на ОБЪЕКТ, а не на наследование. Важным является инкапсуляция объекта, а не возможность совместного использования кода. Программист-новичок с наследственностью - все равно что дать пистолет ребенку. Множественное наследование - все равно что дать им гаубицу. Новички немедленно переходят к наследованию и создают большие запутанные иерархии. Они никогда не узнают ни о делегировании, ни о композиции, ни о ролях, ни о миксинах, ни о каких-либо из полдюжины гораздо лучших способов позволить объектам совместно использовать и создавать поведения.

Moose дает вам все это,

28
ответ дан 27 November 2019 в 00:06
поделиться

Moose - это хорошо, но решение об обучении зависит от ваших целей.

Если вы просто хотите писать свои собственные программы с использованием объектно-ориентированных технологий, то это вполне может стоить погружение в Moose (и беспокойство о других методах объектно-ориентированного программирования позже)

Если вы хотите стать «программистом на Perl», тогда вы столкнетесь с более OO-кодом, отличным от Moose, а не с OO-кодом Moose, так что вам следует научиться кодировать без лося в первую очередь. Я предлагаю объектно-ориентированный Perl Дэмиана Конвея в качестве хорошей отправной точки.

18
ответ дан 27 November 2019 в 00:06
поделиться

Большая часть мира Perl - это не Moose, поэтому вам все равно понадобятся основы для использования всех других модулей.

32
ответ дан 27 November 2019 в 00:06
поделиться

Честно говоря, я не уверен, насколько ценно знание исходных объектно-ориентированных примитивов 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.)

Это может быть не важно сразу, но может быть приятно иметь. Откройте Devel :: REPL, введите 'do "test.pl"', чтобы загрузить класс Point, а затем произнесите что-то вроде:

map { $_->name } Point->meta->get_all_attributes;

Результат: ['x', 'y'] . Не имея исходного кода, вы можете узнать, какие атрибуты имеет класс. Попробуйте сделать это с помощью "простого" Perl OO. (Именно такие вещи делают возможным богатое пространство имен MooseX ::. Возможно, вам не понадобится интроспекция, но вы получите удовольствие от возможности использовать надежные модули из CPAN.)

Это может быть не важно сразу, но может быть приятно иметь. Откройте Devel :: REPL, введите 'do "test.pl"', чтобы загрузить класс Point, а затем произнесите что-то вроде:

map { $_->name } Point->meta->get_all_attributes;

Результат: ['x', 'y'] . Не имея исходного кода, вы можете узнать, какие атрибуты имеет класс. Попробуйте сделать это с помощью "простого" Perl OO. (Именно такие вещи делают возможным богатое пространство имен MooseX ::. Возможно, вам не понадобится интроспекция, но вы получите удовольствие от возможности использовать надежные модули из CPAN.)

вы можете узнать, какие атрибуты есть у класса. Попробуйте сделать это с помощью "простого" Perl OO. (Именно такие вещи делают возможным богатое пространство имен MooseX ::. Возможно, вам не понадобится интроспекция, но вы получите удовольствие от возможности использовать надежные модули из CPAN.)

вы можете узнать, какие атрибуты есть у класса. Попробуйте сделать это с помощью "простого" Perl OO. (Именно такие вещи делают возможным богатое пространство имен MooseX ::. Возможно, вам не понадобится интроспекция, но вы получите удовольствие от возможности использовать надежные модули из CPAN.)

21
ответ дан 27 November 2019 в 00:06
поделиться

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

Я также использовал Object :: InsideOut, который очень похож на Moose и также помогает защитить переменные вашего объекта от несанкционированного доступа.

Еще одно замечание: я понимаю, что объекты Perl 6 будут во многом похожи на объекты Moose ... поэтому изучение Moose подготовит вас к работе с Perl 6.

5
ответ дан 27 November 2019 в 00:06
поделиться

Сначала ознакомьтесь с основами. Если вы не сделали много объектно-ориентированного JavaScript, объектно-ориентированный Perl будет казаться немного странным, а некоторые вещи, которые делает Moose или любая другая библиотека, могут показаться странными.

10
ответ дан 27 November 2019 в 00:06
поделиться

Это должен был быть комментарий к сообщению Шверна, но он вырос.

Я бы сказал, что moose медленнее, чем "нормальный" Perl OO, но, во-первых, это не так уж важно для большая часть кода (преждевременная оптимизация) и, во-вторых, если вы выполняете __ PACKAGE __-> make_immutable , тогда все равно удаляется много накладных расходов времени выполнения.

Я с бандой "сначала изучи лося". Мне нравится сознательно игнорировать детали Perl OO для кода, который я пишу (управление данными и простые приложения), и поэтому я предпочитаю использовать Moose для всего, даже для вещей, которые я делал бы процедурно в прошлом, потому что он делает много механики программирования намного проще

4
ответ дан 27 November 2019 в 00:06
поделиться

Moose полезен, но вы все равно можете захотеть узнать о perl OO, чтобы защитить себя от проблемы с утечкой абстракции .

Perl OO сам по себе довольно сложен, но эта книга позволяет легко усвоить: Промежуточный Perl . Настоятельно рекомендуется.

2
ответ дан 27 November 2019 в 00:06
поделиться

Выше много полезных ответов. Единственное, что я могу добавить, это то, что руководство Moose теперь доступно для покупки в виде книги или PDF. Если вы учитесь или просто используете Moose, это полезное справочное руководство, и оно напечатано красивой типографикой.

Раскрытие: мы создали книгу (Мистер Обезьяна), хотя мы не писали это (это был Дэйв Рольски и Стеван Литтл).

2
ответ дан 27 November 2019 в 00:06
поделиться
Другие вопросы по тегам:

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