2012-01-29 148 views
1

我刚刚开始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等)。我试图弄清楚的是,这是组织我的代码的正确方法吗?

基本上,我使用的模块来表示“服务”,所有服务都将有一个共同的接口类(基地初始化,行动的操作列表和事件监控)。

+1

我建议将其移至codereview.stackexchange.com。你的代码起作用了,它并不像它可能的那样严密。 – 2012-01-29 16:57:29

回答

5

您正在定义相关类或依赖类的族。您对这些系列的使用模块为namespaces是正确的。

而且这种方法会很容易建立abstract factory你的类,如果他们有兼容的接口。但据我所见,目前的班级设计并非如此:例如Dropbox::EventCustomURL::Event有完全不同的公共方法。

您可以重新评估你的类的设计,看看是否有可能让他们有统一的接口,这样就可以使用polymorphism并提取像BaseEventBaseAction让所有的事件和行为会从这些基类派生。

更新:至于你定义服务,这可能是定义顶层模块状Service有用,并把这个模块里面所有的类。它将改善您的系统的模块化。如果将来你会为你的模块服务重构一些基类,你可以把它们放在顶层的命名空间中。那么你的对象将具有可读性的名字,像这些:

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

感谢您的输入。关于你在“更新”中写的内容,你的意思是把一个模块放在一个模块中? (对不起,如果这是一个新手的问​​题,新的红宝石...) – 0xSina 2012-01-29 16:22:06

+0

@PragmaOnce,是的,你可以把模块放在模块 – 2012-01-29 16:27:34

+0

有没有一种简单的方法把模块放入模块,而不是手动有10+模块同一个文件? – 0xSina 2012-01-29 16:55:15

0

正如你很快会注意到的那样,组织代码没有“正确的方式”。

有可读性是主要主观细微的差别。你组织课程的方式对于将你的代码作为宝石来说是很好的。代码中通常不需要其他人员项目中不包含的代码,但它也不会受到影响。

只要问自己:“这是否有道理的人读我的代码谁不知道我的用意是什么?”。

+3

“组织代码没有”正确的方式“,是正确的,但有”更正确“的方式来做到这一点。继“干”(“不要重复自己”)往往会推动我们某些方向,比如与基类合作,然后对它进行分类。 OPs代码是否按原样工作?大概。它会更好吗?是。 – 2012-01-29 16:56:15

1

我在工作中有一些类似的代码,只有我建模的网络设备。

我定义了与公共属性和方法,包括一个通用的比较泛型类的方法,然后子类,为硬件的各种型号。子类包含该硬件的唯一属性,以及初始化或比较该设备实例与其他设备所需的所有支持代码。

只要我认为有必要写类似的另一个我写我想我如何通过它来促进基础类重用代码的方法。通常这涉及到如何改变我传递参数的方式,而不是使用形式参数,我最终使用了散列,然后从中抽取我需要的东西,并保持方法接口在控制之下。

因为您将有很多子类到基类中,所以重要的是花时间考虑基类的工作方式。在添加子类时,重构基的任务将变得更加困难,因为您将不得不更改其他子类。我总是发现我在盲目的小巷里走了一段路,不得不稍稍退缩一些,但随着班级的成熟,这种情况会越来越少。

+0

感谢您的输入。使用哈希作为参数,这是在Ruby代码中的常见做法?帽子有没有任何性能问题? – 0xSina 2012-01-29 19:28:41

+0

这是很常见的。你会发现Ruby非常适合使用名称/值对传递作为选项,它在接收端转换为散列值。任何体面的Ruby书籍都会在关于方法的章节中讨论。 – 2012-01-30 01:15:38