距離全棧,你只差一個kotlinx

全棧不能保證一定能夠解決複雜的問題, 但卻能幫你打開解決複雜問題的大門.

距離全棧,你只差一個kotlinx

近些年,前端技術變得愈發複雜。這一趨勢除了導致全球變暖,也讓全棧開發的難度越來越大。


但是,阻礙一個後端開發去寫頁面的根本原因到底是什麼呢
我認為是開發環境的搭建,如果環境變量準備好,可以用自己平時使用的IDE直接寫代碼,刷新就能看效果,這事貌似可行。


那麼如何解決這個問題呢?
我覺得終極解決方案是用一門編程語言同時寫前後端代碼。


Kotlin配合DSL就可以。


DSL

DSL(Domain Specific Language),領域特定語言。專注於一個方面而特殊設計的語言。

比如SQL是數據庫領域的DSL。


特點

  1. 只描述和解決特定領域

優勢

  1. 語義更明確,直觀
  2. 可以屏蔽數據結構和技術細節,由領域專家編寫

缺點

  1. 額外的理解、學習成本
  2. 抽象設計難度高,需要平衡表現力和實現成本。


比如描述2天前的時間,你可以定義為
2 days ago

也可以是
new Date().before(2, DAY)


這又引出了DSL的2種分類


  • 內部(Internal)DSL,藉助宿主語言(如:Scala、Kotlin)實現。和提取函數方法不同,提供了一套更接近自然語言的語法表現形式
  • 外部(External)DSL,語言無關,需要自定義語法並實現解析器。比如 XMl、YAML

kotlin DSL

Kotlin 藉助 Lambda + Extensions擴展 來實現內部DSL


距離全棧,你只差一個kotlinx


expression函數的入參是一個Expression.() -> Unit類型的lambda。未簡化的代碼為


距離全棧,你只差一個kotlinx


簡化後藉助 Lambda argument should be moved out of parentheses 變為


距離全棧,你只差一個kotlinx


是不是有DSL內味了

kotlinx

距離全棧,你只差一個kotlinx

kotlinx.html 是一個通過DSL構造HTML的kotlin擴展庫。

本質上是通過kotlin定義好了一套htmlTag類。

DSL定義


距離全棧,你只差一個kotlinx


生成的HTML


距離全棧,你只差一個kotlinx


在此基礎上擴展並封裝UI組件,達到簡化開發成本的目的。比如


封裝bootstrap4的header資源引用


距離全棧,你只差一個kotlinx


封裝基於bootstrap4的dropdown


距離全棧,你只差一個kotlinx


封裝基於bootstrap4的table


距離全棧,你只差一個kotlinx


則View層代碼為


距離全棧,你只差一個kotlinx

瀏覽器效果


距離全棧,你只差一個kotlinx


通常table的最後一列為action列,所以table rows類型為List Unit>>,可以傳入html元素


距離全棧,你只差一個kotlinx

其他

Javalin

示例項目使用了Javalin

Javalin is more of a library than a framework. Some key points:

You don't need to extend anything

There are no @Annotations

There is no reflection

There is no other magic; just code.

想必你也聽得出是在影射哪個框架

結論

  1. kotlinx.html可以作為jsp、FreeMarker這類模板方案的替代,優勢是無需在兩種語法之間切換。
  2. 如果沒想清楚如何解決問題,那DSL不是一個好的選擇


分享到:


相關文章: