TOP
0
0
【23號簡體館日】限時三天領券享優惠!!
領域專用語言實戰(簡體書)
滿額折

領域專用語言實戰(簡體書)

人民幣定價:69 元
定  價:NT$ 414 元
優惠價:87360
缺貨無法訂購
相關商品
商品簡介
作者簡介
名人/編輯推薦
目次
書摘/試閱

商品簡介

DSL(領域專用語言)的要旨在于溝通。精心設計的DSL 可以以一種從外觀到內在都極為自然的方式,傳達出其所表示領域的本質和真意,幫助消除業務與技術的隔閡,促進項目干系人與程序員的溝通。
《領域專用語言實戰》不僅介紹如何使用DSL解決問題,還會使用Ruby、Groovy、Scala、Clojure等現代語言闡述DSL的設計與實現,針對這些語言所代表的不同編程范式深入討論其在DSL設計上的優劣。《領域專用語言實戰》共分三部分。第一部分定位DSL驅動開發環境,尋找其在應用程序架構中的用武之地,幫助程序員或架構師了解如何調整現有開發工具和技術,使之適應DSL驅動的新范式。第二部分帶你設計優秀的語義模型,使之成為上層語言抽象的有力后盾。該部分主要指導開發人員按照優秀抽象的設計原則搭建領域模型,由淺入深講解了DSL實現技術,如元編程、解析器組合子,以及ANTLR、Xtext等開發框架。第三部分主要展望未來趨勢,重點討論解析器組合子和DSL工作臺技術的發展前景。
《領域專用語言實戰》適合開發人員、架構師、領域用戶學習參考。

作者簡介

作者:(美國)戈施(Debasish Ghosh) 譯者:郭曉剛

Debasish Ghosh,Anshinsoft公司首席技術布道師,開發者推薦博客“Ruminations of a Programmer”的作者,ACM協會高級會員。他擁有跨國IT企業20余年工作經驗,擅長為各種客戶(無論是中小型公司還是財富500強企業)交付企業級解決方案,對自己將軟件設計和編程最佳實踐制度化而引以為傲,熱愛Java、Ruby、Scala、OO及函數式編程,關注DSL和NoSQL數據庫。
郭曉剛,大學肄業,有過兩次創業和創業失敗的經驗。從嵌入式硬件到企業軟件開發皆無所成。作為愛好的翻譯反倒堅持不輟,積攢了五六本獨譯、合譯的作品。長期在InfoQ中文站從事編輯工作,順帶磨練了技術觸覺和翻譯、寫作的技藝。現在家照顧本書拖稿期間出生的兒子。

名人/編輯推薦

《領域專用語言實戰》適合開發人員、架構師、領域用戶學習參考。

目次

