可以編寫(xiě)代碼的代碼:代碼生成的利與弊
代碼生成的當(dāng)前狀態(tài)
代碼生成的當(dāng)前狀態(tài)是無(wú)處不在的(2019年春季)。
如今,代碼生成發(fā)生在軟件堆棧的每一層,
- 包括Java庫(kù)(如swagger CodeGen),
- 最新的交叉編譯器/編譯器(如針對(duì)JavaScript應(yīng)用程序的Babel)
- 以及全棧生成器(如Starter StackGen(tm))
REST API的數(shù)量激增,導(dǎo)致在過(guò)去十年中針對(duì)各種編程語(yǔ)言和環(huán)境開(kāi)發(fā)的API客戶端生成器種類繁多。
就像某種巨大的數(shù)字Turducken一樣,REST API及其生成的客戶端似乎能夠?qū)⑷魏问挛镞B接到任何事物。
因此,讓我們看一下代碼生成管理中涉及的火雞,鴨子和小雞……
1.代碼重寫(xiě)
自動(dòng)編碼的一種廣泛形式是代碼重寫(xiě)-用于將一種語(yǔ)言版本的語(yǔ)法轉(zhuǎn)換為另一種語(yǔ)言,有時(shí)甚至完全轉(zhuǎn)換為另一種語(yǔ)言。
例如,諸如Scala之類的語(yǔ)言實(shí)際上是將您的代碼重寫(xiě)為與Java兼容的代碼。
著名的奇怪的Lombok項(xiàng)目基本上在您鍵入時(shí)重寫(xiě)Java代碼,生成幻像方法,因此您可以專注于出色。
就像Babel一樣,任何優(yōu)秀的JavaScript開(kāi)發(fā)人員都可以證明“編譯器”是如何將您的高級(jí)ES2017重寫(xiě)為已使用了10年的,與瀏覽器兼容的舊版JavaScript,因此您可以編寫(xiě)現(xiàn)代代碼,而不必?fù)?dān)心瀏覽器的行為方式。
2.基于模板的生成
React生態(tài)系統(tǒng)在創(chuàng)建基于模板的應(yīng)用程序框架(包括React的“ create-react-app” CLI命令)方面特別活躍。
在整個(gè)軟件行業(yè)中,其他基于模板的代碼生成也很普遍。HTML模板和流行的新靜態(tài)站點(diǎn)生成器通常利用流行的胡須或車(chē)把模板引擎來(lái)利用模板解析。
在服務(wù)器模板引擎(例如Velocity)以及基于服務(wù)器的胡須和車(chē)把實(shí)現(xiàn)中,吐出了預(yù)渲染的源文件(例如HTML和越來(lái)越多的JavaScript)。
3.運(yùn)行時(shí)動(dòng)態(tài)代碼
模板并不是生成代碼的唯一方法。
通過(guò)自省,例如Java和Java Reflection API等語(yǔ)言以及Ruby Metaprogramming,運(yùn)行代碼可以是“自我感知”的,一旦您的代碼自我感知,構(gòu)建真正動(dòng)態(tài)應(yīng)用程序的選項(xiàng)就會(huì)真正擴(kuò)展。
在Starter,我們使用Java構(gòu)建了StackGen生成器引擎,這意味著我們能夠使用便捷的JavaPoet庫(kù)來(lái)動(dòng)態(tài)構(gòu)建Java類文件,其中包括在運(yùn)行時(shí)動(dòng)態(tài)合成的功能。有趣的是,這些類可以在內(nèi)存中編譯并由類加載器加載,而無(wú)需寫(xiě)入磁盤(pán)。
他們說(shuō)Java不是動(dòng)態(tài)語(yǔ)言!
這種類型的動(dòng)態(tài)生成的代碼令人興奮,因?yàn)樗粌H節(jié)省了我們手動(dòng)編寫(xiě)代碼的時(shí)間和金錢(qián),而且還提供了機(jī)會(huì)在運(yùn)行時(shí)在應(yīng)用程序中創(chuàng)建響應(yīng)行為,而無(wú)需人工干預(yù)(可能基于AI決策)使我們的應(yīng)用程序和數(shù)字體驗(yàn)比以往更具吸引力和實(shí)用性。
但是生成的代碼很爛!
不幸的是,軟件行業(yè)的歷史上充斥著代碼生成器,無(wú)代碼開(kāi)發(fā)工具,所見(jiàn)即所得前端生成器的示例,并被似乎從未消亡的古老平臺(tái)吐出的普遍的加密源代碼恐怖所困擾(我正在尋找在您的DreamWeaver Ultradev上還是應(yīng)該說(shuō)Drumbeat 2000 ??。?。
當(dāng)機(jī)器充滿了晦澀的技術(shù)和混亂的變量名時(shí),誰(shuí)想要處理機(jī)器吐出的代碼?生成的昔日代碼只是令人沮喪和悲傷,而您想要建立的任何東西都沒(méi)有。
幸運(yùn)的是,時(shí)代變了
在2019年,工具和軟件開(kāi)發(fā)的最佳實(shí)踐已經(jīng)發(fā)展到人類和機(jī)器可以真正在中間相遇的地步。諸如APIcur.io,StackGen和Microsoft PowerApps之類的代碼生成器經(jīng)過(guò)發(fā)展,可以克服過(guò)去的局限性,同時(shí)將所有代碼生成技術(shù)中的最佳功能結(jié)合到現(xiàn)代開(kāi)發(fā)工具中。
代碼生成的優(yōu)點(diǎn)
- 無(wú)需手動(dòng)編碼=更少的錯(cuò)誤
- 實(shí)現(xiàn)更大,更復(fù)雜的模式可能節(jié)省大量時(shí)間
- 簡(jiǎn)單應(yīng)用和PoC的快速上市周期
- 穩(wěn)定的基礎(chǔ)架構(gòu)意味著更少的時(shí)間浪費(fèi)
- CI / CD友好,可以將代碼生成作為步驟添加到任何CI管道或開(kāi)發(fā)工作流程中
- 端到端生成消除了處理多個(gè)源文件和文件類型時(shí)的錯(cuò)誤
- 可以將新功能集成到基礎(chǔ)模板中,以在單個(gè)構(gòu)建中跨大型代碼庫(kù)實(shí)現(xiàn)
- 但這并不是說(shuō)代碼生成沒(méi)有缺點(diǎn)。
代碼生成的缺點(diǎn)
- 并非所有應(yīng)用程序都將從代碼生成中受益
- 與手動(dòng)選擇每個(gè)代碼庫(kù),模式和編碼樣式相比,代碼生成更加不靈活
- 對(duì)基礎(chǔ)模板的更改將推廣到所有生成的文件,因此更改必須高度兼容并經(jīng)過(guò)全面測(cè)試
- 生成的代碼必須在代碼庫(kù)中與開(kāi)發(fā)人員代碼仔細(xì)隔離- 存在覆蓋開(kāi)發(fā)人員代碼的風(fēng)險(xiǎn),并且應(yīng)該可以在不影響任何現(xiàn)有代碼的情況下進(jìn)行重新生成
- 代碼生成會(huì)增加一些復(fù)雜性-例如,要真正了解生成器并與之合作,您需要了解生成的代碼及其原因-除了代碼庫(kù)的常規(guī)問(wèn)題之外
- 編寫(xiě)其他代碼的編寫(xiě)代碼的思維模式可能會(huì)變得松散,尤其是在編寫(xiě)生成其他應(yīng)用程序的應(yīng)用程序時(shí)
LCDP和將創(chuàng)新推向邊緣
LCDP(低代碼開(kāi)發(fā)平臺(tái))作為“無(wú)代碼開(kāi)發(fā)”的最新形式以及橋接高級(jí)用戶/ jr的新方法而受到關(guān)注。開(kāi)發(fā)者差距。
隨著對(duì)新功能和新系統(tǒng)需求的增長(zhǎng),開(kāi)發(fā)人員變得捉襟見(jiàn)肘,許多用戶被超載的Excel電子表格所束縛,或者由于各個(gè)級(jí)別的開(kāi)發(fā)人員資源稀缺而根本沒(méi)有所需的軟件功能。
消費(fèi)者SaaS解決方案可以完成許多一次性任務(wù),但是一堆雜亂無(wú)章的Web應(yīng)用程序和服務(wù)并不是滿足許多需求的可靠基礎(chǔ)。
另一方面,對(duì)于許多組織來(lái)說(shuō),昂貴的企業(yè)系統(tǒng)根本不是一個(gè)選擇。
除了節(jié)省開(kāi)發(fā)成本外,授權(quán)“公民開(kāi)發(fā)人員”在適當(dāng)時(shí)構(gòu)建自己的解決方案是LCDP價(jià)值主張的主要驅(qū)動(dòng)力。
代碼生成器直接位于解決方案域的中間。
使用OpenAPI和StackGen端到端生成
StackGen采用整體方法來(lái)生成代碼-基于OpenAPI / Swagger模式。
開(kāi)發(fā)從一開(kāi)始就開(kāi)始,重點(diǎn)是使用OpenAPI / Swagger設(shè)計(jì)出色的API 。
然后,該設(shè)計(jì)準(zhǔn)則使您可以生成具有可預(yù)測(cè)行為的健壯堆棧,并使用此處的任何自定義邏輯和前端設(shè)計(jì)對(duì)其進(jìn)行精確擴(kuò)展。
為了達(dá)到這種靈活性,StackGen使用了3種代碼生成步驟以及3種不同的實(shí)現(xiàn)方式。
系統(tǒng)的3個(gè)主要組件使用了多種生成技術(shù):Swagger CodeGen,MyBatis生成的DAO和映射,以及即將到來(lái)的StackGen PRO,ReactJS前端生成。
Swagger CodeGen和StackGen React代碼都使用Mustache從Mustache模板文件生成React內(nèi)容。
- Mustache
- JavaPoet
- Swagger CodeGen
- MyBatis Generator
這種方法的優(yōu)勢(shì)在于它是可插入的,并允許我們?cè)谶\(yùn)行時(shí)和編譯之前生成。
通過(guò)生成對(duì)開(kāi)發(fā)人員友好的格式的高質(zhì)量源代碼,現(xiàn)代代碼生成器在提供現(xiàn)代高度可擴(kuò)展且健壯的基準(zhǔn)代碼庫(kù)的同時(shí),使全棧開(kāi)發(fā)人員的效率倍增。
關(guān)于作者
約翰·麥克馬洪(John McMahon)是Starter Inc.的首席執(zhí)行官,該公司是Extentech Inc的創(chuàng)始人,并且多年來(lái)是StackGen,Sheetster,OpenXLS,ExtenXLS和眾多軟件項(xiàng)目的開(kāi)發(fā)商。