2012-01-29 17 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に移動することをお勧めします。あなたのコードは動作しますが、それは可能な限り厳密ではありません。 –

答えて

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

+0

@PragmaOnce、はい、あなたはモジュール内にモジュールを置くことができます –

+0

モジュールをモジュール内に置く簡単な方法はありますか?同じファイルですか? – 0xSina

0

すぐに分かるように、コードを整理するための「正しい方法」はありません。

ほとんどの主観的な読みやすさの微妙な違いがあります。あなたのクラスを整理する方法は、あなたのコードを宝石としてリリースする上で大丈夫です。通常、他の人々のプロジェクトには含まれないコードでは必要ありませんが、どちらも害はありません。

「自分の意図が何であるか分からないコードを読んでいる人にとって、これは理にかなっていますか?」

+3

"整理コードの「正しい方法」はありませんが、正しいですが、それを行うための「より正しい」方法があります。 「DRY」(「自分自身を繰り返さないでください」)に続いて、基底クラスで作業してからそれをサブクラス化するなど、特定の方向性を私たちに押しつける傾向があります。 OPコードはそのまま動作しますか?多分。それは良いかもしれない?はい。 –

1

私は、私はネットワーク機器をモデリングしています、仕事でいくつかのようなコードを持っています。

一般的な属性とメソッドを持つジェネリッククラスを定義するアプローチを取った。ジェネリックコンパレータ、さまざまなハードウェアモデルのサブクラスなど。サブクラスには、そのハードウェアの固有の属性と、その装置のインスタンスを別のものと初期化または比較するのに必要なすべてのサポートコードが含まれています。

別のメソッドと同様のメソッドを記述する必要があるとすぐに、そのコードをベースクラスに昇格して再利用する方法について考えました。これはしばしば私がパラメータを渡す方法を変更することを含み、仮パラメータを使う代わりに、ハッシュを使って最終的に必要なものを引き出し、メソッドインタフェースを制御したままにします。

基本クラスには多くのサブクラスがあるので、時間をかけてその基本クラスがどのように機能するかを考えておくことが重要です。サブクラスを追加すると、他のサブクラスを変更する必要があるため、ベースをリファクタリングする作業が難しくなります。私はいつも私がいくつかのブラインド路地を下っていることを知っているし、少しバックアップする必要がありますが、クラスが成熟するにつれてますます起こるはずです。

+0

ありがとうございました。パラメータとしてハッシュを使用すると、これはルビーコードの一般的なプラクティスですか?また、帽子のパフォーマンス上の問題はありますか? – 0xSina

+0

これは非常に一般的です。あなたはRubyが名前/値ペアのパスをオプションとして実際にうまく動作し、受信側でハッシュに変換されることがわかります。まともなRubyの本では、方法についてのセクションでそれについて議論する予定です。 –

関連する問題