2012-01-29 146 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