/*
* 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));
}
}
В качестве предисловия я потратил 3 года на разработку и внедрение довольно сложного набора инструментов командной строки на Perl для крупной финансовой компании. Приведенные ниже идеи в основном являются частью руководящих принципов нашей команды.
Параметр командной строки: разрешить как можно большему количеству пользователей значения по умолчанию.
НИКАКИХ позиционных параметров для любой команды, имеющей более двух параметров.
Иметь удобочитаемые имена параметров. Если длина командной строки является проблемой для неинтерактивных вызовов (например, некоторые безымянные устаревшие оболочки имеют короткие ограничения на командные строки), укажите короткие псевдонимы - GetOpt :: Long легко позволяет это.
По крайней мере, print значения по умолчанию для всех опций в сообщении '-help'.
Еще лучше, вывести «текущие» значения всех опций (например, если параметр и значение указаны вместе с «-help», в справочном сообщении будет напечатано значение параметра из командной строки). Таким образом, люди могут собрать строку командной строки для сложной команды и проверить ее, добавив «-help», перед фактическим запуском.
Следуйте стандартному соглашению Unix о выходе с ненулевым кодом возврата, если программа завершилась с ошибками.
Если ваша программа может производить полезный (например, стоит захватить / grepping / еще много чего) вывод, убедитесь, что все сообщения об ошибках / диагностике отправляются в STDERR, чтобы их можно было легко разделить.
В идеале, разрешите пользователю указывать файлы ввода / вывода через командную строку параметр вместо принудительной переадресации "<" / ">" - это позволяет НАМНОГО упростить жизнь людям, которым нужно создавать сложные каналы с помощью вашей команды. То же самое для сообщений об ошибках - есть опция файла журнала.
Если команда имеет побочный эффект, наличие опции «whatif / no_post» обычно является очень хорошей идеей.
Как отмечалось ранее, не повторно изобрести колесо. Используйте стандартные модули обработки параметров командной строки - MooseX :: Getopt или Getopt :: Long
Для Getopt :: Long присвойте все параметры одному хэшу, а не отдельным переменным. Многие полезные шаблоны включают передачу этого хэша аргументов CLI конструкторам объектов.
Убедитесь, что ваши сообщения об ошибках ясны и информативны ... Например, включают "$!" в любых сообщениях об ошибках, связанных с вводом-выводом. Стоит потратить дополнительную 1 минуту и 2 строки в вашем коде, чтобы иметь отдельные ошибки «файл не найден» и «файл не читается», CLI не допускает «внешней» проверки, как это делают веб-приложения, поэтому будьте очень бдительны.
Как обсуждалось выше, сделайте бизнес-логику модульной. Среди других причин, уже перечисленных, количество раз, которое мне приходилось повторно реализовывать существующий инструмент CLI в виде веб-приложения, огромно - и это не так сложно, если логика уже представляет собой правильно спроектированный перм-модуль.
Шаблоны проектирования CLI - я думаю, что это ESR
. Я постараюсь добавить больше маркеров по мере их припоминания.
Используйте 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;
}
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.
На CPAN есть несколько модулей, которые значительно упростят написание программ CLI:
Если ваше приложение основано на Moose, также обратите внимание на MooseX :: Getopt и MooseX :: Runnable
Самая важная вещь - иметь стандартные параметры .
Не пытайтесь быть умным , просто согласуйтесь с уже существующими инструментами .
Как для этого также важно , но только приходит секунда .
На самом деле, это довольно типично для всех интерфейсов CLI.
Вам следует использовать Perl-модули , чтобы сделать ваш код многоразовым и легким для понимания.
следует взглянуть на лучшие практики Perl
Следующие пункты не являются специфическими для Perl, но я обнаружил, что многие сценарии Perl CL имеют недостатки в этих областях:
Используйте общие параметры командной строки. Чтобы показать номер версии, используйте -v или --version, а не --ver. Для рекурсивной обработки -r (или, возможно, -R, хотя в моем опыте с Gnu / Linux чаще встречается -r), а не --rec. Люди будут использовать ваш сценарий, если они смогут запомнить параметры. Выучить новую команду легко, если вы помните, что «она работает как grep» или другую знакомую утилиту.
Многие инструменты командной строки обрабатывают «вещи» (файлы или каталоги) в «текущем каталоге». Хотя это может быть удобно, убедитесь, что вы также добавили параметры командной строки для явной идентификации файлов или каталогов для обработки. Это упрощает включение вашей утилиты в конвейер без того, чтобы разработчикам приходилось вводить кучу команд cd и помнить, в каком каталоге они находятся.