2012-03-13 18 views
20

最近與同事討論了在Rails應用程序中設計和編碼模型的不同方法,使我跨越了DCI in the context of Rails什麼是DCI,它如何適應Rails?

但是,我似乎無法繞過整個概念,即使經過this example application

目前,我傾向於在編寫Rails應用程序時或多或少地使用「by the book」。

所以有一些事情,我想問問 -

  • 什麼是DCI當MVC一起在普通的舊MVC(和Rails的ActiveRecord的香草)來實現什麼是它的優勢是什麼?
  • 它如何在Rails中實現(換句話說,什麼是所有模塊)?

編輯

我想進一步擴大我在回報率的情況下的問題 - 建議用的模型和Rails的控制器之間的另一層抽象的意義?它在不同規模的應用中有多廣泛?

+0

你的問題是極其廣泛,有非常難以回答。有相當多的地方,你似乎還沒有完全明白DCI是如何更難回答DCI背景下的一些問題的。我可以幫助你與DCI的東西,如果這是目標,但你需要縮小範圍,然後 – 2012-03-28 13:12:43

+0

我最想知道什麼是* DCI。至於Rails的實現,一個簡單的例子甚至是兩行的解釋都會很棒。 – GeReV 2012-03-28 14:10:21

+0

偉大的問題。直到讀完這篇文章,我才知道我最近一直渴望的範例的名字。我一直在看我維護的代碼(我沒有寫),並思考「這需要什麼是數據和行爲之間的分類分離」。我想這正是DCI試圖去做的。 – 2012-03-28 17:37:29

回答

18

DCI是一個範例,因此不僅僅是一種設計應用程序的方法。這是一種思考建模和結構化代碼的方法。 DCI的一個重要組成部分是保持系統(領域模型)和系統的功能(功能)。 DCI不是解決與MVC相同的問題的另一種方法,因此您的第一個問題無法真正回答。您可以同時使用MVC和DCI,這不是巧合,因爲Trygve Renskaug是MVC和DCI的父親。他最近在谷歌組織的「對象組合」上回答了similar question

您鏈接的示例違反了一些基本概念,例如將角色保留爲上下文隱私,並且我實際上無法找到單個上下文,但這可能是因爲瀏覽代碼的時間很短。

我不知道RoR,所以我不能給你一個RoR例子,但是如果你去fullOO你會發現用不同語言編寫的例子,包括Ruby和Marvin爲DCI設計的第一語言。

編輯對於「什麼是DCI」這個問題,沒有簡單的答案。DCI是一個範例,就像OOP是一個範例。他們都具有相同的根源,回答上述問題與回答「什麼是對象定向編程」一樣複雜。由於DCI是面向對象的,事實更加複雜,所有主要面嚮對象語言的面向對象實際上都是面向類而不是面向對象的。 DCI旨在生成代碼,在運行時之間的交互在編譯時在代碼中可見,更一般地說,它試圖使代碼更易於推斷運行時行爲。我上面鏈接的site致力於解釋DCI的全部內容,並列出了許多語言的示例。紅寶石是其中之一

編輯有一個關於ruby和DCI的book它的方式。作者在對象組合和洞察力方面非常活躍

+0

我必須說fullOO上的Ruby例子看起來有點奇怪,例如使用線程變量。有沒有更接近習慣Ruby的DCI例子,還是僅僅是不可能的? – 2015-08-16 08:31:29

+0

@MatijsvanZuijlen具體哪個例子。其中一些是用寶石編寫的,有些是用純Ruby編寫的。該gem修復了一些問題,因爲Ruby不支持DCI的範圍規則,但是調試體驗有些缺乏使用該gem。純粹的Ruby例子違反了DCI的範圍規則,所以它們都是在RUby中近似於DCI的DCI,但它們都不是真正的DCI(因爲在Ruby中這是不可能的,儘管你可以變得非常接近) – 2015-08-16 15:58:34

+0

我只找到一個例子:http: //fulloo.info/Examples/RubyExamples/Dijkstra/DijkstraListing.html – 2015-08-18 07:22:27

5

有一本關於在Ruby/Rails中使用DCI的書(目前正在進行中):Clean Ruby。我強烈建議把自己放在通知清單上 - 我已閱讀了本書的部分內容,看起來好像真的是

DCI正在Rails世界獲得認可 - 在過去的3個月左右,已經有大量關於它的有趣的博客文章。

8

DCI的核心是它爲開發人員提供的認知工具。我不確定你是否看過所有優秀的講座,但我會盡力爲任何新概念的人提煉它的要點。它涉及將系統行爲從系統的交互域對象(數據實體或系統是什麼)中移出來,並將其作爲第一類公民調用對象之間的協作,方法是將行爲對象(系統所做的事)注入功能在一個用例適時的情況下。

認爲BDD。我們將行爲編碼爲不跨越許多對象,例如分佈在與持久層高度耦合的數據對象上的功能粒子,而是僅存在於用例(故事)中的內聚對象,以及將能力注入並協調這些啞數據對象的交互。像物理體系結構的純粹層次一樣,緩慢變化的數據對象不會隨着他們隨身攜帶的快速變化的功能實現而加載。相反,Ruby提供了在/僅在用例情況下需要時,可以在運行時輕鬆地將行爲注入到對象中的能力。

作爲ROR的一個例子,如果您有一個控制器操作涉及一個用例,其中有一個事件概率矩陣,其中大部分條目可能只在一小部分請求中被觸發,那麼實例化一個臃腫行爲網絡 - 對於數據的每個可能的用例來說,執行每個事件的知識都是不必要的。另外,無需在我的文本編輯器中深入瞭解18個文件,以瞭解該交互如何工作,並將所有邏輯完全抽象爲由上下文對象提供的接口中的模式,這也是一個明顯的優勢。

關於你關於控制器和模型之間的另一個抽象層的問題,我不確定你指的是哪一個。無論如何,是的。無論如何。沒問題。 Design patterns和Bob叔叔的'SOLID原則是OO設計中幾乎普遍接受的最佳實踐。這些都強烈地鼓勵在政策和實施之間鬆散耦合的抽象。它們都有助於避免羅馬帝國的精神崩潰,因爲它們提供了一個人人都能理解的共同框架。對我而言,DCI提供了相同類型的認知框架,但是爲了使系統更易於理解和有效處理,這是任何面向對象設計師的聖盃。

11

對於誰是想知道什麼DCI代表爲人民..

DCI代表Data Context Interaction

相關問題