Как мне реструктурировать большой Perl-скрипт? - PullRequest
4 голосов
/ 26 августа 2010

У меня есть более или менее большой скрипт Perl ~ 1000 строк.Скрипт принимает несколько аргументов и работает прямо.Нет модулей, нет функций.Сценарий можно разделить на три части: часть инициализации, часть разбора аргументов и рабочая часть, но я не знаю, как это сделать.Все должно храниться в одном файле.Пожалуйста, кто-нибудь может дать мне инструкции / советы, как структурировать мой Perl-скрипт?

Спасибо.

Ответы [ 7 ]

8 голосов
/ 26 августа 2010

Вы спрашиваете совета по , как реорганизовать ваш скрипт, но вы, похоже, не понимаете , почему реорганизует его.Без почему , how не принесет вам много пользы.А с почему , how может выпасть совершенно естественно.

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

Если с этим что-то не так

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

Если вам нужно ее изменить

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

Если вы пытаетесь объяснить это кому-то другому или демонстрируете это

Вам будет гораздо проще передать идеи в вашем сценарии другому разработчику, если идеиразбит на дискретные методы.

Итак, есть несколько причин , почему вы можете выбрать рефакторинг.Если какой-либо из них применяется, рефакторинг соответственно; как выпадет естественным образом. Метод извлечения может быть вашим лучшим другом.

3 голосов
/ 26 августа 2010

Большинство людей обычно отвечают на что-то вроде «подпрограмма должна делать одно» и «подпрограмма должна занимать только одну страницу в вашем редакторе».Вы можете попытаться помнить об этом при рефакторинге своего кода.

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

Кроме того, почему вы не используете какие-либо модули?На ум приходит Getopt :: Long , который является основным модулем, поэтому вам не придется устанавливать его вручную.Он будет обрабатывать весь ваш анализ аргументов, и, используя его, вы, вероятно, избежите ошибок и сможете сократить код, чтобы сделать его более понятным.Используя такие стандартные модули, вы не только (надеюсь!) Уменьшаете количество ошибок в своем коде, но и облегчаете понимание другим программистам Perl.

3 голосов
/ 26 августа 2010

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

Я настоятельно рекомендую вам прочитать книгу Роберта Мартина Чистый код .Он использует Java для примеров, но идеи применимы к любому языку.Наиболее уместным здесь является: «Сделайте свои функции маленькими. Затем сделайте их меньше».

3 голосов
/ 26 августа 2010

Реорганизовали ли вы вообще?В 1000 строк я подозреваю, что можно увидеть некоторый код, который можно разбить на функции, встроенные в скрипт.

Что ж, если у вас есть три отдельных раздела, это логичный выбор.

Вы могли быпревратите каждый из них в функцию, а затем наверху создайте простой линейный элемент управления:

 my $var1, $var2, $var3;

   $var1 = init();
   $var2 = parseInput();
   $doWork();

   sub init() {
      some code here
   }

   sub parseInput() {
      some code here
   }

   sub doWork() {
      some code here
   }

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

3 голосов
/ 26 августа 2010

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

ps человек Я думаю, что я использовал слово function слишком много раз в этом ответе!

3 голосов
/ 26 августа 2010

1000 строк и без функций?почему бы и нет?это неопределенный вопрос.

0 голосов
/ 26 августа 2010

Вы можете посмотреть на search.cpan.org, возможно, какой-нибудь Perl-модуль подойдет вам.Например, есть CGI :: Application

...