Вопрос

Сейчас я пишу Perl в течение нескольких лет, и это мой предпочтительный язык для обработки текста (многие из проблем генетики / геномики, которые я работаю, легко сводится к проблемам обработки текста). Perl как язык можно очень прощать, и можно написать очень плохое, но функционально, код в Perl. Только на днях, мой друг сказал, что звонит Perl только для записи Язык: Напишите его один раз, понять его один раз, и никогда не пытайтесь вернуться и исправить его после того, как он закончится.

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

Что делает CORL CODE TOPEDABLE? Или, может быть, лучший вопрос - это то, что делает код Perl трудно поддерживать? Давайте предположим, что я не единственный, кто будет поддерживать код, и что другие вкладчики, как и я, не являются профессиональными программистами Perl, а ученые с опытом программирования.

Это было полезно?

Решение

Что делает Perl Code Anmainainable? В значительной степени все, что делает любую другую программу ненаправленную. Предполагая, что все, кроме короткого сценария, предназначенного для выполнения четко определенной задачи, это:

  • Глобальные переменные
  • Отсутствие отделения проблем: монолитные сценарии
  • Не используя самодоступные идентификаторы (имена переменного и имена методов). Например, вы должны знать, какая цель переменной от его имени. $c плохой. $count лучше. $token_count хорошо.
    • Выписание идентификаторов вне. Размер программы больше не имеет первостепенной проблемы.
    • Подпрограмм или метод называется doWork ничего не говорит
    • Убедитесь легко найти источник символов из другого пакета. Либо используйте явную префикс пакета, либо явно импортируйте каждый символ, используемый через use MyModule qw(list of imports).
  • Perl-специфический:
    • Чрезмерное зависимость от коротких порезов и неясных встроенных переменных
    • Злоупотребление подпрограммами прототипами
    • не используя strict и не использовать warnings
  • Изобретать колесо, а не использовать установленные библиотеки
  • Не используя последовательный стиль отступа
  • Не используя горизонтальное и вертикальное белое пространство для руководства считывателя

etc etc и т. Д.

В основном, если вы думаете, что Perl -f>@+?*<.-&'_:$#/%!, И вы стремитесь писать такие вещи в подобных продуктах, а затем, да, у тебя будут проблемы.

Люди, как правило, путают программисты Perl Perl сделать для удовольствия (например, JAPHS, GOLF ETC) с помощью того, что должны выглядеть хорошие программы Perl.

Я до сих пор неясно, как они могут отделить в своих умах код написано для IOCCC. от поднесенной C.

Другие советы

Я предлагаю:

  1. Не становитесь слишком умным с Perl. Если вы начнете играть в гольф с кодом, он приведет к тому, что приведет к тому, что CREDER-CHEED. Код, который вы пишете, необходимо учитывать и очистить больше, чем он должен быть умным.
  2. Документируйте код. Если это модуль, добавьте POD, описывающее типичное использование и методы. Если это программа, добавьте POD для описания параметров командной строки и типичное использование. Если есть волосатый алгоритм, документируйте его и предоставьте ссылки (URL), если это возможно.
  3. Используйте форму /.../x формы регулярных выражений и документируйте их. Не все так хорошо понимают.
  4. Знайте, что такое связанность, и плюсы / минусы высокой / низкой муфты.
  5. Знайте, что такое сплоченность, и плюсы / минусы высокой / низкой сплоченности.
  6. Используйте модули соответствующим образом. Хорошая четко определенная, хорошо содержащаяся концепция делает отличный модуль. Повторное использование таких модулей является целью. Не используйте модули просто для уменьшения размера монолитной программы.
  7. Написать тесты подразделения для вашего кода. Хороший тестовый люкс не только позволит вам доказать, что ваш код работает сегодня, но завтра также. Это также позволит вам сделать смелые изменения в будущем, с уверенностью, что вы не нарушаете более старые приложения. Если вы разбите вещи, то, ну, ваши тесты насуты были недостаточно широкими.

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

Я не использую все Перл лучшие практики, но это то, что Дамиан написал это. Используйте ли я все предложения, все они стоит хотя бы учиться.

Что делает CORL CODE TOPEDABLE?

Как минимум:

use strict;
use warnings;

Видеть perldoc perlstyle. Для некоторых общих руководящих принципов, которые облегчат ваши программы прочтению, понимают и поддерживать.

