Faraday: 功能请求:HTTP 动词的显式方法定义

创建于 2020-07-17  ·  12评论  ·  资料来源: lostisland/faraday

似乎顶级 HTTP 动词方法(例如Faraday.get )是通过missing_method代理default_connection ivar 来处理的。 除了有点低效(与典型的网络请求延迟相比,这无疑是一个小问题),它还导致各种工具出现问题:

  • 这些方法不会在prysolargraph等中自动完成。
  • https://www.rubydoc.info/gems/faraday/Faraday未获取该文档
  • 使用失败冰糕类型检查(虽然我试图在 https://github.com/sorbet/sorbet-typed/pull/268/commits/83132c1b19c50ad7516ecc806243afbd3445b98d 中解决这个问题,但它容易漂移)

您是否愿意用显式方法定义替换此实现?

documentation

所有12条评论

@dduugg ,而不是明确定义方法,我会探索一个文档友好的解决方案。
我们也在连接中使用元编程定义: https :

这与您上面提到的要点很相配吗?
如果是这样,我们也可以为Faraday模块复制一个类似的文档片段。

@iMacTia ,感谢您的回复。 我不认为这个问题可以通过文档解决。 我能麻烦您详细说明一下对明确定义的抵制吗? 我认为这会更好地讨论讨论。 例如,文档方法可能与七个单行显式转发定义一样冗长(计算各种@!method@!scope指令,以及method_missing代码)我建议Faraday 。 但我不知道这是否是这里的基本原理(代码的阅读量比编写的多得多,所以我认为无论如何优化代码编写者都是错误的)。

主要有 2 点让我对这个变化望而却步。

  • 我个人不认为使用delegates只是代码编写者的优势。 我已经使用 Ruby 多年了,和其他人一样,我开始欣赏这种语言的简洁语法。 当我阅读一些代码并发现delegates我立即知道这意味着什么,它可能会将数十行代码压缩为几行。
  • HTTP 动词代理并不是 Faraday 中我们利用元编程的唯一实例,还有更多实例,它们很可能遇到了您在此处提出的相同问题,但尚未引起注意。 同意这一改变要么破例,要么开创先例,这两件事我都想避免。

但与其专注于我对这种变化的抵制,我更愿意讨论我们试图在这里引入什么样的优势。 我完全理解您所描述的问题,我实际上认为我们应该尽可能尝试解决它!
因此,如果这里的主要问题是与代码建议、自动完成和文档的 IDE/工具的兼容性,那么我只是建议寻找替代解决方案,例如文档注释(我们已经非常广泛地使用 YARD)。
当你说这个解决方案同样冗长时,你也是对的,尽管我认为注释不会像方法列表那样影响可读性,而且它很容易识别。

@iMacTia ,感谢您的回复。 我们已切换到具有更好 API 可发现性和工具支持的不同库,但我会分享我的想法,以防您发现它们有用。

  • 可发现性并不排除使用元编程(尽管在这种特定情况下,我认为显式def是可行的方法),但它需要替换method_missing方法,如前所述。
  • 我不确定我是否理解delegates参数。 Faraday 在处理 HTTP 动词方法时似乎没有使用显式委托。 (在这一点上的困惑可能是一种代码味道,即 HTTP 动词方法的实现过于复杂)。
  • 我们必须同意不同意delegate等对代码编写者的帮助。 我正在与拥有几十年 ruby​​ 集体经验的人一起工作,我们还没有发现这里的方法有任何可读性优势(即使通过 pry、YARD、冰糕和 Solargraph 尝试探索 API 所浪费的时间也打折扣)。 观看 ruby​​ist 第一次探索这个 API 的尝试可能是值得的,至少在这个特定的点上。

只是想在这里提供一些诚实(希望有用)的反馈。 我仍然感谢为 OSS 做出的贡献所花费的时间和精力。

嘿,感谢您为法拉第所做的一切努力! 我知道这是一个老问题,但我倾向于同意可发现性是一个问题。 我正在研究一些中间件,并将此部分添加到我的自述文件中。 我的图书馆面向那些以前可能没有使用过法拉第的人,所以我有责任解释一些事情。 我会说(有点犹豫)要弄清楚事情并不容易。

image

@gurgeous我同意文档绝对是我们可以做得更好的前沿(尽管我们通过启动法拉第网站开始解决这个问题),但我不知道这个问题中的建议将如何解决您的具体问题。

也许我忽略了这一点,因为我只是习惯于以不同的方式工作,但是如果我不知道如何使用库,我就不会依赖自动完成和猜测知道该怎么做。
相反,我检查了库文档,如果这没有帮助,我会深入研究代码以了解它是如何工作的。

因此,为什么我认为改进的文档(可视化或代码中)是解决这个问题的方法。
但也许我在这里遗漏了一些东西,或者一个更好的文档无济于事的特定用例?
我对“可发现性”的理解是否正确?

我对“可发现性”的理解是否正确?

在我的情况下不是。 如果我想深入研究特定方法,我的期望是能够在pry执行ls Faraday ,然后是$ Faraday.get等。 我觉得我已经能够使用我使用过的任何其他 gem 有效地做到这一点,很少(如果有的话)需要导航到文档页面,因此打开了这张票。 (这是上面提到的其他问题的补充,例如静态分析工具无法识别使用该库的代码。)

再次感谢您听取我们的意见。

我喜欢法拉第网站! 也许我可以提交 PR 并提供一些建议? 乐于助人。 我认为这种努力对新人来说总是会有回报的。 如果您有兴趣,请告诉我。

pry + ls Faraday ,我也是这种模式的粉丝并广泛使用它。 远离 method_missing 并不是一个坏主意。 随着 Ruby 3、语言服务器、RBS 等的兴起,Ruby 正慢慢朝这个方向发展。不过,我认为这是次要的文档。

@gurgeous我们对文档 Pull Requests 感兴趣,找到带有一组 Gemfile(和 README)的docs/目录,用于将网站发布到我们正在使用的 GitHub 页面。 如果它的用法不清楚,网站更新过程,请为_that_打开一个问题或一个PR。

感谢法拉第用户的关心!

我喜欢法拉第网站! 也许我可以提交 PR 并提供一些建议? 乐于助人。 我认为这种努力对新人来说总是会有回报的。 如果您有兴趣,请告诉我。

@gurgeous绝对! 我们总是欢迎帮助改进文档或网站,因为对我们维护者来说显而易见的事情对用户来说可能并不那么明显。 另外,我们真的很费时间,这通常会导致文档成本。 实际上,如果不是@olleolleolle继续努力,文档状态会更糟😄!

pry点(cc @dduugg)上,我从未使用过它,因此我可能无法理解。
我只是尝试了您的其他详细信息,我注意到ls Faraday::Connection确实显示了动态生成的方法以及委托的方法🙌。
所以我最初的理解是我们不能使用这些 Ruby“魔法”是错误的,实际上唯一的限制是使用missing_method

我不太喜欢的是引入了如下的显式方法:

def self.get(...)
  ...
end

def self.post(...)
  ...
end

# ... and so on ...

但是,如果我们可以通过向主Faraday模块添加动态定义或委托来修复pry的发现,那么我会接受。 很抱歉第一次没有收到!

不用担心时间限制。 永远不要因为成为开源维护者而感到难过! 无论如何,我们感谢您的努力。 我也去过...

我将开始讨论:文档以确保我们在同一页面上。

@iMacTia用户如何知道查看Faraday::Connection ? 我已经切换到一个带有可发现 API 的 HTTP gem,但我快速浏览了https://lostisland.github.io/faraday/usage/并且没有一个代码示例明确使用它(尽管最后一个这样做了)隐含)。 这些示例主要调用Faraday上的静态方法,但在 pry 中找不到它们。 我不知道任何其他采用这种方法的 gem,而且我仍然认为这是一种反模式。

一如既往,谢谢你听我说完。

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

QuinnWilton picture QuinnWilton  ·  4评论

jeffb-stell picture jeffb-stell  ·  5评论

yykamei picture yykamei  ·  4评论

aleksb86 picture aleksb86  ·  3评论

mattmill30 picture mattmill30  ·  4评论