可以編寫程式碼的程式碼:程式碼生成的利與弊

  • 2019 年 11 月 7 日
  • 筆記

程式碼生成的當前狀態

程式碼生成的當前狀態是無處不在的(2019年春季)。
如今,程式碼生成發生在軟體堆棧的每一層,

  • 包括Java庫(如swagger CodeGen),
  • 最新的交叉編譯器/編譯器(如針對JavaScript應用程式的Babel)
  • 以及全棧生成器(如Starter StackGen(tm))

REST API的數量激增,導致在過去十年中針對各種程式語言和環境開發的API客戶端生成器種類繁多。
就像某種巨大的數字Turducken一樣,REST API及其生成的客戶端似乎能夠將任何事物連接到任何事物。
因此,讓我們看一下程式碼生成管理中涉及的火雞,鴨子和小雞……

1.程式碼重寫

自動編碼的一種廣泛形式是程式碼重寫-用於將一種語言版本的語法轉換為另一種語言,有時甚至完全轉換為另一種語言。
例如,諸如Scala之類的語言實際上是將您的程式碼重寫為與Java兼容的程式碼。
著名的奇怪的Lombok項目基本上在您鍵入時重寫Java程式碼,生成幻像方法,因此您可以專註於出色。
就像Babel一樣,任何優秀的JavaScript開發人員都可以證明「編譯器」是如何將您的高級ES2017重寫為已使用了10年的,與瀏覽器兼容的舊版JavaScript,因此您可以編寫現代程式碼,而不必擔心瀏覽器的行為方式。

讓電腦進行骯髒的工作??甜!

2.基於模板的生成

React生態系統在創建基於模板的應用程式框架(包括React的「 create-react-app」 CLI命令)方面特別活躍。
在整個軟體行業中,其他基於模板的程式碼生成也很普遍。HTML模板和流行的新靜態站點生成器通常利用流行的鬍鬚或車把模板引擎來利用模板解析。
在伺服器模板引擎(例如Velocity)以及基於伺服器的鬍鬚和車把實現中,吐出了預渲染的源文件(例如HTML和越來越多的JavaScript)。

3.運行時動態程式碼

模板並不是生成程式碼的唯一方法。
通過自省,例如Java和Java Reflection API等語言以及Ruby Metaprogramming,運行程式碼可以是「自我感知」的,一旦您的程式碼自我感知,構建真正動態應用程式的選項就會真正擴展。
在Starter,我們使用Java構建了StackGen生成器引擎,這意味著我們能夠使用便捷的JavaPoet庫來動態構建Java類文件,其中包括在運行時動態合成的功能。有趣的是,這些類可以在記憶體中編譯並由類載入器載入,而無需寫入磁碟。
他們說Java不是動態語言!
這種類型的動態生成的程式碼令人興奮,因為它不僅節省了我們手動編寫程式碼的時間和金錢,而且還提供了機會在運行時在應用程式中創建響應行為,而無需人工干預(可能基於AI決策)使我們的應用程式和數字體驗比以往更具吸引力和實用性。

但是生成的程式碼很爛!

不幸的是,軟體行業的歷史上充斥著程式碼生成器,無程式碼開發工具,所見即所得前端生成器的示例,並被似乎從未消亡的古老平台吐出的普遍的加密源程式碼恐怖所困擾(我正在尋找在您的DreamWeaver Ultradev上還是應該說Drumbeat 2000 ?!)。
當機器充滿了晦澀的技術和混亂的變數名時,誰想要處理機器吐出的程式碼?生成的昔日程式碼只是令人沮喪和悲傷,而您想要建立的任何東西都沒有。

幸運的是,時代變了

在2019年,工具和軟體開發的最佳實踐已經發展到人類和機器可以真正在中間相遇的地步。諸如APIcur.io,StackGen和Microsoft PowerApps之類的程式碼生成器經過發展,可以克服過去的局限性,同時將所有程式碼生成技術中的最佳功能結合到現代開發工具中。

