
1. 編程語言
1.1. 仍然是一門語言
1.1.1. 以最清晰、最容易理解的方式傳遞資訊
1.2. 代碼的易讀性和易理解性在軟體中的重要性甚至更勝一籌
2. 領域特定語言DSL
2.1. 為了解決某個特定業務領域問題的一種自定義語言
2.1.1. 一種小型語言
2.1.2. 大多都不通用
2.1.3. 為某個特定領域定制化而生
2.2. 流暢式(fluent style)
2.2.1. 鏈接(chaining)方法
2.3. 別的底層實作細節都應該被隱藏
2.3.1. 以這種方式設計的DSL才是一個用戶友好的DSL
2.4. 產生原因
2.4.1. 溝通為王
2.4.1.1. 代碼應該能清晰地表達它的意圖
2.4.1.2. 被“非程式員”所理解
2.4.1.3. 領域專家才能及時加入以驗證代碼是否符合業務需求
2.4.2. 代碼只撰寫一次,但會被閱讀很多次
2.4.2.1. 代碼的可讀性對軟體的可維護性非常重要
2.5. 資產
2.5.1. 提升了你代碼的抽象層次
2.5.2. 使其能更加專注于業務目標
2.5.3. 具有更好的可讀性
2.6. 負擔
2.6.1. 獨立的代碼需要測驗和維護
2.7. 優點
2.7.1. 簡潔
2.7.1.1. 封裝了業務邏輯
2.7.2. 可讀性
2.7.3. 可維護性
2.7.4. 高層的抽象性
2.7.5. 專注
2.7.5.1. 專門為表述業務領域規則而設計的語言
2.7.6. 關注點隔離
2.7.6.1. 使用專用的語言描述業務邏輯使得與業務相關的代碼可以同應用的基礎架構代碼相分離
2.8. 缺點
2.8.1. 設計比較困難
2.8.2. 開發代價
2.8.2.1. 一項長期投資
2.8.3. 額外的中間層
2.8.3.1. 避免帶來性能問題
2.8.4. 要掌握的語言
2.8.5. 宿主語言的局限性
3. 外部DSL
3.1. 獨立DSL(stand-alone DSL)
3.2. 需要付出更大的代價
3.2.1. 從無到有進行創建,其語法與宿主語言幾乎完全無關
3.2.2. 設計DSL的語法
3.2.3. 實作決議器和執行器(evaluator)
4. 內部DSL
4.1. 需要暴露恰當的類和方法,以使代碼的撰寫邏輯更流暢
5. “多語言DSL”(polyglot DSL)
5.1. 介于內部DSL與外部DSL之間的解決方案
5.2. 可以在JVM上運行另一種通用編程語言
5.2.1. Scala
5.2.2. Groovy
6. DSL模式
6.1. 方法鏈接(method chaining)
6.1.1. 需要實作非常冗長的構建器
6.1.2. 為了將頂層構建器與底層構建器相融合,需要使用大量的膠水代碼
6.2. 嵌套函式DSL(nested function DSL)
6.3. 使用Lambda運算式的函式序列
6.3.1. 在DSL中使用方法參考

7. Java API中的小型DSL
7.1. 把Stream API當成DSL去操作集合
7.1.1. 可以對集合中的元素進行過濾、排序、轉換、歸并等操作
7.2. 將Collectors作為DSL匯總資料
8. DSL的實際應用
8.1. SQL是最通用且應用最廣泛的DSL
8.2. jOOQ
8.2.1. 一種SQL映射工具
8.3. Cucumber
8.3.1. 行為驅動開發(behavior-driven development, BDD)
8.3.2. 一種基于行為驅動的開發框架
8.4. Spring Integration
8.4.1. 一種實作企業集成模式的Spring擴展庫
9. 生成位元組碼
9.1. 匿名類
9.1.1. 編譯器會為每個匿名類生成一個新的.class 檔案
9.1.2. 檔案名通常以ClassName$1這種形式呈現
9.1.3. 生成大量的類檔案是不利的
9.1.3.1. 直接影回應用的啟動性能
9.1.4. 每個新的匿名類都會為類或者介面產生一個新的子型別
9.2. Lambda運算式
9.2.1. InvokeDynamic
9.2.1.1. Java7
9.2.1.2. 位元組碼指令
9.2.1.3. 創建額外的類現在被invokedynamic指令替代了
9.2.1.4. 用于支持運行于JVM上的動態型別語言
9.2.1.5. 將實作Lambda運算式的這部分代碼的位元組碼生成推遲到運行時
9.2.2. 將Lambda運算式的代碼體填入到運行時動態創建的靜態方法,就完成了Lambda運算式的位元組碼轉換
9.2.2.1. Lambda運算式的代碼塊到位元組碼的轉換由高層的策略變成了純粹的實作細節
9.2.2.2. 對無狀態非捕獲型Lambda,可以創建一個Lambda物件的實體,對其進行快取,之后對同一物件的訪問都回傳同樣的內容
9.2.2.3. 沒有帶來額外的開銷,沒有額外的欄位,也不需要進行靜態初始化
9.2.2.4. 沒有額外的性能開銷,因為這些轉換都是必須的,并且結果也進行了鏈接
9.2.2.4.1. 僅在Lambda首次被呼叫時需要轉換,其后所有的呼叫都能直接跳過這一步,直接呼叫之前鏈接的實作
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/544799.html
標籤:Java
上一篇:RabbitMQ中間件
