ruby - 什么时候定义一个静态 ruby 类是个好主意?
问题描述
当定义静态类而不是实例化类有意义时,是否有一些管理规则?
仍然对惯用的 ruby 初始化与静态类定义感到困惑。
从我发现的。
静态类似乎非常有效。
- ruby 既是函数式语言又是面向对象的语言。两种风格都可以写。功能风格对于“功能性”事物非常有用。
- 我经常观察类从静态到实例化,然后很快膨胀。“现在我们拥有了所有这些东西......为什么不做更多呢?!”。我看到实例化类有一种很自然的倾向,不幸的是承担了不断扩大的责任。
- 我看到当一个类从静态转换到实例化时,我们会降低单元测试的信心,因为运行时的事情可能会在内存分配/分配方面发生变化(例如,有人可能会意外地进入实例化和调用之间)。
- 我发现静态类更容易阅读,因为我们不必考虑潜在的状态变化。更少的突变=更少的复杂性。
为了我。大问题是:
- 类做不止一件事。
- 大型旧 ruby 代码库中的模式不稳定。
为了解决这两个问题,我认为静态方法(在可能的情况下)似乎对代码施加了很大的压力,以遵守 SOLID 原则。
静止的
Serializer.transform(fruit:)
实例化
Serializer.new(fruit:).transform
是什么驱使您在 ruby 中保持静态?
解决方案
您所说的是,您只想将类用作纯函数的名称空间。
这没有什么问题,您可以通过这种方式使用 ruby,但是您会在很多方面违背语言的本质。这是一个更长的讨论。
另外,我不会将其定义为静态与实例化。您实际上是在询问纯功能与 OO 方法。最后,不要将 OO 等同于“突变”。您可以在 ruby 中使用不可变值对象,我推荐它们。您可能想查看 dry-rb 生态系统,了解一种规范的方法,该方法提倡纯函数概念,这种方法与 ruby 对对象的自然支持相协调。
推荐阅读
- google-chrome-devtools - 无法在两个域上运行任何灯塔报告 - Lighthouse 返回错误:出了点问题
- python - 通过 eth 地址确定合约地址
- python - 如何模拟在 python 文件的全局范围内初始化的对象?
- flutter - Flutter 中如何使用 Hive 存储数据
- javascript - Ajax 长轮询不会在中止时停止我的 PHP 脚本
- php - 如何获取分类的自定义字段值?
- javascript - chrome.storage.sync.set a key in object in Javascript
- api - 哪种技术提供 Instagram 个人资料照片缩放功能?
- docker - 错误“无法使用前端 dockerfile.v0 解决”
- python - 如何从时区字符串列中获取时区字符串?