【发布时间】:2011-03-22 11:27:53
【问题描述】:
我正在编写一个小型 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,但我希望有一些我没有想到的更直接的方法。
【问题讨论】: