为啥 Rails 应用程序没有拆分,业务逻辑没有转移到 gem 中? [关闭]

Posted

技术标签:

【中文标题】为啥 Rails 应用程序没有拆分,业务逻辑没有转移到 gem 中? [关闭]【英文标题】:Why is it that Rails applications aren't split up and business logic moved into gems? [closed]为什么 Rails 应用程序没有拆分,业务逻辑没有转移到 gem 中? [关闭] 【发布时间】:2013-01-05 01:27:44 【问题描述】:

在 ASP.NET MVC 应用程序和 Java Web 应用程序中,将业务逻辑保存在单独的包/dll 中并处理诸如数据库和交付机制(Web 应用程序、Web 服务、本机移动或桌面等)之类的东西是一种常见做法.) 作为details that are plugged in。

我可以说这种结构的一些优点是:

通过不同的交付机制或持久层重用业务逻辑 可以运行业务逻辑的验收和单元测试,而无需加载 Web 框架或连接到数据库;测试非常快 考虑应用程序的本质,而不是交付方式

但这种做法在 Rails 社区中并不常见;我没有看到任何 Rails 应用程序将业务逻辑保存在 gems 中,并且主要的 ORM 都将持久性逻辑和业务逻辑联系在一起。 Ruby 是否有什么东西可以让我以我提到的方式构建应用程序变得不必要?

【问题讨论】:

【参考方案1】:

大多数情况下,这只是关于努力和配置。让我们分解各个点:

工作量:设置一个新的 gem 需要一点时间(每个项目都有自己特定的一组依赖项 - 测试、模拟、文档等)

配置: 由于大多数 Rails 应用程序使用 ActiveRecord;拆分模型层有点困难(尽管plentyofgems 这样做)。不过,Rails::Engine 有助于减轻这方面的痛苦。

成本:对于大多数 Rails 项目,将代码拆分到单独的 gem/repo 中获得的收益很少:

大多数项目不会在彼此之间共享代码(当它们共享时,它们设置 gem)

存在 - 或应该在正确设置的情况下 - 测试代码的方式没有区别;无论是在 gem 中还是在您的主项目中。 (您可以在不使用控制器等的情况下测试模型 - 没问题)

主要的好处是在接口/层之间强制执行显式合同 - 这在 Ruby 社区中不太普遍

【讨论】:

【参考方案2】:

定义“必要”。在 .NET 或 Java 中这样做不是必要,它方便

Rails 应用程序通常只在单个应用程序中完全公开 Web 应用程序和相关服务。

测试类似;没有需要为了单独测试代码而分解应用程序功能,Rails 中的测试也不例外:有单元测试、规范等可以在代码的任何级别运行,并且模拟任意部分功能的各种机制。

持久层通常由 AR 层处理,尽管实际上切换持久层是相当不寻常的(我在 30 年的开发中只这样做过一次,但这显然是轶事)。此外,由于鸭子类型,Ruby 中的一些此类切换在代码级别是透明的(例如,我通过移动到 ActiveResource 而不是 ActiveRecord 将一个应用程序从本地 DB 切换到服务几乎是透明的,尽管我没有尝试之后优化任何东西,数据模型非常简单。)

综上所述,IMO Rails 社区经常忽略“企业”商店的做法,因为 Ruby 语言使得构建功能变得非常容易,而无需过度架构。但是,只有在应用达到一定大小后,这种限制才会变得清晰。

Ruby 和 Rails 开发的最新趋势包括我多年来在企业中所做的事情(并且使用 Ruby 比 Java 更容易实现)。但是,为了自身的缘故将功能分解到库中并不是特别有用。识别应该被分解的代码,但是当有必要这样做时,它会跨环境发生。

【讨论】:

能够测试我的代码的不同层而不必将每一层放在不同的 gem 中的部分回答了我的问题。如果我需要明确区分业务逻辑和 Web 框架代码,我总是可以使用良好的文件夹结构。这样,如果我确实需要创建一个 MacRuby 应用程序或其他东西,将我的业务逻辑代码拉入 gem 会更容易。这使我想到了您提出的另一个重要观点;仅在需要时将代码分解为宝石。 现在我想起来了,.NET 运行时和 JVM 以及它们相关的 IDE 的工作方式,使 dll/包变得如此简单,以至于它们可以像文件夹一样用作组织工具。也许这就是为什么在这些平台上使用项目而不是文件夹来组织代码更传统的原因【参考方案3】:

Rails 是关于约定优于配置的。以及已提出的意见/最佳实践。

我不认为将 BLL 分解为宝石有很大的优势。除非我有独立于我的网络应用程序并且可以重用的代码。例如,我最近为一个公司论坛构建了一个 BBCode 解析器,所以我将它打包为一个 GEM,可以插入任何 Rails 应用程序。 github 上有数千个 GEM 可以扩展 rails 的功能。

为 Rails 应用程序制作 GEM 的整个想法应该是代码重用。如果您分离代码只是为了尝试遵循更多的代码分离,那么您就不会依赖 Rails 约定,并且如果任何其他 Rails 开发人员加入您的项目,他们将有一个学习曲线。

您可以使用任意数量的不将 Web 框架加载到 Rails 中的测试系统。在整个巨大的主题中进行测试,我会研究 RSpec 等等。并且有一些方法可以加快测试速度(例如使用 Guard 和 Spork)

这完全取决于应用程序。 Rails 的想法是让您的应用程序快速完成。根据我的经验,Java 开发一直非常缓慢。 ASP 也一样。但这些可能只是“糟糕的经历”。很多人都信誓旦旦。

【讨论】:

以上是关于为啥 Rails 应用程序没有拆分,业务逻辑没有转移到 gem 中? [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

为啥 datepicker 没有以 Rails 3 形式显示

Rails4:为啥 resque 工人不找工作

为啥我的 PostgreSQL 数组索引没有被使用(Rails 4)?

明年找到好工作React18面试题总结一

为啥所有的 Rails 助手总是对所有视图可用?有没有办法禁用它?

Rails 3.1 资产管道 - 为啥我的图像没有为生产进行预编译?