第一部分 領域專用語言入門
第1章 初識DSL 2
1.1 問題域與解答域 2
1.1.1 問題域 3
1.1.2 解答域 3
1.2 領域建模:確立共通的語匯 4
1.3 初窺DSL 6
1.3.1 何為DSL 7
1.3.2 流行的幾種DSL 8
1.3.3 DSL的結構 10
1.4 DSL的執行模型 11
1.5 DSL的分類 13
1.5.1 內部DSL 13
1.5.2 外部DSL 14
1.5.3 非文本DSL 15
1.6 何時需要DSL 15
1.6.1 優點 16
1.6.2 缺點 16
1.7 DSL與抽象設計 17
1.8 小結 18
1.9 參考文獻 18
第2章 現實中的DSL 19
2.1 打造首個JavaDSL 20
2.1.1 確立共通語匯 21
2.1.2 用Java完成的首個實現 21
2.2 創造更友好的DSL 24
2.2.1 用XML實現領域的外部化 25
2.2.2 Groovy:更具表現力的實現語言 25
2.2.3 執行GroovyDSL 27
2.3 DSL實現模式 28
2.3.1 內部DSL模式:共性與差異性 29
2.3.2 外部DSL模式:共性與差異性 35
2.4 選擇DSL的實現方式 39
2.5 小結 41
2.6 參考文獻 42
第3章 DSL驅動的應用程序開發 43
3.1 探索DSL集成 44
3.2 內部DSL的集成模式 47
3.2.1 通過Java6的腳本引擎進行集成 48
3.2.2 通過DSL包裝器集成 52
3.2.3 語言特有的集成功能 59
3.2.4 基于Spring的集成 61
3.3 外部DSL集成模式 62
3.4 處理錯誤和異常 64
3.4.1 給異常命名 64
3.4.2 處理輸入錯誤 65
3.4.3 處理異常的業務狀態 66
3.5 管理性能表現 67
3.6 小結 68
3.7 參考文獻 68
第二部分 實現DSL
第4章 內部DSL實現模式 70
4.1 充實DSL“工具箱” 71
4.2 內嵌式DSL:元編程模式 72
4.2.1 隱式上下文和靈巧API 73
4.2.2 利用動態裝飾器的反射式元編程 78
4.2.3 利用buider的反射式元編程 83
4.2.4 經驗總結:元編程模式 85
4.3 內嵌式DSL:類型化抽象模式 86
4.3.1 運用高階函數使抽象泛化 86
4.3.2 運用顯式類型約束建模領域邏輯 93
4.3.3 經驗總結:類型思維 95
4.4 生成式DSL:通過模板進行運行時代碼生成 96
4.4.1 生成式DSL的工作原理 97
4.4.2 利用Ruby元編程實現簡潔的DSL設計 97
4.5 生成式DSL:通過宏進行編譯時代碼生成 100
4.5.1 開展Clojure元編程 100
4.5.2 實現領域模型 102
4.5.3 Clojure宏之美 103
4.6 小結 104
4.7 參考文獻 105
第5章 Ruby、Groovy、Clojure語言中的內部DSL設計 106
5.1 動態類型成就簡潔的DSL 107
5.1.1 易讀 107
5.1.2 鴨子類型 108
5.1.3 元編程——又碰面了 110
5.1.4 為何選擇Ruby、Groovy、Clojure 111
5.2 Ruby語言實現的交易處理DSL 112
5.2.1 從API開始 113
5.2.2 來點猴子補丁 115
5.2.3 設立DSL解釋器 116
5.2.4 以裝飾器的形式添加領域規則 119
5.3 指令處理DSL:精益求精的Groovy實現 123
5.3.1 指令處理DSL的現狀 123
5.3.2 控制元編程的作用域 124
5.3.3 收尾工作 127
5.4 思路迥異的Clojure實現 128
5.4.1 建立領域對象 129
5.4.2 通過裝飾器充實領域對象 130
5.4.3 通過REPL進行的DSL會話 134
5.5 告誡 135
5.5.1 遵從最低復雜度原則 135
5.5.2 追求適度的表現力 135
5.5.3 堅持優秀抽象設計的各項原則 136
5.5.4 避免語言間的摩擦 136
5.6 小結 137
5.7 參考文獻 138
第6章 Scala語言中的內部DSL設計 139
6.1 為何選擇Scala 140
6.2 邁向ScalaDSL的第一步 141
6.2.1 通過ScalaDSL測試Java對象 142
6.2.2 用ScalaDSL作為對Java對象的包裝 142
6.2.3 將非關鍵功能建模為ScalaDSL 142
6.3 正式啟程 142
6.3.1 語法層面的表現力 143
6.3.2 建立領域抽象 144
6.4 制作一種創建交易的DSL 147
6.4.1 實現細節 148
6.4.2 DSL實現模式的變化 152
6.5 用DSL建模業務規則 153
6.5.1 模式匹配如同可擴展的Visitor模式 153
6.5.2 充實領域模型 155
6.5.3 用DSL表達稅費計算的業務規則 157
6.6 把組件裝配起來 160
6.6.1 用trait和類型組合出更多的抽象 160
6.6.2 使領域組件具體化 161
6.7 組合多種DSL 162
6.7.1 擴展關系的組合方式 163
6.7.2 層級關系的組合方式 167
6.8 DSL中的Monad化結構 171
6.9 小結 175
6.10 參考文獻 176
第7章 外部DSL的實現載體 178
7.1 解剖外部DSL 179
7.1.1 最簡單的實現形式 179
7.1.2 對領域模型進行抽象 179
7.2 語法分析器在外部DSL設計中的作用 182
7.2.1 語法分析器、語法分析器生成器 183
7.2.2 語法制導翻譯 184
7.3 語法分析器的分類 190
7.3.1 簡單的自頂向下語法分析器 191
7.3.2 高級的自頂向下語法分析器 192
7.3.3 自底向上語法分析器 193
7.4 工具支持下的DSL開發——Xtext 194
7.4.1 文法規則和大綱視圖 195
7.4.2 文法的元模型 197
7.4.3 為語義模型生成代碼 198
7.5 小結 201
7.6 參考文獻 202
第8章 用Scala語法分析器組合子設計外部DSL 203
8.1 分析器組合子 204
8.1.1 什么是分析器組合子 205
8.1.2 按照分析器組合子的方式設計DSL 206
8.2 Scala的分析器組合子庫 207
8.2.1 分析器組合子庫中的基本抽象 208
8.2.2 把分析器連接起來的組合子 209
8.2.3 用Monad組合DSL分析器 213
8.2.4 左遞歸DSL語法的packrat分析 214
8.3 用分析器組合子設計DSL的步驟 217
8.3.1 第一步:執行文法 218
8.3.2 第二步:建立DSL的語義模型 219
8.3.3 第三步:設計Order抽象 220
8.3.4 第四步:通過函數施用組合子生成AST 221
8.4 一個需要packrat分析器的DSL實例 223
8.4.1 待解決的領域問題 223
8.4.2 定義文法 225
8.4.3 設計語義模型 227
8.4.4 通過分析器的組合來擴展DSL語義 229
8.5 小結 231
8.6 參考文獻 231
第三部分 DSL開發的未來趨勢
第9章 展望DSL設計的未來 234
9.1 語言層面對DSL設計的支持越來越充分 235
9.1.1 對表現力的不懈追求 235
9.1.2 元編程的能力越來越強 237
9.1.3 S表達式取代XML充當載體 237
9.1.4 分析器組合子越來越流行 238
9.2 DSL工作臺 238
9.2.1 DSL工作臺的原理 239
9.2.2 使用DSL工作臺的好處240
9.3 其他方面的工具支持 241
9.4 DSL的成長和演化 242
9.4.1 DSL的版本化 242
9.4.2 DSL平穩演化的最佳實踐 242
9.5 小結 244
9.6 參考文獻 244
附錄A 抽象在領域建模中的角色 246
A.1 設計得當的抽象應具備的特質 246
A.1.1 極簡 247
A.1.2 精煉 247
A.1.3 擴展性和組合性 247
A.2 極簡,只公開對外承諾的 247
A.2.1 用泛化來保留演化余地 248
A.2.2 用子類型化防止實現的泄露 248
A.2.3 正確實施實現繼承 249
A.3 精煉,只保留自身需要的 250
A.3.1 什么是非本質的 250
A.3.2 非本質復雜性 250
A.3.3 撇除雜質 251
A.3.4 用DI隱藏實現細節 252
A.4 擴展性提供成長的空間 253
A.4.1 什么是擴展性 253
A.4.2 mixin:滿足擴展性的一種設計模式 254
A.4.3 用mixin擴展Map 255
A.4.4 函數式的擴展性 256
A.4.5 擴展性也可以臨時抱佛腳 256
A.5 組合性,源自純粹 257
A.5.1 用設計模式滿足組合性 257
A.5.2 回歸語言 259
A.5.3 副作用和組合性 260
A.5.4 組合性與并發 262
A.6 參考文獻 262
附錄B 元編程與DSL 設計 263
B.1 DSL中的元編程 263
B.1.1 DSL實現中的運行時元編程 264
B.1.2 DSL實現中的編譯時元編程 265
B.2 作為DSL載體的Lisp 268
B.2.1 Lisp的特殊之處 268
B.2.2 代碼等同于數據 269
B.2.3 數據等同于代碼 269
B.2.4 簡單到只分析列表結構的語法分析器 270
B.3 參考文獻 271
附錄C Ruby語言的DSL相關特性 272
C.1 Ruby語言的DSL相關特性 272
C.2 參考文獻 275
附錄D Scala語言的DSL相關特性 276
D.1 Scala語言的DSL相關特性 276
D.2 參考文獻 279
附錄E Groovy語言的DSL相關特性 280
E.1 Groovy語言的DSL相關特性 280
E.2 參考文獻 282
附錄F Clojure語言的DSL相關特性 283
F.1 Clojure語言的DSL相關特性 283
F.2 參考文獻 285
附錄G 多語言開發 286
G.1 對IDE的特性要求 287
G.2 搭建Java和Groovy的混合開發環境 287
G.3 搭建Java和Scala的混合開發環境 288
G.4 常見的多語言開發IDE 288
索引 290

