Подтвердить что ты не робот

Должен ли я сначала изучить Perl 5 OO или Moose?

Я все еще относительно новичок в программировании на Perl, но я знаю, как работает Perl 5 OO. Тем не менее, я никогда не создавал ни одного проекта с Perl 5 OO, поэтому я уверен, что столкнусь с множеством ошибок.

Недавно я обнаружил рекламу модуля Moose. Я проверил некоторую документацию по CPAN, и я нашел ее довольно интересной и помог мне в качестве разработчика. Кроме того, он кажется очень стабильным и надежным.

Должен ли я более интенсивно работать с основным синтаксисом Perl 5 OO, пока не почувствую, что он очень хорошо знаком с ним (чтобы узнать, что происходит за этапами), или, по-вашему, мне лучше идти вперед и напрямую начинать разработку приложений с помощью Moose? Или мне даже нужно попробовать Mouse?

Любые мысли и переживания по этому поводу ценятся.

Спасибо заранее!

4b9b3361

Ответ 1

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

Наконец, нет оснований использовать мышь (альтернативу лосям), если вы не попадете в две очень конкретные категории, у вас есть трудные временные ограничения или жесткие требования к зависимости. Если вы не попадете в эти два места, Муз почти всегда будет лучшим ответом.

Раскрытие информации: Я являюсь разработчиком Moose Moose и работал с Mouse и с ним.

Ответ 2

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

Ответ 3

ИМХО Я бы сначала узнал Лося. Зачем? Да, большинство Perl OO не делают Moose. Да, Moose медленный (хотя попробуйте Mouse). Да, есть много практических причин, по которым вам придется в конце концов научиться делать это с трудом. Но есть одна главная причина.

Потому что способ Perl делать OO разбивает ваш мозг.

Цель состоит в том, чтобы узнать хорошее OO, а не Perl OO. Когда вы понимаете программирование OO как концепцию, вы можете применить технику к любому конкретному языку. Обратное не так верно.

Запасы Perl OO не дают вам вообще ничего. Вы должны сами собрать все свои части. Вы должны изучить все мелкие детали того, как все работает. Он учит вас сломанным понятиям, как "объекты - это просто магические хеш-ссылки", а "методы - это просто подпрограммы с $self как первый аргумент" и "классы - это просто пакеты". Короче говоря, Perl OO учит вас обращать внимание на то, как все работает, что является ТОЧНЫМ OPPOSITE того, как OO должно работать.

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

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

Moose дает вам все это из коробки, поэтому вы можете сосредоточиться на записи объектов, а не на записи OO-системы.

Как только вы научились делать OO прямо, вы можете узнать Perl OO и как сделать это двадцать других способов, двенадцать из них ошибочны.

Ответ 4

Честно говоря, я не уверен, как ценное знание первичных примитивов Perl raw для написания нового кода больше. Я не использовал @ISA или "использовать базу" или "благословить" в своем коде очень долгое время; любой OO я делаю через Moose MOP. (Разумеется, у меня есть нерешенные экземпляры, но я использую $meta- > rebless_instance вместо того, чтобы просто "благословить". Гораздо чище!)

В любом случае, я сначала научу себя Мусу. Легко начать работать и сразу же получить продуктивность, и вы можете подобрать детали, когда будете лучше разбираться в 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. Вы можете легко беспокоиться о деталях своей программы, а не о том, как делать OO в Perl. Вам даже не нужно делать файл "Point.pm", вы можете иметь определение класса inline.

Я также думаю, что этот код будет сразу понятен почти любому программисту - даже тем, кто не знаком с деталями Perl или Moose (или MooseX:: Declare).

(Кстати, этот пример немного странно выглядел с синтаксисом ":" в сигнатурах метода. Обычно вы получаете экземпляр себя, называемый $self, как первый аргумент. Если вы поставляете что-то еще перед a: в подписи, вы можете изменить тип и имя переменной. Я также написал "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.)

Ответ 5

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

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

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

Ответ 6

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

Ответ 7

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

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

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

Ответ 8

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

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

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

Ответ 9

Изучите ООП, который поставляется с Perl перед Moose. Это значительно облегчит вам работу в долгосрочной перспективе.

Ответ 10

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

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

Ответ 11

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

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