通過Rails外掛程式遵守迪公尺特法則

2021-09-16 18:15:17 字數 1693 閱讀 2653

迪公尺特法則(law of demeter),或者最少知識原則(principle of least knowledge),是軟體開發中的乙個設計準則。其基本觀點是給定的乙個物件,應該對除它之外的任何事物(包括它的子元件)的結構、屬性和行為知道得越少越好。dan manges希望來闡述這個概念以及在ruby中應用它的方式,特別是通過使用forwardable模組。luke redpath在書寫單元測試時使用mock和stub不小心違反了迪公尺特法則:

\u0026#xd;\n

class widgetscontrollercreateactiontest \u0026lt; test::unit::testcase

def setup

# usual rails controller test setup here

@user = mock('user')

user.stubs(:find).returns(@user)

end

def test_should_create_new_widget_for_parent_user_using_posted_widget_params

widgets_proxy = mock('association proxy')

@user.stubs(:widgets).returns(widgets_proxy)

# demeter's law violation here by using the widget_proxy through user object

widgets_proxy.expects(:create).with(:name =\u0026gt; 'my funky widget')

post :create, :widget =\u0026gt;

end\u0026#xd;\n

解決方案是在你所有的模型中增加乙個委託方法。但那會很快變得枯燥,這也是為什麼luke引入demeter's revenge(迪公尺特之復仇)外掛程式的原因,這個外掛程式會給你的has_manyhas_and_belongs_to_many關聯建立一組遵循迪公尺特法則的方法。

\u0026#xd;\n

# given a user that has_many widgets you'll be able to use:

user.build_widget(params) # =\u0026gt; user.widgets.build(params)

user.create_widget(params) # =\u0026gt; user.widgets.create(params)

# ...

\u0026#xd;\n

但是法則不是為了被違反才被制定的嗎?事實上如果乙個外掛程式能夠自動完成乙個所謂的「法則」,難道不會讓法則成為擺設嗎?

\u0026#xd;\n檢視英文原文:respect demeter's law through rails plugin

譯者簡介:孫向暉,兒子小名「豆豆」,常被人稱為「豆豆他爹」。2023年開始步入it行業,現任浪潮軟體質保中心副主任。專注於研究和實踐mda/up/uml/scm等相關技術在團隊中的大規模應用,對產品化的軟體專案管理、需求管理和配置管理略有心得。他的部落格為

參與infoq中文站內容建設,請郵件至

china-editorial[at]infoq.com。

rails外掛程式的安裝

通常情況下 莪們可以使用命令列來安裝 比如下面的例子 但有的時候網路不好或者乾脆被牆了 這招就不太好使了 需要掛 什麼的去官網下個zip包回來 怎麼安裝呢 超級簡單 放在專案目錄下的 vendor plugins就可以了 記得資料夾名稱要改成標準的名稱 然後再重啟一下伺服器 大功告成 rails外掛...

rails上傳檔案 非外掛程式

rails檔案上傳 除了通過 clip等外掛程式來上傳檔案之外,也可以不用外掛程式,用ruby的file模組中的方法來實現檔案上傳。一 控制器 在控制器中加入以下兩個方法,其中getfilename用來修改所上傳的檔名稱,在我所上傳的檔案中存在空格,會出現,系統找不到檔案的錯誤,所以將檔案中的空格去...

rails3 rmagick外掛程式用法

環境 ruby1.9.3 rails3.2 windows7 1.rmagick2.13.1外掛程式 在gemfile中新增 gem rmagick 2.13.1 執行bundle install 就可以安裝上rmagick 如果還是安裝不上,就用到請看部落格中wins7中的rmagick安裝說明 ...