書摘/試閱



依次引導你用這三種語言分別實現一個完整的DSL。這期間我們會討論每種語言中常用于DSL設計的主要特性,同時介紹選取正確實現模式的若干原則和思路。
閱讀完本章,你對于如何在具有類似特性的語言中開展DSL設計工作將有一個全面的認識。經過多個完整的DSL實現過程,你將學會從目標DSL的角度去思考,學會按照設計意圖把實現語言編排成你希望提供給用戶的DSL語法。
本章涉及大量編程實踐。請你把相應語言的解釋器都找出來,準備好迎接大量代碼。我們的例子都比較簡短明了,保證不會讓你厭煩。本書附錄為三種語言都準備了簡單的復習資料,如果你對哪種語言不太熟悉,不妨翻看一下作為熱身。如果你對多語開發,即同時使用多種語言進行開發的概念感到陌生,附錄G可以作為入門介紹。下面我們就從選擇這三種語言的理由說起。
5.1 動態類型成就簡潔的DSL
內部DSL將領域語義呈現為更易讀的形式,這是內部DSL在實現語言上面增加的一種重要性質。內部DSL用領域用戶能明白的語句、語匯向用戶解釋實現的含義。
當沒有程序員背景的領域專家閱讀一段DSL腳本時,他應該能夠讀懂其中的領域規則。能夠疏通開發者與領域從業者之間的溝通渠道,就是DSL的真正價值。我不鼓吹讓每個非程序員背景的領域專家都能用DSL編寫程序,但至少應該做到讓領域專家能夠理解DSL腳本中的領域語義。
動態類型語言寫成的程序不帶類型標注,這本身就減少了視覺上的干擾,可以更清楚地說明編程者的意圖。這樣寫出來的代碼可讀性較好,而易讀性正是DSL區別于一般APl的基本特質之一。我會用下面幾節說明用動態類型語言開發出來的DSL所具備的三大重要特質:
更易讀,因為沒有類型標注的干擾(5.1.1節);
鴨子類型,涉及DSL接口契約的設計思路(5.1.2節);
元編程,從DSL實現中清除死板代碼的一種方式(5.1.3節)。
5.1.1 易讀
DSL的讀者都希望語言自然流暢,不愿意其中摻人不必要的復雜內容。編程語言的類型系統有可能助長DSL的非本質復雜性。如果你用了一種類型系統像JaVa那么瑣細的實現語言,很可能最后出來的DSL要在抽象身上附加一串不必要的類型標注。動態類型語言不要求提供類型標注,所以相比同等情況下的靜態類型語言實現,能更清楚地表達編程者的意圖。至于意圖背后的實現,倒不一定更容易理解。(5.5節將討論基于動態語言的DSL實現中的常見陷阱,屆時你會看到這方面的例子。)總體而言,動態類型語言的語法較為簡明,制作出來的DSL及其實現也因此較為易讀。

您曾經瀏覽過的商品

購物須知

大陸出版品因裝訂品質及貨運條件與台灣出版品落差甚大,除封面破損、內頁脫落等較嚴重的狀態,其餘商品將正常出貨。

特別提醒:部分書籍附贈之內容(如音頻mp3或影片dvd等)已無實體光碟提供,需以QR CODE 連結至當地網站註冊“並通過驗證程序”,方可下載使用。

無現貨庫存之簡體書,將向海外調貨:
海外有庫存之書籍,等候約45個工作天;
海外無庫存之書籍,平均作業時間約60個工作天,然不保證確定可調到貨,尚請見諒。

為了保護您的權益,「三民網路書店」提供會員七日商品鑑賞期(收到商品為起始日)。

若要辦理退貨,請在商品鑑賞期內寄回,且商品必須是全新狀態與完整包裝(商品、附件、發票、隨貨贈品等)否則恕不接受退貨。

優惠價:87 360
缺貨無法訂購