【问题标题】:System for organizing multi-file Ruby programs?用于组织多文件 Ruby 程序的系统?
【发布时间】:2011-01-01 08:42:19
【问题描述】:

是否有组织多文件 Ruby 程序的标准或常规系统?我在 Ruby 中开始了我的第一个大型“项目”,这是一个按逻辑组织成多个文件和目录的搜索程序。我在下面概述了我的潜在结构:

  • 主文件。该文件实现了搜索类和通用搜索协议。
  • 算法分析文件。该文件实现了解释搜索结果的函数。
  • 协议目录
    • 每个协议包含一个要搜索的文件。
  • Feed 目录
    • 该程序的部分目的是搜索存档的新闻提要。此功能的文件位于此文件夹中。

但是,代码目前有一个类(我们称之为 Searcher),每个协议的搜索类都继承自(GoogleSearcher

除了我的具体示例之外,我想知道是否有任何约定,例如“更多文件而不是更少”,或“文件的逻辑结构是不必要的”。有一个“帮助”函数文件是否很常见(例如在 Rails 中?)什么级别的抽象被认为是合适的?

最后,我计划有一天将它作为一个库集成到 Rails 中(不是插件;我希望它也能独立工作)。我不知道这是否会影响组织。

我知道这是一个非常开放的问题,但那是因为我会很感激任何远程相关的建议。提前致谢。

【问题讨论】:

    标签: ruby-on-rails ruby project code-organization project-organization


    【解决方案1】:

    如果您想与 Rails 集成,您可能需要创建一个插件。

    本指南可能是一个不错的起点:http://guides.rubyonrails.org/plugins.html

    【讨论】:

    • 很有趣,但我不认为我想要那么深的 Rails 集成。 (特别是因为我不完全是 Rails 专家)。我想我会把它用作图书馆。已更新要求澄清。
    【解决方案2】:

    您可能需要考虑为您的库创建一个 gem。这将使该库既可以独立使用,也可以与 Rails 一起使用,并使部署/更新更简单。

    此外,由于 gems 通常遵循特定的目录结构,它还解决了您不知道如何组织库的问题。

    有大量可用于创建 gem 的文档。 Here 提供有关文件结构的更多信息,以及其他有用的提示。

    【讨论】:

    • 有一些简洁的宝石生成工具:newgem、Jeweler、bones。我将 newgem 用于一个项目(实际上并不打算作为 gem 发布)并且效果很好
    • 这很好,它只留下一个未回答的问题(回想起来,这个问题肯定太宽泛了。)有没有办法跨多个文件进行类继承,其中主类在主文件和从它继承的类在子目录的外围文件中?还是那是一个落后的组织?
    • Ruby 在继承方面非常宽容。如果我正确理解了您的问题,那么绝对可以按照您的描述进行设置。在不知道您项目的任何细节的情况下,我可能会做同样的事情,其中​​“主类”位于 lib/foo/ 目录中,而从主类继承的类位于 lib/foo/bar、lib/foo/baz等等。查看诸如 Nokogiri 之类的 gem,了解此类设置的实时示例。
    • 啊,但我试过这个并得出结论,除非我需要这些文件,否则我不能从其他源文件的类继承。如何从父目录中获取文件?
    • @Luke,您可能应该提出一个新问题。但是,简短的回答:将您的库放在 ruby​​ 加载路径上(gem 会为您执行此操作),并要求所有与您的库基目录相关的文件。
    【解决方案3】:

    您可能想结合 vonconrad 的建议查看 Ideal ruby project structure。宝石绝对是一个很好的起点,通过官方rubygems documentation 运行也可能是有益的。

    【讨论】:

      【解决方案4】:

      除了 vonconrad's Answer 中推荐的链接外,您还可以参考 Dave Thomas 等人在Programing Ruby 1.9 的第 16 章中的“组织源代码”部分。有一个free sample PDF of that part of the book

      章节提到:

      16.1 命名空间 我们已经遇到过 Ruby 帮助您管理程序中事物名称的方法。如果您定义方法或 类中的常量,Ruby 确保它们的名称只能被使用 在该类的上下文中

        

      16.2 组织您的源代码独立的小型脚本可以放在一个文件中...较大的程序应该考虑使用 RubyGems 系统

      anagram/ <- top-level
        bin/ <- command-line interface goes here
        lib/ <- three library files go here
        test/ <- test files go here
      

      【讨论】:

        【解决方案5】:

        我知道这个问题已经很老了,但希望对后来的人有用......

        我同意上面所说的:gem 是一种组织和重用代码的好方法。 除了上面的链接,我可以推荐使用 Bundler 来创建 gems 在这个 Ryan Bates RailsCast 中:http://railscasts.com/episodes/245-new-gem-with-bundler

        我发现 Bundler 让 gem 的创建和维护变得非常简单。

        关于继承,看看如何使用 Ruby mixin 来封装和重用代码 跨越不同的类层次结构。 http://ruby-doc.org/docs/ProgrammingRuby/html/tut_modules.html

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2011-02-16
          • 2017-05-23
          • 2012-10-11
          • 1970-01-01
          • 1970-01-01
          • 2012-11-04
          • 2012-10-11
          • 1970-01-01
          相关资源
          最近更新 更多