Я пишу небольшое приложение командной строки Ruby, которое использует fileutils
из стандартной библиотеки для файловых операций.В зависимости от того, как пользователь вызывает приложение, я хочу указать либо FileUtils
, FileUtils::DryRun
, либо FileUtils::Verbose
.
Поскольку include
является приватным, я не могу применить логику квыберите в методе initialize
объекта.(Это была моя первая мысль, с тех пор я мог просто передать информацию о выборе пользователя в качестве параметра new
.) Я предложил два варианта, которые, кажется, работают, но я тоже не доволен:
Задайте глобальную переменную в пространстве имен приложения на основе выбора пользователя, а затем выполните условное включение в класс:
class Worker
case App::OPTION
when "dry-run"
include FileUtils::DryRun
etc.
Создание подклассов, где единственная разница в том, какую версию FileUtils
они включают.Выберите подходящий, в зависимости от выбора пользователя.
class Worker
include FileUtils
# shared Worker methods go here
end
class Worker::DryRun < Worker
include FileUtils::DryRun
end
class Worker::Verbose < Worker
include FileUtils::Verbose
end
Первый метод выглядит DRY-er, но я надеюсь, что есть что-то более простое, о чем я не думализ.