低代碼核心:代碼生成還是模型解釋?(低代碼原理)
2020年第一屆低代碼研討會(huì)上, Jordi Cabot發(fā)表了一篇文章(或者說(shuō)觀點(diǎn)),對(duì)比了低代碼和模型驅(qū)動(dòng)開(kāi)發(fā)的關(guān)系,認(rèn)為低代碼等于模型驅(qū)動(dòng)開(kāi)發(fā)。但實(shí)際上,不少低代碼系統(tǒng)并不是使用模型驅(qū)動(dòng)的,而是采用另一個(gè)策略,即代碼生成。那這兩者區(qū)別是什么,各有什么優(yōu)勢(shì), 本文會(huì)詳細(xì)介紹。
關(guān)于代碼生成和模型解釋
在模型驅(qū)動(dòng)開(kāi)發(fā)中,代碼生成用于從更高級(jí)別的模型生成代碼,以創(chuàng)建可運(yùn)行的應(yīng)用程序。讓我們考慮下面這個(gè)使用領(lǐng)域特定語(yǔ)言(Domain-Specific Language, DSL)創(chuàng)建的領(lǐng)域模型:
Customer { Name: String; Address: String;}
如果我們想為這個(gè)小模型生成Java代碼,我們可以使用模板引擎。模板包含Java代碼和一些Token,這些Token將根據(jù)模型來(lái)填充。例如,我們可以為域模型中的每個(gè)實(shí)體使用模板。模板代表一個(gè)Java類,實(shí)體的名稱作為類名(例如客戶)。對(duì)于每個(gè)屬性,將生成一個(gè)私有字段。
在模型解釋的情況下,我們不會(huì)通過(guò)生成代碼的方式來(lái)從模型中創(chuàng)建一個(gè)可運(yùn)行軟件應(yīng)用程序。在模型解釋中,我們會(huì)使用一個(gè)(比如)Java實(shí)現(xiàn)的通用引擎用,模型直接由這個(gè)引擎來(lái)解釋。例如,這個(gè)通用的Java程序中包含一個(gè)帶有屬性name的類Entity和一個(gè)包含該實(shí)體屬性(name-value對(duì))的hashmap。在這種情況下,客戶實(shí)體不是由Java類表示的,而是由一個(gè)帶有屬性名稱的Entity對(duì)象表示的,該屬性name的值是Customer。這些實(shí)體對(duì)象是根據(jù)模型中的信息創(chuàng)建的。
代碼生成和模型解釋都在實(shí)踐中使用。讓我們來(lái)看看這些方法相互比較的優(yōu)勢(shì)。
代碼生成的優(yōu)勢(shì)
與模型解釋相比,代碼生成具有以下優(yōu)點(diǎn):
- 它保護(hù)你的知識(shí)產(chǎn)權(quán):通過(guò)代碼生成,你可以為特定的客戶端生成一個(gè)應(yīng)用程序。當(dāng)使用模型解釋時(shí),你必須給把整個(gè)運(yùn)行時(shí)引擎給客戶,這樣才能實(shí)現(xiàn)整個(gè)應(yīng)用。例如,如果要構(gòu)建一個(gè)網(wǎng)站,你可以把運(yùn)行網(wǎng)站所需的所有代碼給到客戶即可。而如果使用解釋器,你必須給他們整個(gè)系統(tǒng)來(lái)解釋任何可以用你的DSL描述的網(wǎng)絡(luò)應(yīng)用。當(dāng)您的產(chǎn)品有大量客戶的時(shí)候,這一點(diǎn)尤其重要。
- 它可以適應(yīng)您的客戶架構(gòu):當(dāng)使用模型解釋時(shí),您必須按照自己選擇的架構(gòu)實(shí)現(xiàn)解釋器。在代碼生成的情況下,您可以根據(jù)客戶的要求來(lái)生成代碼。
- 生成的實(shí)現(xiàn)更容易理解:您可以查看生成的代碼并直接理解應(yīng)用程序的行為。在模型解釋的情況下,您必須理解解釋器的通用實(shí)現(xiàn)和模型的語(yǔ)義。
- 更容易上手:如果您已經(jīng)手工構(gòu)建了一個(gè)應(yīng)用程序,您可以開(kāi)始使用代碼生成,方法是將現(xiàn)有代碼轉(zhuǎn)換為模板,并用token替換部分代碼,token將被模型信息替換。如果您為同一個(gè)領(lǐng)域構(gòu)建了多個(gè)應(yīng)用程序(例如,為不同的客戶),您可以開(kāi)始分析這些應(yīng)用程序。靜態(tài)代碼(即所有應(yīng)用程序的代碼都是相同的)可以放在域框架中,只需要生成可變代碼即可(即您需要?jiǎng)?chuàng)建域特定語(yǔ)言來(lái)建??勺冃裕?/li>
- 它更容易迭代:正如前面所解釋的,您可以通過(guò)將現(xiàn)有代碼轉(zhuǎn)換為代碼生成模板來(lái)開(kāi)始使用代碼生成。當(dāng)然,您可以通過(guò)迭代的方式做到這一點(diǎn)。首先,您只生成代碼的一部分,其他部分將手動(dòng)實(shí)現(xiàn),稍后,您可以擴(kuò)展代碼生成器以生成代碼的更多部分。您的DSL也是如此。起初,它可以是初級(jí)的,以反映將要生成的代碼。以后,您可以通過(guò)提高抽象級(jí)別來(lái)提升領(lǐng)域?qū)I(yè)能力。
- 編譯器為它提供了的附加的檢查能力:當(dāng)您生成代碼時(shí),需要編譯該代碼。這個(gè)編譯步驟是一個(gè)附加的檢查,因?yàn)榫幾g器將檢查生成的代碼是否有錯(cuò)誤。如果有解釋器,您需要在模型解釋期間自己進(jìn)行這些檢查,或者您需要在建模環(huán)境和解釋器之間創(chuàng)建一個(gè)緊耦合。
- 調(diào)試生成器本身比調(diào)試解釋器更容易:如果您需要調(diào)試解釋器,則始終需要條件斷點(diǎn),因?yàn)榻忉屍鞔a是通用的。
- 模板的變化更容易跟蹤:代碼生成模板只是文本文件,因此變化很容易跟蹤(例如通過(guò)使用版本控制系統(tǒng))。解釋器代碼的變化也是如此,但是,這段代碼是通用的,不容易搞清楚到底發(fā)生了什么變化。
模型解釋的優(yōu)點(diǎn)
與代碼生成相比,模型解釋具有以下優(yōu)點(diǎn):
- 它支持快速變更:模型中的更改不需要再次代碼生成、編譯、測(cè)試和重新部署。這將縮短上線時(shí)間。
- 它支持在運(yùn)行時(shí)進(jìn)行更改:因?yàn)槟P驮谶\(yùn)行時(shí)可用,所以甚至可以在不停止運(yùn)行應(yīng)用程序的情況下更改模型。
- 更容易移植:解釋器原則上創(chuàng)建一個(gè)獨(dú)立于平臺(tái)的目標(biāo)來(lái)執(zhí)行模型。創(chuàng)建一個(gè)運(yùn)行在多個(gè)平臺(tái)(例如多個(gè)操作系統(tǒng)、多個(gè)云平臺(tái))上的解釋器很容易。在代碼生成的情況下,您需要確保您生成的代碼符合平臺(tái)要求。在模型解釋的情況下,解釋器是一個(gè)黑匣子,只要它能在目標(biāo)平臺(tái)上運(yùn)行,如何實(shí)現(xiàn)并不重要。
- 更容易部署:當(dāng)使用代碼生成時(shí),您經(jīng)常會(huì)看到您需要在Eclipse或Visual Studio中打開(kāi)生成的代碼,并構(gòu)建它來(lái)創(chuàng)建最終的應(yīng)用程序。在模型解釋的情況下,您只需啟動(dòng)解釋器并將模型放入其中。代碼不再是必要的了。因此,對(duì)領(lǐng)域?qū)<襾?lái)說(shuō), 部署和運(yùn)行應(yīng)用程序比僅僅建模要容易得多。
- 更容易升級(jí)和縮放:更改解釋器并用相同的模型重新啟動(dòng)它更容易。您不必使用更新的生成器再次生成代碼。縮放也是如此:縮放應(yīng)用程序意味著初始化解釋器的更多實(shí)例,執(zhí)行相同的模型。尤其是在云環(huán)境中,這可以給你帶來(lái)優(yōu)勢(shì)。
- 它更安全:例如,在云平臺(tái)上,你只需要上傳你的模型,就不需要訪問(wèn)文件系統(tǒng)或其他系統(tǒng)資源。只有解釋器中的代碼可以訪問(wèn)系統(tǒng)庫(kù)。解釋器在基礎(chǔ)設(shè)施之上提供了一個(gè)額外的層,下面的一切都被抽象掉了。這本質(zhì)上是平臺(tái)即服務(wù)(PaaS)的想法。
- 它比代碼生成更靈活:基于模板的代碼生成是有限制的。在這種情況下,您將需要幫助文件來(lái)擴(kuò)展基于模板的代碼生成的可能性。在這種情況下,解釋器可能不那么復(fù)雜,通常需要更少的代碼來(lái)完成相同的結(jié)果。
- 在運(yùn)行時(shí)調(diào)試模型:雖然模型在運(yùn)行時(shí)可用,但可以通過(guò)在運(yùn)行時(shí)遍歷模型來(lái)調(diào)試模型(也就是說(shuō),您可以在模型上添加斷點(diǎn))。這僅適用于操作語(yǔ)言,而不適用于聲明性語(yǔ)言(在那里您需要靜態(tài)分析)。當(dāng)可以在模型級(jí)別調(diào)試時(shí),域?qū)<铱梢哉{(diào)試自己的模型,并根據(jù)此調(diào)試調(diào)整應(yīng)用程序的功能行為。這在使用復(fù)雜的過(guò)程或狀態(tài)模型時(shí)非常有幫助。
結(jié)論
比較這兩種方法的優(yōu)勢(shì),我們可以得出結(jié)論,最終這完全取決于構(gòu)建和/或使用模型驅(qū)動(dòng)軟件工廠的人員的領(lǐng)域、用例和技能集(或舒適性)。
當(dāng)我們討論代碼生成和模型解釋之間的區(qū)別時(shí),很快就會(huì)帶來(lái)更多的問(wèn)題:代碼生成和模型解釋之間有什么區(qū)別?這兩種方法之間的界限是什么?如果我們?cè)谏纱a時(shí)有一個(gè)內(nèi)存文件系統(tǒng)呢?如果我們通過(guò)編譯模型的一部分來(lái)優(yōu)化我們的解釋器呢?如果解釋器為瀏覽器生成數(shù)據(jù)庫(kù)結(jié)構(gòu)和網(wǎng)絡(luò)內(nèi)容呢?
好了,今天的文章分享到這就結(jié)束了,要是喜歡的朋友,請(qǐng)點(diǎn)個(gè)關(guān)注哦!–我是簡(jiǎn)搭(jabdp),我為自己“帶鹽”,感謝大家關(guān)注。