Одним из факторов очень важно для чтения чтения, что я не видел упомянул в других ответах, является важность белого пространства, которое является как Perl-agnostic, так и в некоторых способах.

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

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

  • Пространства вокруг токенов, чтобы легче отделить их визуально.

    Это пространство вдвое важно в Perl из-за распространенности символов шума линий даже в лучшем коде Perl в стиле.

    я нахожу $myHashRef->{$keys1[$i]}{$keys3{$k}} Чтобы быть менее читаемым на 2 утра в середине чрезвычайной ситуации по производству производительности по сравнению с обнаружением:$myHashRef->{ $keys1[$i] }->{ $keys3{$k} }.

    В качестве бокового примечания, если вы обнаружите, что ваш код, делающий множество глубоко вложенных эталонных выражений, начиная с того же root, вы должны абсолютно рассмотреть вопрос о том, чтобы назначить этот корневой во временном указателе (см. Комментарий Sinan / ответ).

    Частичный, но очень важный особый случай этого, конечно, регулярные выражения. Разница была проиллюстрирована на смерть во всех основных материалах, которые я помню (PBP, Regeex O'Reilly, и т. Д.), Итак, я не буду удлить этот пост еще дальше, если кто-то не запрашивает примеры в комментариях.

  • Правильный и равномерный отступ. Д'А о. Очевидно. Тем не менее, я вижу слишком много кода 100% нечитаемой из-за дерьмового вдавления, и даже менее читаемой, когда половина кода была отступами от вкладок с помощью человека, редактор которого использовал 4 вкладки «4 символа», а другой «редактор», который использовал 8 вкладки «8». Просто установите кровавый редактор, чтобы сделать мягкие (например, космические) вкладки и не делайте других несчастных.

  • Пустые линии вокруг логически отдельных единиц кода (оба блока, так и просто наборы строк). Вы можете написать 10000 Line Java программу в 1000 строк хорошего Perl. Теперь не чувствую себя Бенедикт Арнольд, если вы добавите 100-200 пустых строк в 1000, чтобы сделать все более читаемыми.

  • Разделение Uber-Long - длинные выражения в несколько строк, тесно следующие ...

  • Правильное вертикальное выравнивание. Свидетель разницы между:

    if ($some_variable > 11 && ($some_other_bigexpression < $another_variable || $my_flag eq "Y") && $this_is_too_bloody_wide == 1 && $ace > my_func() && $another_answer == 42 && $pi == 3) {
    

    а также

    if ($some_variable > 11 && ($some_other_bigexpression < $another_variable || 
        $my_flag eq "Y") && $this_is_too_bloody_wide == 1 && $ace > my_func()
        && $another_answer == 42 && $pi == 3) {
    

    а также

    if (   $some_variable > 11
        && ($some_other_bigexpression < $another_variable || $my_flag eq "Y")
        && $this_is_too_bloody_wide == 1
        && $ace > my_func()
        && $another_answer == 42
        && $pi == 3) {
    

    Лично я предпочитаю фиксировать вертикальное выравнивание еще один шаг, выравнивая LHS и RHS (это особенно читается в случае длинных SQL-запросов, но и в самом коде Perl, как длинные условные полосы, как это, как и многие строки назначений и Hash / Array Инициализации):

    if (   $some_variable               >  11
        && ($some_other_bigexpression   <  $another_variable || $my_flag eq "Y")
        && $this_is_too_bloody_wide    ==  1
        && $ace                         >  my_func()
        && $another_answer             ==  42
        && $pi                         ==  3  ) {
    

    В качестве бокового примечания в некоторых случаях код может быть сделан еще более читаемым / поддерживаемым, не имея таких длинных выражений в первую очередь. Например, если содержимое if(){} Блок А. return, Тогда делать несколько if/unless Заявления, каждый из которых имеет блок возврата, может быть лучше.

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

Большинство людей приводят регес, когда обсуждают читаемость. Regexes - это DSL, встроенный в Perl, и вы можете либо прочитать их, либо нет. Если кто-то не может нанести время, чтобы понять что-то столь базовое и необходимое для многих языков, я не беспокоюсь о том, чтобы попытаться передать некоторые предполагаемые когнитивные разрыва ... они должны просто случиться, читать Perldocs и задавать вопросы, где это необходимо Отказ

Другие будут ссылаться на использование Perl vars, таких как @_, $! И т. Д. Это все легко отрицать ... Я не заинтересован в том, чтобы сделать Perl выглядеть как Java.

Повышение всех этих причудливых и перлизмов заключается в том, что кодовые базы, написанные на языке, часто разряжены и компактны. Я бы предпочел читать десять линий из Perl, чем сто линии Java.

Для меня намного больше для «ремонтопригодности», чем просто упростить прочее код. Написать тесты, сделать утверждения ... Делайте все остальное, что вы можете сделать, чтобы опираться на Perl и его экосистему, чтобы исправить код.

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

Я бы сказал, что модели упаковки / объектов, которые отражаются в структуре каталогов для файлов .PM. Для моей докторской кабинеты я написал довольно много Perl Code, который я повторно использую. Это было для автоматической латексной диаграммы генератора.

Я поговорю положительный вещи, чтобы сделать Perl Repainable.

Это правда, что вы обычно не должны быть слишком умными с действительно плотными заявлениями return !$@;#% и тому подобное, но хорошее количество умных с использованием операторов по обработке списка, как map а также grep и списка контекст возвращается из подобных split И подобные операторы, чтобы написать код в функциональном стиле, может внести положительный вклад в ремонтопригодность. У моего последнего работодателя у нас также были некоторые функции Manazzy Hahh-Manipulation, которые работали аналогично (hashmap а также hashgrep, Хотя, хотя и технически кормили их только в списки даже размером). Например:

# Look for all the servers, and return them in a pipe-separated string
# (because we want this for some lame reason or another)
return join '|', 
       sort
       hashmap {$a =~ /^server_/ ? $b : +()} 
       %configuration_hash;

Смотрите также Высший порядок Перл, http://hop.perl.plover.com. - Хорошее использование MetaProgramming может сделать определение задач более последовательным и читаемым, если вы можете сохранить метапрограммирование от того, как мешать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top