gpt4 book ai didi

ruby 抽象

转载 作者:太空宇宙 更新时间:2023-11-03 17:09:00 27 4
gpt4 key购买 nike

我是 Ruby 的新手,主要来自 C# 和 ActionScript 3(以及其他语言)。我对抽象功能很好奇。具体来说,包装和抽象 Ruby 的 FTP 和 SFTP 库。

我四处搜索,发现了一个名为 Backup 的 gem .它确实引起了我的注意,因为它支持通过 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

view the full source on GitHub

里面到处都是 case/when 语句!如果我在 C# 中对此进行攻击,我会编写一个协议(protocol)接口(interface)(或抽象类)并让 FTP 和 SFTP 实现它。然后我的客户端类将只传递一个 Protocol 实例而不关心实现。零开关/案例。

在使用 Ruby 编写代码时,如果能提供一些关于最佳实践的指导,我将不胜感激。

最佳答案

你也可以在 Ruby 中这样做

因为动态类型 Rub​​y 不需要接口(interface)。就此而言,它不需要原型(prototype)、签名或模板,即使存在子类也不是绝对必要的。

当我说“不需要”时,我的意思是您所指的设计模式可以直接在 Ruby 中实现。因为在“编译时”没有强制执行调用限制,所以任何依赖于接口(interface)或任何风格的多态性的设计模式都可以直接在 Ruby 中使用。

是的,看起来好像那个包并没有充分利用可能的抽象,但也许 (a) 它并不重要,只要它有效。毕竟,您不需要输入它,或者 (b) 使用的简单组合模式有一些不是立即显而易见的好处。

关于 ruby 抽象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1944373/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com