Ruby 模块和类

标签 ruby

我刚刚开始使用 Ruby 并学习模块的概念。我知道模块的一种用途是更好地组织代码并避免名称冲突。假设我有一堆这样的模块(我没有包括实现,因为那不重要) :

module Dropbox

  class Base

    def initialize(a_user)
    end

  end  

  class Event < Base

    def newFile?
    end

    def newImage?
    end

  end

  class Action < Base

    def saveFile(params)
    end

  end

end

和另一个模块:

module CustomURL

  class Base

    def initialize(a_user, a_url, a_method, some_args, a_regex)
    end

  end

  class Event < Base

    def initialize(a_user, a_url, a_method, some_args, a_regex)
    end

    def change?
    end

  end

  class Action < Base

    def send_request(params)
    end

  end

end

我将拥有一堆这样的模块(10+,用于 gmail、hotmail 等...)。我想弄清楚的是,这是组织代码的正确方法吗?

基本上,我使用模块来表示“服务”,所有服务都有一个通用接口(interface)类(用于初始化的基础、用于操作列表的操作和用于监视的事件)。

最佳答案

您在这里定义相关或依赖类的系列。您对模块的使用为 namespaces对于这些家庭来说是正确的。

同样使用这种方法可以很容易地构建abstract factory如果它们具有兼容的接口(interface),则适用于您的类(class)。但据我所知,当前的类设计并非如此:例如 Dropbox::EventCustomURL::Event 具有完全不同的公共(public)方法。

你可以重新评估你的类的设计,看看它们是否有可能有统一的接口(interface),这样你就可以使用 polymorphism并提取类似 BaseEventBaseAction 的内容,以便所有事件和操作都派生自这些基类。

更新:就您定义服务而言,定义顶级模块(如Service)并放置所有类可能会很有用在这个模块里面。它将提高系统的模块化。如果将来您要为您的模块服务重构一些基类,您可以将它们放在顶级命名空间中。然后您的对象将具有如下可读的名称:

Service::Dropbox::Event
Service::Dropbox::Action
Service::CustomURL::Event
Service::CustomURL::Action
Service::BaseEvent
Service::BaseAction

关于Ruby 模块和类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9054233/

相关文章:

用于下载文件的 Ruby Sinatra 应用程序(作为流媒体)

ruby - 是否有更多惯用的 ruby​​ 来执行此迭代?

html - 将 Ruby 与 HTML 代码链接

ruby - 调试神秘的 Ruby 进程崩溃

ruby-on-rails - 在 RoR 上保护敏感数据(信用卡)

Ruby - 用于速率限制的访问响应 header (Help Scout)

ruby-on-rails - 如何解决 RubyMine "' ruby​​-debug-ide' isn't installed”错误

Ruby:如何在 chdir 之后获取源文件的正确完整路径?

ruby - 如何找出复制的行数?

ruby-on-rails - 如何在 Rails View 中使用 Ruby 常量?