Каковы лучшие практики для реализации инструмента CLI в Perl?

/*
 * If you are from transferring data from one class that doesn't
 * extend Activity, then you need to do something like this.
 */ 

public class abc {
    Context context;

    public abc(Context context) {
        this.context = context;
    }

    public void something() {
        context.startactivity(new Intent(context, anyone.class).putextra("key", value));
    }
}
35
задан brian d foy 27 July 2009 в 04:13
поделиться

7 ответов

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

Пользовательский интерфейс

  1. Параметр командной строки: разрешить как можно большему количеству пользователей значения по умолчанию.

  2. НИКАКИХ позиционных параметров для любой команды, имеющей более двух параметров.

  3. Иметь удобочитаемые имена параметров. Если длина командной строки является проблемой для неинтерактивных вызовов (например, некоторые безымянные устаревшие оболочки имеют короткие ограничения на командные строки), укажите короткие псевдонимы - GetOpt :: Long легко позволяет это.

  4. По крайней мере, print значения по умолчанию для всех опций в сообщении '-help'.

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

  5. Следуйте стандартному соглашению Unix о выходе с ненулевым кодом возврата, если программа завершилась с ошибками.

  6. Если ваша программа может производить полезный (например, стоит захватить / grepping / еще много чего) вывод, убедитесь, что все сообщения об ошибках / диагностике отправляются в STDERR, чтобы их можно было легко разделить.

  7. В идеале, разрешите пользователю указывать файлы ввода / вывода через командную строку параметр вместо принудительной переадресации "<" / ">" - это позволяет НАМНОГО упростить жизнь людям, которым нужно создавать сложные каналы с помощью вашей команды. То же самое для сообщений об ошибках - есть опция файла журнала.

  8. Если команда имеет побочный эффект, наличие опции «whatif / no_post» обычно является очень хорошей идеей.

Реализация

  1. Как отмечалось ранее, не повторно изобрести колесо. Используйте стандартные модули обработки параметров командной строки - MooseX :: Getopt или Getopt :: Long

  2. Для Getopt :: Long присвойте все параметры одному хэшу, а не отдельным переменным. Многие полезные шаблоны включают передачу этого хэша аргументов CLI конструкторам объектов.

  3. Убедитесь, что ваши сообщения об ошибках ясны и информативны ... Например, включают "$!" в любых сообщениях об ошибках, связанных с вводом-выводом. Стоит потратить дополнительную 1 минуту и ​​2 строки в вашем коде, чтобы иметь отдельные ошибки «файл не найден» и «файл не читается», CLI не допускает «внешней» проверки, как это делают веб-приложения, поэтому будьте очень бдительны.

  4. Как обсуждалось выше, сделайте бизнес-логику модульной. Среди других причин, уже перечисленных, количество раз, которое мне приходилось повторно реализовывать существующий инструмент CLI в виде веб-приложения, огромно - и это не так сложно, если логика уже представляет собой правильно спроектированный перм-модуль.

Интересные ссылки

Шаблоны проектирования CLI - я думаю, что это ESR

. Я постараюсь добавить больше маркеров по мере их припоминания.

37
ответ дан 27 November 2019 в 06:43
поделиться

Используйте POD для документирования своего инструмента, следуйте указаниям на страницах руководства; включите как минимум следующие разделы: ИМЯ, ОПИСАНИЕ, ОПИСАНИЕ, АВТОР. После того, как у вас есть надлежащий POD, вы можете сгенерировать справочную страницу с помощью pod2man, просмотреть документацию на консоли с помощью perldoc your-script.pl.

Используйте модуль, который обрабатывает параметры командной строки за вас. Мне очень нравится использовать Getopt :: Long в сочетании с Pod :: Usage . Таким образом, вызов --help отобразит красивое справочное сообщение.

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

Вот небольшой скелет сценария, который выполняет все эти функции:

#!/usr/bin/perl

=head1 NAME

simplee - simple program

=head1 SYNOPSIS

    simple [OPTION]... FILE...

    -v, --verbose  use verbose mode
    --help         print this help message

Where I<FILE> is a file name.

Examples:

    simple /etc/passwd /dev/null

=head1 DESCRIPTION

This is as simple program.

=head1 AUTHOR

Me.

=cut

use strict;
use warnings;

use Getopt::Long qw(:config auto_help);
use Pod::Usage;

exit main();

sub main {

    # Argument parsing
    my $verbose;
    GetOptions(
        'verbose'  => \$verbose,
    ) or pod2usage(1);
    pod2usage(1) unless @ARGV;
    my (@files) = @ARGV;

    foreach my $file (@files) {
        if (-e $file) {
            printf "File $file exists\n" if $verbose;
        }
        else {
            print "File $file doesn't exist\n";
        }
    }

    return 0;
}
21
ответ дан 27 November 2019 в 06:43
поделиться

Some lessons I've learned:

1) Always use Getopt::Long

2) Provide help on usage via --help, ideally with examples of common scenarios. It helps people don't know or have forgotten how to use the tool. (I.e., you in six months).

3) Unless it's pretty obvious to the user as why, don't go for long period (>5s) without output to the user. Something like 'print "Row $row...\n" unless ($row % 1000)' goes a long way.

4) For long running operations, allow the user to recover if possible. It really sucks to get through 500k of a million, die, and start over again.

5) Separate the logic of what you're doing into modules and leave the actual .pl script as barebones as possible; parsing options, display help, invoking basic methods, etc. You're inevitably going to find something you want to reuse, and this makes it a heck of a lot easier.

13
ответ дан 27 November 2019 в 06:43
поделиться

На CPAN есть несколько модулей, которые значительно упростят написание программ CLI:


Если ваше приложение основано на Moose, также обратите внимание на MooseX :: Getopt и MooseX :: Runnable

5
ответ дан 27 November 2019 в 06:43
поделиться

Самая важная вещь - иметь стандартные параметры .

Не пытайтесь быть умным , просто согласуйтесь с уже существующими инструментами .

Как для этого также важно , но только приходит секунда .

На самом деле, это довольно типично для всех интерфейсов CLI.

5
ответ дан 27 November 2019 в 06:43
поделиться

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

2
ответ дан 27 November 2019 в 06:43
поделиться

Следующие пункты не являются специфическими для Perl, но я обнаружил, что многие сценарии Perl CL имеют недостатки в этих областях:

  1. Используйте общие параметры командной строки. Чтобы показать номер версии, используйте -v или --version, а не --ver. Для рекурсивной обработки -r (или, возможно, -R, хотя в моем опыте с Gnu / Linux чаще встречается -r), а не --rec. Люди будут использовать ваш сценарий, если они смогут запомнить параметры. Выучить новую команду легко, если вы помните, что «она работает как grep» или другую знакомую утилиту.

  2. Многие инструменты командной строки обрабатывают «вещи» (файлы или каталоги) в «текущем каталоге». Хотя это может быть удобно, убедитесь, что вы также добавили параметры командной строки для явной идентификации файлов или каталогов для обработки. Это упрощает включение вашей утилиты в конвейер без того, чтобы разработчикам приходилось вводить кучу команд cd и помнить, в каком каталоге они находятся.

4
ответ дан 27 November 2019 в 06:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: