前面已經討論了何時該採用dsl,接下來就該談論什麼時候不該採用dsl,或者至少是使用dsl應注意的問題。
從根本上說,不使用dsl的唯一原因就是,在你的場景下,使用dsl得不到任何好處,或者,至少是dsl的好處不足以抵消構建它的成本。
雖然dsl在有些場合下適用,但同樣會帶來一些問題。總的來說,我認為通常是高估了這些問題,一般人們不太熟悉如何構造dsl,以及dsl如何適應更為廣闊的軟體開發圖景。還有,許多常提及的dsl問題混淆了dsl和模型,這也傷及了dsl的優勢。
許多dsl問題只是與某種特定dsl風格相關,要理解這些問題,我們需要深入理解這些dsl是如何實現的。所以,這些問題留待後面討論,在這裡,我們只看寬泛的問題,這同當前討論的問題是一致的。
在反對dsl的觀點中,我最常聽到的是稱為語言噪音的問題:擔心語言難於學習,因此,使用多種語言會比使用一種語言複雜得多。必須了解多種語言,會讓工作更為困難,新人加入的門檻也提公升了。
當人們談及這種擔心時,他們都會有一些共同的誤解。首先,他們通常混淆了學習一門dsl的心血與學習一門通用語言的心血。dsl遠比一門通用語言容易,因此,學習起來也要容易得多。
許多批評者知道這一點,但依然反對dsl,即便它們相對容易學習,在乙個專案上有多種dsl也增加了理解的難度。這裡的誤解在於,他們忘了一點,乙個專案總有一些複雜的地方,難於學習。即便不用dsl,**庫中仍然有許多需要理解的抽象。通常,這些抽象應該在程式庫里,以便於掌握。即使不必學習多種dsl,也不得不學習多個程式庫。
所以,真正的問題在於,相比於學習dsl底層模型而言,學習dsl會難多少。我認為,相對於理解模型而言,學習dsl 所增加的成本相當小。確實,因為dsl的的價值就在於,讓人們理解和使用模型更容易,所以使用dsl就應該能降低學習成本。
相對於底層的程式庫而言,dsl增加的成本並不大,但這始終是成本。**需要寫,尤其是還要維護。所以,同其他**一樣,它也要做好自己的本職工作。並非所有程式庫都值得用dsl封裝。如果命令–查詢api夠用,就沒有必要在上面提供額外的api。即便dsl有用,就邊界效應而言,構建和維護也需要花費太多的工作量。
dsl的可維護性是一項重要的考量因素。如果團隊中的大多數人都覺得難以理解,即使是一種簡單的內部dsl,也會帶來很大的麻煩。外部dsl更是讓許多人望而卻步,乙個直譯器就足以讓很多程式設計師打退堂鼓。
人們不習慣構建dsl,這也讓新增dsl的成本變得更高。人們要學習新技術。雖然不應該忽略這些成本,但我們也應該清楚,這個學習曲線的成本能夠分攤到未來使用dsl的過程中。
還有一點要清楚,dsl的成本大於構建模型的成本。任何複雜的地方都需要某種機制管理其複雜性,如果複雜到要考慮dsl,幾乎肯定複雜到可以從模型中獲益的程度。dsl有助於思考模型,降低構建成本。
這會帶來乙個相關問題,鼓勵使用dsl會導致構建出一堆糟糕的dsl。實際上,我盼著構建出一堆糟糕的dsl,就像有很多糟糕的命令–查詢api的程式庫一樣。問題在於,dsl會不會把事情弄得更糟。乙個好的dsl可以封裝乙個糟糕的程式庫,把它變得更易用(如果可能的話,我更願意修正程式庫本身)。糟糕的dsl對於構建和維護而言,就是浪費 資源,但這種說法對任何**都適用。
dsl的有用之處在於,它提供了一種抽象,我們可以基於這種抽象來思考領域問題。這種抽象非常有價值,我們更容易表述領域行為,效果遠勝於依據底層構造進行思考。
然而,任何抽象(包括dsl和程式庫)總是伴隨著風險─它可能讓我們「一葉障目,不見泰山」。有了這種「一 葉障目」的抽象,我們就會苦苦思索,竭盡全力把外部世界塞入抽象之中,而非另尋它路。我們常常會見到這種情況:遇到一種不符合抽象的事物,殫精竭慮地讓其符合,而不是修改抽象,讓抽象更容易接納新的行為。一旦我們滿意了這個抽象,覺得塵埃落定,「一葉障目」也就隨之而來。到這種時候,對於顛覆性的變化,難免心生憂慮。
「一葉障目」是任何抽象都會面臨的問題,不僅是dsl,但dsl可能讓這個問題變得更嚴重。因為dsl提供了一種更為舒適的方式操作抽象,一旦適應,更不願意做出改變。如果採用dsl與領域專家交流,問題可能會更嚴重,通常,他 們在習慣之後更不願意做出改變。
如同對待任何抽象一樣,應該視dsl為一種「不斷演化,尚未完結」的事物。
Kotlin領域特定語言(DSL)
一 dsl的概念 只在特定領域內使用的語言 例如 html gradle sql等等 特點 計算機程式語言 具有語言的表達能力 有限的表達能力 關注某個特定的領域 二 下面用dsl來寫乙個例子吧 需要下面五個類 三 建立乙個node節點的介面 package cn.kotliner.kotlin a...
DSL 領域特定語言 迷思
所謂領域專用語言 domain specific language dsl 其基本思想是 求專不求全 不像通用目的語言那樣目標範圍涵蓋一切軟體問題,而是專門針對某一特定問題的計算機語言。dsl之於程式設計師正如伽南地之於以色列人,是最初也是最終的夢想。幾乎自計算機發明伊始,人們就開始談論dsl使用d...
Kotlin領域特定語言(DSL)
一 dsl的概念 只在特定領域內使用的語言 例如 html gradle sql等等 特點 計算機程式語言 具有語言的表達能力 有限的表達能力 關注某個特定的領域 二 下面用dsl來寫乙個例子吧 需要下面五個類 三 建立乙個node節點的介面 package cn.kotliner.kotlin a...