我試圖在Java中使用慣用Ruby來實現Facade。我可以看到Rails的ActiveRecord
喜歡使用類方法來處理像find_by(criteria)
這樣的事情,並且不使用Repository模式來執行該任務。在Ruby中慣用地創建門面
我的Facade用幾種方法包裝了一個特定的webservice。我最初的想法是做它的API類似ActiveRecord
(模仿學習):
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 params。
有一個額外的構造函數/屬性來設置
entity_service
。這將不起作用,因爲save
不會對此字段進行初始化。創建一個
Repository
類。這會工作得很好,但似乎不是Ruby人所做的。
你可以在方法定義和方法調用中都省略空括號。 – Stefan
@Stefan完成:) – bezmax
你*可*,這並不意味着你*應*。這是一個意見/個人選擇,而不是對snake_case的強烈偏好。 –