Javaから来ている間にFacadeを慣用Rubyに実装しようとしています。私はRailsのActiveRecord
がクラスメソッドをfind_by(criteria)
のように使うのが好きで、そのタスクのリポジトリパターンは使用していないことがわかります。Rubyで慣用的にファサードを作成する
My Facadeは、特定のWebサービスをいくつかの方法でラップします。私のオリジナルのアイデアは、それが(模倣による学習)ActiveRecord
に似たAPIです作ることだった。
class MyEntity
# ....
def get_name
@loaded_name + @loaded_surname
end
def delete
@entity_access_service.delete(@id)
end
def save
@entity_access_service.save(@id, @loaded_name , @loaded_surname)
end
def self.find(id)
data = @entity_access_service.get_data_for(id)
MyEntity.new(data) #Or whatever way to populate my entity
end
end
これ、理論的には、偉大な仕事になります。
e = MyEntity.find(10)
p e.get_name
e.delete
または:
e = MyEntity.new(some stuff)
e.save
質問: save
とdelete
のインスタンスメソッドが動作するためには、私はいくつかが必要ですEntityAccessService
のインスタンスを取得する方法このインスタンスは、隔離された環境でテストするために模擬可能でなければなりません。それを行う正しい方法は何ですか?
私のテストは、できるだけシンプルで、奇妙なハックはありません。私が実装しようとしていることはかなり些細なようです。
私はそれを行うには、いくつかのオプションを考えています
は、アプリケーションで作成されたすべてのエンティティによって使用される
entity_access_service
を保持するクラスレベルの変数を持ちます。この場合、このフィールドはどこで初期化する必要がありますか?たとえば、class MyEntity @@entity_access_service = nil end # Somewhere else (where?): MyEntity.entity_access_service = MyEntityService.new(some_params_from_env)
このようにして、私のテストでは、最初にそれを初期化/模擬しなければならないでしょう。
1に似ていますが、クラスで初期化します。これは奇妙に見えます。特に、テストでENVパラメータがまったく入力されていないことがわかっている場合は、
entity_service
を設定するための追加のコンストラクタ/属性があります。save
にはこのフィールドが初期化されていないため、これは機能しません。Repository
クラスを作成します。これはかなりうまくいくでしょうが、Rubyの人々がそうでないようです。
また、メソッド定義とメソッド呼び出しの両方で空のかっこを省略することができます。 – Stefan
@Stefan Done :) – bezmax
あなたはあなたが*すべき*というわけではありません。それは、snake_caseの強い好みよりはるかに多くの意見/個人的な選択です。 –