Я пытаюсь подобрать 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, но я должен был быть более ясным, что это не как обрабатывать параметры командной строки, о которых я спрашиваю, а скорее взаимосвязь между параметры командной строки, которые эффективно устанавливают глобальное состояние программы и классы, которые в идеале должны быть независимыми от подобных вещей.