Обучение программированию лучших практик для разработчиков Perl - PullRequest
3 голосов
/ 01 декабря 2011

Я проводил тренинг по практикам программирования и написанию кода качества для участников, которые когда-то работали над Java.Объектно-ориентированный анализ и проектирование - это основа, и я рассматриваю принципы SOLID и выдержки из таких книг, как «Чистый код», «Выполнение кода 2» и т. Д.

Я планирую провести обучение для программистов Perl (менее чем за 1 год.опыта в Perl) через два дня, и они не используют Moose (расширение объектной системы Perl 5, которая предоставляет возможности современного объектно-ориентированного языка).

Теперь я не понимаю, как структурировать мойобучение, поскольку они не следуют за ООП.

Любые предложения?

С уважением, Шардул.

Ответы [ 5 ]

12 голосов
/ 01 декабря 2011

Даже без Moose объектно-ориентированное программирование на Perl вполне возможно и очень распространено. Многие CPAN-модули предлагают свои функциональные возможности через объектно-ориентированный API, даже если многие из этих также предлагают не - объектно-ориентированный API. (Хорошим примером такой двойственности является IO :: Compress :: Zip .) Очевидно, что нормы объектно-ориентированного проектирования в Perl несколько отличаются от норм в некоторых языках & mdash; инкапсуляция не обеспечивается языком, например & mdash; но общие принципы и практики одинаковы.

И даже без какого-либо объектно-ориентированного программирования, Moosish или иного, есть о чем поговорить с точки зрения разметки пакетов, организации кода в функции / подпрограммы / модули, структурирования данных, использования use warnings (или -w) и use strict и -T и модули CPAN и т. Д.

Я бы также порекомендовал книгу Марка Джейсона Доминуса Perl высшего порядка , которую он сделал доступной для бесплатного скачивания. Я не знаю, в какой степени вы можете пройти всю книгу за день и собрать что-то полезное вовремя для вашей презентации & mdash; функциональное программирование - это что-то вроде смены парадигмы для тех, кто к этому не привык (будь то вы или программисты, которым вы представляете!) & mdash; но вы можете найти там несколько полезных вещей, которые вы можете использовать.

5 голосов
/ 01 декабря 2011

Множество ответов здесь - это ответы об обучении ООП программистам Perl, которые его не используют, но ваш вопрос звучит так, как будто вы зашли в тупик из-за того, как преподавать курс по качеству кода, в свете того факта, что ваш Программисты Perl не используют ООП, в особенности то, что вы хотите научить ООП не-ОО программистам и принуждать их к этой парадигме.

Это оставляет нам две другие парадигмы программирования, которые Perl поддерживает достаточно хорошо:

  1. Старомодный Структурированный Программирование также Модульный Программирование
  2. Поддержка функционального программирования в Perl (также Perl высшего порядка )

Я использую оба из них - в сочетании с здоровой дозой объектов, а также. Итак, я использую объекты по той же причине, что и хорошую структуру, а также модули и функциональные конвейеры. Использование инструмента, который вносит порядок и здравомыслие в процесс программирования. Например, объектно-ориентированное программирование является основной формой полиморфизма, но ООП - это , а не сам полиморфизм. Таким образом, если вы пишете идиомы, которые помогают в полиморфизме, они помогают в полиморфизме, им не нужно зацикливаться на каком-то специальном библиотечном «классе» и называть его UtilClass->meta_operator( $object ), который имеет маленький сам полиморфизм. ,

Moose - это отличный объектный язык, но вы не вызываете Moose->has( attribute => is => 'rw', isa => 'object' ). Вы звоните оператору has. power из Moose заключается в библиотеке объектов , которые инкапсулируют мета-операции над классами, но также и в простых выразительных операторах, которые допускает довольно открытый синтаксис Perl. Я бы назвал это оценкой решения проблем, которые ООП решает с объектами.

Кроме того, я думаю, у меня есть проблема с вашей проблемой, потому что "не ООП" - это большое поле. Он может варьироваться от кодирования «все в главном» до не строго -OOP (где процесс программирования - это не просто анализ ООП). Поэтому я думаю, что вы должны знать свою аудиторию и знать, что они используют, чтобы сохранить этот код структурированным и разумным. Я не могу представить себе современную аудиторию Perl, которая по крайней мере не является объектом - пользователей .

Оттуда Perl Best Practices (часто сокращенно PBP) может помочь вам. Но так же, узнав, что

  • просто потому, что ООП является одной из лучших опор для полиморфизма, но не является полиморфизмом сам по себе
  • просто потому, что ООП - одна из лучших опор для инкапсуляции, она сама по себе не является инкапсуляцией.
  • Что ООП помогло структурированное и модульное программирование - и это не само по себе. Часть его силы - просто просто этих дисциплин.

