這篇文章的草稿差不多在我的 todo 列表裡躺了一年,直到最近,看到我的同事在吐槽手動創建步驟的繁瑣性。我才想起來,我曾經想寫一篇這樣的文章,但是我在我的博客( https://www.phodal.com ) 上找了好久,也沒有發現。然後,我終於在我的 To-Do 應用中看到了它的身影。
雖然說是模式總結,到底只是個人經驗。受限於個人經驗,可能有些許的不足之處。若是各位讀者願意指出來,那自然感激不盡。
開發過程:IDE 代碼片段『精選』
IDE 代碼片段『精選』即在 IDE/編輯器中,通過插件或者內置組件,對特定語言、框架、技術等提供自動化的代碼填寫。
代碼集這個東西,自然比較是比較有意思的。在我們的日常開發中,我們經常會使用到,它的名字有多樣多樣,如
AutoComplete
Snippets
智能感知
……
它倒也沒有什麼特別之處,在我們輸入一些詞的時候,給我們建議,如在 IDE 裡輸入 <code>list.for/<code>,過程中就可以生成如下的代碼:
<code>for(iteminlist) {/<code>
<code>}/<code>
嗯,就這麼簡單,是不是經常使用到。
開發過程:語言、框架抽象 DSL
語言抽象 DSL,即通過編輯器、IDE 內置對於語言和框架的抽象,使開發人員可以通過編寫 DSL 便可以生成特定語言的代碼。
它特別適合於編寫簡單的模板代碼,如 HTML、XML 等。作為一個開發人員,那麼最常看到的例子就是 Zen Coding/Emmet,這個東西非常炫,輸入 <code>ul>li*5>a[href="#"]/<code>,然後按一下 tab,你就可以快速生成如下的代碼:
嗯,它特定適合於編寫結構化的代碼格式。
創建時:模板化代碼生成
模板化代碼生成,即在代碼 or IDE 中內置特定系統、團隊的代碼範式,隨後通過特定的參數,來生成適合於該團隊和該系統的代碼。
考慮到前端領域創建模板的複雜性,創建的過程中,需要同時創建 <code>*.component.scss/<code>、<code>*.component.spec.ts/<code>、<code>*.compnent.ts/<code>、<code>*.component.html/<code>,所以在前端領域非常之流行。最簡單來說,Angular 開發人員通過<code>ng g/<code>就可以生成各式各樣的代碼。
事實上,我覺得對應於後端開發也是如此,畢竟創建一個 CRUD API 可能需要 <code>model/<code>、<code>repository/<code>、<code>api/<code>、<code>service/<code>等。不過,依我的觀察來看,後端開發人員一般都沒有 GET 到這項技能,因為 gradle 太 TM 難用了。
儘管,大部分框架都自帶了類似的生成器,但是大多數時候,都得自己擼一個適合於架構的模板。所以,這裡推薦一下適用於前後端的框架。
Angular Schematics
Schematics 是前端開發工作流工具,例如:創建一個組件、變更配置項至當前項目,並且不限制任何語言環境。
Plop
Plop 是一個微型生成器框架。它提供了一種以一致的方式生成代碼或任何其他類型的純文本文件的簡單方法。
嗯,這兩個框架,大家自己瞭解一下。
創建時:DSL 生成代碼
DSL 生成代碼,顧名思義就是通過 DSL 的方式,來生成代碼,再集成到系統中開發。
最常見的一個例子就是我最近使用基於 Antlr 編寫的 Chapi,便是這種模式。又或者是,對於一些模式化的開發的系統來說,它們也是通過類似的方式來生成大量的模板。
注意:通過這種模式生成的代碼,往往是不會進行二次開發的。因為隨著引擎的更新,這些代碼會被覆蓋住,導致難以維護。
如 Antlr 這樣的框架,只需要通過: <code>antlr -Dlanguage=Java -listener -visitor CPP.g4 -o chapi/ast/antlr -package chapi.ast.antlr/<code>編譯生成到指定的目錄。於是乎,我們就可以<code>import chapi.ast.antlr/<code>,集成到系統中使用。
構建時:DSL / 代碼生成代碼
構建時代碼生成代碼,即在構建的時候,才進行代碼生成。
對於穩定的系統來說,可以只在構建時才運行代碼生成。平時的時候,都是通過生成臨時代碼的方式。嗯,常見的 Angular 框架就是類似的方式運行的。
在開發的過程中,我們都是通過編碼 DSL 或者是一種不同於最終運行語言來編寫的。
運行時:元編程
元編程(Metaprogramming)是指某類計算機程序的編寫,這類計算機程序編寫或者操縱其他程序(或者自身)作為它們的數據,或者在運行時完成部分本應在編譯時完成的工作。
這一點大家都很熟了,我就不再重複描述了。
未來
隨著,無代碼編程/低代碼編程越來越流行,代碼生成的基礎架構來越來越火。