0

私は Ruby 初心者で、コードを適切に構築する方法を見つけるのに少し苦労しています。

コードベースには、次の読み取りに使用される Couch モジュールがあります。

module Couch
  def self.client
    @client ||= Couchbase.new "http://#{DATABASE_HOST}:8091/pools/default"
  end
end

データベースにアクセスする必要があるたびに、次のようにします。

Couch.client.get(...)
Couch.client.set(...)

例えば ​​:

def Model

  def self.find(id)
    Couch.client.get("foo:#{id}")
    ...
  end

  def save
    Couch.client.set("foo:#{@id}", {...})
  end
end

あちこちで Couch.client の繰り返しと静的なものが私を不快にさせていました。それは ruby​​ のやり方ではないと感じました。

そこで、Couchモジュールを次のように変更しました

module Couch
  extend Forwardable

  def_instance_delegators :client, :get, :set, :delete, :append

  def client
    @@client ||= Couchbase.new "http://#{hostname}:8091/pools/default"
  end
end

そしてそれを使いたいモデルクラスで

def Model
  extend Couch

  def self.find(id)
    get("foo:#{id}")
    ...
  end

  def save
    Model.set("foo:#{@id}", {...})
  end
end

私はそれがより良いと思いますが、私はそれがどのように見えるかに完全に満足していないことを認めなければなりません...:get私のモデルにクラスメソッドを持っても大丈夫ですか? 名前は少し紛らわしいです。モジュールを含める必要がありますか (たとえば、ClassMethods サブモジュールを使用して) ? クラス変数を回避できますか@@client(ただし、インスタンスごとに新しい接続を作成したくありません)?

Bref、もっと良い方法はありますか?

4

2 に答える 2

1

http://github.com/couchbase/couchbase-ruby-modelとcouchbase-modelrubygem自体を見てください。それは汚い仕事のほとんどをします。また、アイデアやパッチがあれば、喜んでレビューさせていただきます。私はgerritコードレビューを使用しているので、最新のパッチはここにありますhttp://review.couchbase.org/#/q/status:open+project:couchbase-ruby-model,n,z

于 2012-10-20T03:33:16.540 に答える
1

私はそれがより良いと思いますが、私はそれがどのように見えるかに完全に満足していないことを認めなければなりません... 私の Model に :get クラスメソッドを持っても大丈夫ですか? 名前は少し紛らわしいです。モジュールを含める必要がありますか (たとえば、ClassMethods サブモジュールを使用して) ? クラス変数 @@client を回避できますか (ただし、インスタンスごとに新しい接続を作成したくありません)?

getモデルにクラス メソッドを含める必要はないと思います。意味がないというのは正しい。

あなたの元の方法は私にはとても良さそうです。

明示的ですが、冗長すぎません。コードが何をするのか、誰でも簡単に理解できます。

于 2012-10-19T12:32:38.527 に答える