Ruby抽象

dev*_*vth 1 ruby oop ftp sftp abstraction

我是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
Run Code Online (Sandbox Code Playgroud)

查看GitHub上的完整源代码

它充斥着case/when语句!如果我在C#中攻击它,我会写一个Protocol接口(或抽象类),让FTP和SFTP实现它.然后我的客户端类只会传递一个Protocol实例而不关心实现.零开关/箱.

在Ruby中编码时,我会对这种情况下的最佳实践提供一些指导.

Dig*_*oss 6

你也可以在Ruby中以这种方式完成它

由于动态类型,Ruby不需要接口.就此而言,它不需要原型,签名或模板,甚至子类,虽然存在,但并不是绝对必要的.

当我说"不需要"时,我只是说你所指的设计模式可以直接用Ruby实现.因为在"编译时"没有强制执行调用限制,所以任何依赖于接口或任何多态性的设计模式都可以直接在Ruby中使用.

是的,看起来好像这个包没有充分利用可能的抽象,但也许(a)无关紧要,只要它有效.毕竟,您不需要输入它,或者(b)使用的简单组合模式有一些不那么明显的好处.