能夠編寫代碼的代碼:代碼生成的利與弊

代碼生成的當前狀態

代碼生成的當前狀態是無處不在的(2019年春季)。
現在,代碼生成發生在軟件堆棧的每一層,前端

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

REST API的數量激增,致使在過去十年中針對各類編程語言和環境開發的API客戶端生成器種類繁多。
就像某種巨大的數字Turducken同樣,REST API及其生成的客戶端彷佛可以將任何事物鏈接到任何事物。
所以,讓咱們看一下代碼生成管理中涉及的火雞,鴨子和小雞……react

1.代碼重寫

自動編碼的一種普遍形式是代碼重寫-用於將一種語言版本的語法轉換爲另外一種語言,有時甚至徹底轉換爲另外一種語言。
例如,諸如Scala之類的語言其實是將您的代碼重寫爲與Java兼容的代碼。
著名的奇怪的Lombok項目基本上在您鍵入時重寫Java代碼,生成幻像方法,所以您能夠專一於出色。
就像Babel同樣,任何優秀的JavaScript開發人員均可以證實「編譯器」是如何將您的高級ES2017重寫爲已使用了10年的,與瀏覽器兼容的舊版JavaScript,所以您能夠編寫現代代碼,而沒必要擔憂瀏覽器的行爲方式。編程

讓計算機進行骯髒的工做??甜!api

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之類的代碼生成器通過發展,能夠克服過去的侷限性,同時將全部代碼生成技術中的最佳功能結合到現代開發工具中。app

代碼生成的優勢

  • 無需手動編碼=更少的錯誤
  • 實現更大,更復雜的模式可能節省大量時間
  • 簡單應用和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

相關文章
相關標籤/搜索