Кроме того, как бы я ни был автором и потребителем объекта, ООП - не , как я думаю. Возможность повторного использования - вот способ, которым я думаю: что я сделал раньше, что я не хочу писать снова? Что я написал, что похоже? Как я могу сделать свою текущую задачу просто адаптером из того, что было написано ранее. (И часто: как я могу прокрутить ветку своего поведения установленным модулем в одну строку?)

В результате ряд моих конструкций провалится пешеходная цель ООП.Чтобы вам было удобнее: я делю код на два «домена»: очень абстрактный и полиморфный код Library и Scripting , которые мне нужно сделать, чтобы получить конкретный функция, которая мне нужна в текущем проекте.(это по сути то, что означает «приложение», но я не думаю, что это было бы так ясно).В результате полиморфизм в основном способствует обеспечению адаптивности , но сама адаптация - это то, что занимает меньше всего строк кода.Моя оптимальная система - это библиотека, которая позволяет создавать сценарии / адаптировать в любой момент между поведением библиотеки и набором конфигураций или сценариев, которые решают конкретную проблему.Опять же, если бы у меня были мои детекторы, конфигурация была бы введена из скриптового домена, и ни один библиотечный код сам по себе не сказал бы «Мне нужен файл свойств», если только это не был библиотечный модуль, инкапсулирующий алгоритм конфигурации, созданный в файлах свойств.Он просто знал бы, что ему нужны «политики» (или решения из области приложения), чтобы выполнить свою функцию.

Таким образом, мое идеальное приложение содержит «объекты» специального назначения, которые соответствуют «ролям», но где классы бесполезны, за исключением того, что классы выполняют поведение, допускающее инъекцию данных иповедение.Таким образом, некоторые из моих «объектов» Perl нарушают анализ ООП, потому что они представляют собой просто инкапсуляцию одноразовых решений, наподобие push-pin (expando) объектов JavaScript.

Я часто (позже) пересматриваю объект специального назначения и толкаю его дальше в область библиотеки, когда обнаруживаю, что мне нужно снова написать что-то подобное.Все объекты в домене библиотеки находятся на некотором уровне спектра указанного поведения.Кроме того, я организую «сети передачи данных», где есть класс Sourced, который просто инкапсулирует поведение доступа к данным либо в самом объекте, либо в другом исходном объекте.Это помогает ускорить мои решения безмерно , но я никогда не видел его адресованным ни в одном учебнике по ООП "утка-кошка-собака-машина-грузовик".Также шаблонирование - особенно в сочетании с «сетями передачи данных» - чрезвычайно полезно в решениях по кодированию в полдюжины строк или полдня работы.

Так что я думаю, что 'Говоря, в той степени, в которой вы знаете только ООП для структурирования программирования, вы не сможете оценить, что некоторые старые, здоровые практики или другие парадигмы делают для вас - или как вещи, которые квалифицируются какООП может способствовать посредственной адаптивности.(Кроме того, компоненты намного более актуальны, чем «объекты».) Инкапсуляция решает многие проблемы, но также способствует отсутствию данных там, где они вам нужны.Идея состоит в том, чтобы получить данные там, где они вам нужны, чтобы ваше постоянное поведение могло осознать специфику проблемы и воздействовать на нее.

  • Перечитайте кое-что о структурном программировании
  • Прочитайте кое-что о функциональном программировании (при условии, что вы еще не знакомы с ним.)

Такжевозможно, что даже устоявшаяся, «продуктивная» команда Perl пишет ... хрень .Если они не ООП-программисты, потому что они просто пишут дерьмовый код, то непременно научите их ООП, и если им не хватает даже структурированного программирования *, то пихают их обоих в горло * (мне трудно подуматьярлык "профессиональный", здесь).

4 голосов
/ 01 декабря 2011

Возможно, вы захотите взглянуть и на то, что описано в книге «Современный Perl»:

http://onyxneon.com/books/modern_perl/

Как говорят другие - много, чтобы покрыть без Moose.

  • Настройка модулей / дистрибутивов
  • Тестирование и TAP
  • Развертывание с помощью cpanm / cpan / local :: lib
  • Важные изменения 5.8 5.10 против 5.12 против 5.14,автодие и т. д.
4 голосов
/ 01 декабря 2011

Внимательно посмотрите на 'Perl Best Practices' Дамиана Конвея. В нем много твердого материала, и вы не ошибетесь, если прислушаетесь к его совету.

Имейте в виду, однако, что Getopt::Clade доступен только как пакет-заполнитель - другими словами, это vapourware.

0 голосов
/ 01 декабря 2011

Программисты Perl должны знать о слабо функциональных функциях Perl, таких как контексты списков, карта, grep и т. Д. Небольшой функциональный стиль делает Perl бесконечно более читабельным.

Программисты Perl также должны понимать традиционные возможности Perl для OO, особенномодули, благослови и завяжи.Заставьте их написать объект или, возможно, связать объект Cache :: Memcached вокруг запроса или чего-то подобного.

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