我刚刚开始使用 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::Event
和 CustomURL::Event
具有完全不同的公共(public)方法。
你可以重新评估你的类的设计,看看它们是否有可能有统一的接口(interface),这样你就可以使用 polymorphism并提取类似 BaseEvent
和 BaseAction
的内容,以便所有事件和操作都派生自这些基类。
更新:就您定义服务而言,定义顶级模块(如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/