程式碼生成的優點

  • 無需手動編碼=更少的錯誤
  • 實現更大,更複雜的模式可能節省大量時間
  • 簡單應用和PoC的快速上市周期
  • 穩定的基礎架構意味著更少的時間浪費
  • CI / CD友好,可以將程式碼生成作為步驟添加到任何CI管道或開發工作流程中
  • 端到端生成消除了處理多個源文件和文件類型時的錯誤
  • 可以將新功能集成到基礎模板中,以在單個構建中跨大型程式碼庫實現
  • 但這並不是說程式碼生成沒有缺點。

程式碼生成的缺點

  • 並非所有應用程式都將從程式碼生成中受益
  • 與手動選擇每個程式碼庫,模式和編碼樣式相比,程式碼生成更加不靈活
  • 對基礎模板的更改將推廣到所有生成的文件,因此更改必須高度兼容並經過全面測試
  • 生成的程式碼必須在程式碼庫中與開發人員程式碼仔細隔離- 存在覆蓋開發人員程式碼的風險,並且應該可以在不影響任何現有程式碼的情況下進行重新生成
  • 程式碼生成會增加一些複雜性-例如,要真正了解生成器並與之合作,您需要了解生成的程式碼及其原因-除了程式碼庫的常規問題之外
  • 編寫其他程式碼的編寫程式碼的思維模式可能會變得鬆散,尤其是在編寫生成其他應用程式的應用程式時

LCDP和將創新推向邊緣

LCDP(低程式碼開發平台)作為「無程式碼開發」的最新形式以及橋接高級用戶/ jr的新方法而受到關注。開發者差距。
隨著對新功能和新系統需求的增長,開發人員變得捉襟見肘,許多用戶被超載的Excel電子表格所束縛,或者由於各個級別的開發人員資源稀缺而根本沒有所需的軟體功能。
消費者SaaS解決方案可以完成許多一次性任務,但是一堆雜亂無章的Web應用程式和服務並不是滿足許多需求的可靠基礎。
另一方面,對於許多組織來說,昂貴的企業系統根本不是一個選擇。
除了節省開發成本外,授權「公民開發人員」在適當時構建自己的解決方案是LCDP價值主張的主要驅動力。
程式碼生成器直接位於解決方案域的中間。

使用OpenAPI和StackGen端到端生成

StackGen採用整體方法來生成程式碼-基於OpenAPI / Swagger模式。
開發從一開始就開始,重點是使用OpenAPI / Swagger設計出色的API 。
然後,該設計準則使您可以生成具有可預測行為的健壯堆棧,並使用此處的任何自定義邏輯和前端設計對其進行精確擴展。
為了達到這種靈活性,StackGen使用了3種程式碼生成步驟以及3種不同的實現方式。
系統的3個主要組件使用了多種生成技術:Swagger CodeGen,MyBatis生成的DAO和映射,以及即將到來的StackGen PRO,ReactJS前端生成。
Swagger CodeGen和StackGen React程式碼都使用Mustache從Mustache模板文件生成React內容。

  • Mustache
  • JavaPoet
  • Swagger CodeGen
  • MyBatis Generator

這種方法的優勢在於它是可插入的,並允許我們在運行時和編譯之前生成。
通過生成對開發人員友好的格式的高品質源程式碼,現代程式碼生成器在提供現代高度可擴展且健壯的基準程式碼庫的同時,使全棧開發人員的效率倍增。

關於作者

約翰·麥克馬洪(John McMahon)是Starter Inc.的首席執行官,該公司是Extentech Inc的創始人,並且多年來是StackGen,Sheetster,OpenXLS,ExtenXLS和眾多軟體項目的開發商。

翻譯原文

https://medium.com/bigdecimal/code-that-codes-pros-and-cons-of-code-generators-15b2e571281a