我是 Ruby 新手,主要来自 C# 和 ActionScript 3(以及其他语言)。我对抽象功能很好奇。具体来说,包装和抽象 Ruby 的 FTP 和 SFTP 库。
我四处寻找,发现了一个名为Backup的宝石。它确实引起了我的注意,因为它支持通过 S3、SCP、SFTP 和 FTP 备份内容。所以我想,“哇,这是一个完美的例子!” 我开始浏览源代码,但后来我遇到了如下代码:
case backup.procedure.storage_name.to_sym
when :s3 then records = Backup::Record::S3.all :conditions => {:trigger => trigger}
when :scp then records = Backup::Record::SCP.all :conditions => {:trigger => trigger}
when :ftp then records = Backup::Record::FTP.all :conditions => {:trigger => trigger}
when :sftp then records = Backup::Record::SFTP.all :conditions => {:trigger => trigger}
end
它到处都是 case/when 语句!如果我在 C# 中对此进行攻击,我会编写一个协议接口(或抽象类)并让 FTP 和 SFTP 实现它。然后我的客户端类将只传递一个协议实例而不关心实现。零开关/外壳。
在用 Ruby 编码时,我会很感激在这种情况下的最佳实践的一些指导。