Я пытаюсь подобрать ruby, портируя Perl-программу среднего размера (не OO). Одна из моих личных идиом состоит в том, чтобы установить опции как это:
use Getopt::Std;
our $opt_v; # be verbose
getopts('v');
# and later ...
$opt_v && print "something interesting\n";
В Perl я как бы стискиваю зубы и позволяю $ opt_v (эффективно) быть глобальным.
В рубине более или менее точный эквивалент будет
require 'optparse'
opts.on("-v", "--[no-]verbose", TrueClass, "Run verbosely") {
|$opt_verbose|
}
opts.parse!
end
где $ opt_verbose - глобальный объект, к которому могут обращаться классы. Зная, что классы знают о глобальных флагах, кажется ... э ... неправильным. Какой ОО-идиоматический способ сделать это?
- Пусть основная подпрограмма позаботится обо всем, что связано с опциями, и пусть классы просто возвращают ей то, с чем она решает, как поступить?
- Могут ли классы реализовать необязательное поведение (например, знать, как быть многословным) и установить режим с помощью attr_writer?
обновлено: Спасибо за ответы, предлагающие optparse, но мне следовало бы прояснить, что это не как обрабатывать параметры командной строки, о которых я спрашиваю, а скорее отношения между параметрами командной строки, которые эффективно устанавливают глобальное состояние программы, и классами, которые в идеале должны быть независимыми от подобных вещей.