私は 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、もっと良い方法はありますか?