2012-02-15 2 views
20

はあなたのために使用しての長所と短所は何ですか:Rubyのネームスペースに名前を付けるための好ましい方法(より良いスタイル)は何ですか?単数形か複数形か?

FooLib::Plugins 
FooLib::Plugins::Bar 

FooLib::Plugin 
FooLib::Plugin::Bar 

命名規則?そして、あなたは何を使うのでしょうか、何を使っていますか?コミュニティでより一般的に使用されるものは何ですか?

+1

モジュール(つまり、プラグインが)だけ名前空間を使用さ​​れていることを考えると、私は通常、モジュール内の新しいメソッドをオーバーライド.ORG /クラス/ ActiveRecord.html)、私はクラスに比べてモジュールの詳細複数の名前が(ページの後半では、名前空間を参照)がある参照してください。しかし、私は、Railsをいつ使うのか、そしていつ他のものを使うのかについて十分な経験はありません。 –

答えて

11

私にとってFooLib::Pluginsはモジュールのように見え、さまざまなプラグインクラスが保持される名前空間として使用されます。FooLib::PluginはFooLibプラグインのスーパークラスのようです。

FooLib::Plugins::Barでは、Barはプラグインの名前のようです。 FooLib::Plugin::Barでは、によって使用されるヘルパークラス、またはプラグインの名前であるかどうかは疑いがあります。 Pluginを想定し

+0

これは一般的な質問です。私がやっていることには付きません。私はこの話題についていくつかの考えを持っており、他の人がそれについて何を考えているのかを見たいと思っていました。 –

+0

何FooLib ::プラグイン::バー対FooLib ::プラグイン::バーはどうですか? - 2番目のオブジェクトはオブジェクト名のように見えます - > BarはFooLibのプラグインですが、最初はこの推論にあまり合いません。 –

+0

@Jeznet、私はちょうど私の答えを編集しました。 'クラスFooLib ::プラグイン::バー

4

は、基本クラスである:

  • class FooLib::Plugin::Bar < FooLib::Plugin

    これは私が使用してお勧めです。 BarFooLibおよびPluginであり、FooLib::Pluginを継承しています。また、自然に読み込む一般的なクラスの名前空間の下にネストFooLibライブラリが提供するプラグインを保持します:

    # Assign the Bar Plugin of the FooLib library to p. 
    p = FooLib::Plugin::Bar 
    

    私はあなたのライブラリーのためのサードパーティ製のプラグインを開発した場合、私は次のような構造を作成します。

    # Baz is a Plugin for the FooLib library provided by BarLib. 
    class BarLib::FooLib::Plugin::Baz < ::FooLib::Plugin 
    

    私はFooLib階層をミラーますが、BarLibさんの名前空間の下に。私はそれを直接拡張しません。

  • class FooLib::Plugins::Bar < FooLib::Plugin

    私はこの1つをも使用している、と私はそれが最も理にかなっていると思います。 BarFooLib::Pluginであり、FooLibによって提供されるPluginsの1つです。ただし、潜在的に不要なモジュールが作成されます。

    私はPluginsPlugins.addPlugins.allPlugins.loadedのようなメソッドを実装し、中央のプラグインリポジトリだった場合、これは素晴らしい選択だと思います。

    余分なモジュールを正当化できる場合に使用してください。

  • class FooLib::Plugins::Bar < FooLib::Plugins

    は私に多くの意味がありません。 BarPluginsのうちの1つで、FooLibの部分は正常です。ただし、Pluginsから継承しています。それは複数のプラグインから継承されていますか?私には奇妙に聞こえる。クラス名は不可能な何かを示唆するべきではありません。

+1

良い点が多く、+1。プラグインが共通の基底クラスから継承しない場合、 'FooLib :: Plugins'は非常に魅力的です。 –

1

一般的に、私が取る傾向にあるアプローチがある:プラグイン用

module Foo 
    module Plugin 
    class Base; end 
    end 
end 

class Foo::Plugin::Bar < Foo::Plugin::Base; end 

Baseクラスが慣例では、すべてのRubyOnRailsでの場所で見つかったコードベースだけでなく、他の多くの。 (例えば等ActiveRecord::BaseActionController::Base

IはFoo::Pluginが両方の基本クラスとプラグインの名前空間として使用される@Matheusモレイラのアプローチに同意しません。

これが慣例としなければならない行うべきではありません理由だけで機能的な理由 - Rubyコミュニティ1のモジュールよりも名前空間とクラスのあまり多くのインスタンスがあります。私が本当に別のクラスの名前空間として使用されるクラスを実際に見るのは、そのクラスの目的が名前空間クラスに対してプライベートであり、外部では使用されないときだけです。

15

用途:

module FooLib end 
module FooLib::Plugins end 
class FooLib::Plugins::Plugin; end #the base for plugins 
class FooLib::Plugins::Bar < FooLib::Plugins::Plugin; end 
class FooLib::Plugins::Bar2 < FooLib::Plugins::Plugin; end 

または別の言葉で:

module FooLib 
    module Plugins 
    class Plugin; end #the base for plugins 
    class Bar < Plugin; end 
    class Bar2 < Plugin; end 
    end 
end 

また、このようなファイルを整理:

- foo_lib/ 
    - plugins/ 
    - plugin.rb 
    - bar.rb 
    - bar2.rb 

これはhow Rails does itある(ので、これはRailsの道であります)。私。アソシエーション名前空間(すなわちAssociations::SingularAssociation)を継承するクラスの、そこからすべての関連付け、名前空間とAssociations::Association class見形成します。

1

私は第二のアプローチは、@jtrimによって概説でしょう。 //api.rubyonrails:[RailsのAPI](HTTPを見ることによって

module Foo 
    module Plugin 

    def self.included(base) 
     raise "cannot be included" 
    end 

    def self.extended(base) 
     raise "cannot extend" 
    end 

    def self.new(*args) 
     Base.new(*args) 
    end 

    class Base;end 
    end 
end 


base_plugin_obj = Foo::Plugin.new(...) 
関連する問題