Это глупая функция? - PullRequest
4 голосов
/ 07 июня 2010

Сегодня я натолкнулся на функцию, которая заставила меня остановиться и подумать. Я не могу придумать вескую причину сделать это:

sub replace_string {
        my $string  = shift;
        my $regex   = shift;
        my $replace = shift;

        $string =~ s/$regex/$replace/gi;

        return $string;
}

Единственное возможное значение, которое я вижу в этом, - это то, что он дает вам возможность контролировать параметры по умолчанию, используемые с подстановкой, но я не считаю это полезным. Моя первая реакция при вызове этой функции - «что это делает?». Как только я узнаю, что он делает, я собираюсь предположить, что он делает это с этого момента. Что означает, что если он изменится, он сломает любой мой код, который нуждается в этом для этого. Это означает, что функция, вероятно, никогда не изменится, или изменение ее приведет к поломке большого количества кода.

Прямо сейчас я хочу отследить оригинального программиста и дать ему понять. Это действительное желание, или я упускаю какое-то значение, которое эта функция вносит в таблицу?

Ответы [ 5 ]

11 голосов
/ 08 июня 2010

Проблемы с этой функцией:

  • Непрозрачный : replace_string не говорит вам, что вы выполняете глобальную замену без учета регистра без экранирования.
  • Неидиоматический : $string =~ s{$this}{$that}gi - это то, что вы можете узнать, что это значит один раз, и это не похоже на странную угловую функцию. replace_string каждый должен узнать подробности, и это будет отличаться для всех, кто пишет.
  • Негибкий : Хотите неглобальный поиск и замена? Сожалею. Вы можете вставить некоторые модификаторы, передав qr//, но это гораздо более продвинутые знания, чем s///, скрывающий его.
  • Небезопасно : пользователь может подумать, что функция принимает строку, а не регулярное выражение. Если они вводят непроверенный пользовательский ввод, они открывают потенциальную дыру в безопасности.
  • Медленнее : Просто чтобы добавить окончательное оскорбление.

Преимущества:

  • Грамотный : имя функции объясняет, что она делает, без необходимости изучать детали регулярного выражения (но дает неполное объяснение).
  • Значения по умолчанию : Значения по умолчанию g и i всегда есть (но это не очевидно из названия).
  • Простой синтаксис : не нужно беспокоиться о разделителях (не то, что s{}{} сложно).
  • Защита от глобальных побочных эффектов : совпадения с регулярным выражением задают набор глобальных переменных ($1, $+ и т. Д.), Но они автоматически локально ограничиваются функцией. Они не будут мешать, если вы используете их для другого регулярного выражения.

Немного переусердствовал с инкапсуляцией.

5 голосов
/ 07 июня 2010
print replace_string("some/path", "/", ":");

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

5 голосов
/ 07 июня 2010

Если это просто многословная замена для s///, то я бы предположил, что она была написана кем-то, кто пришел на Perl с языка, где использование регулярных выражений требовало дополнительного синтаксиса и кто / был более удобен при кодировании таким образом.Если бы это было так, я бы отнес это к детской болтовне Perl: глупо и неуклюже для опытных программистов, но неплохо - не настолько плохо, чтобы оправдать избиение.;)

Если я прищуриваюсь очень сильно, я почти вижу случаи, когда такая функция может оказаться полезной: применение набора шаблонов для набора строк, предоставление пользователю ввода терминов, предоставление ссылки CODE дляОбратный вызов ...

4 голосов
/ 07 июня 2010

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

1 голос
/ 07 июня 2010

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

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