低代碼平臺(tái)業(yè)務(wù)模型設(shè)計(jì)(低代碼平臺(tái)業(yè)務(wù)模型設(shè)計(jì)方案)
前言
在低代碼平臺(tái)中,如果需要支持復(fù)雜模型多數(shù)情況下會(huì)要求具備模塊級(jí)別的源碼導(dǎo)出功能,獨(dú)立模塊可以導(dǎo)出為獨(dú)立運(yùn)行的原生代碼方便與業(yè)系統(tǒng)進(jìn)一步集成。在低代碼平臺(tái)相對(duì)成熟的今天,這一功能也成為了絕大多數(shù)商業(yè)企業(yè)級(jí)低代碼平臺(tái)的必備功能,本文將從模塊代碼導(dǎo)出的角度來(lái)聊一下,低代碼平臺(tái)的代碼出碼設(shè)計(jì)。
一,低代碼平臺(tái)常用出碼模式
在用戶完成基礎(chǔ)的視圖設(shè)計(jì)以及應(yīng)用邏輯編排后,通常需要將業(yè)務(wù)設(shè)計(jì)通過(guò)特定的方式轉(zhuǎn)化為可執(zhí)行的代碼及配置以便于仿真測(cè)試或者直接交付部署應(yīng)用。通常這個(gè)過(guò)程有以下幾種方式:
(1)模板模式(直接出碼為可執(zhí)行原生代碼)
早在低代碼相關(guān)技術(shù)誕生以前,代碼生成模式就風(fēng)靡于架構(gòu)設(shè)計(jì)圈子。由架構(gòu)師確立技術(shù)路線和代碼結(jié)構(gòu),通過(guò)framake等模板語(yǔ)言將數(shù)據(jù)庫(kù)或者通用配置批量的生成基礎(chǔ)代碼,然后交由程序員進(jìn)行二次加工。
這種方式優(yōu)點(diǎn)是:
簡(jiǎn)單易操作,一個(gè)稍有經(jīng)驗(yàn)的高級(jí)程序員即可完成整套的基礎(chǔ)模板設(shè)計(jì),在經(jīng)過(guò)模板輸出后可以大幅降低普通程序員的勞動(dòng)強(qiáng)度。
但缺點(diǎn)也很明顯:
首先由于模型設(shè)計(jì)過(guò)程中過(guò)于簡(jiǎn)單,缺少元數(shù)據(jù)以及元元數(shù)據(jù)屬性的支撐,在代碼生成時(shí)需要更高級(jí)的屬性支持時(shí)只能在模板中去豐富,這就造成代碼模板會(huì)被嚴(yán)重污染大幅降低通用性,在真實(shí)使用過(guò)程中往往會(huì)出現(xiàn)一個(gè)項(xiàng)目一套模板,甚至一個(gè)程序員都有一套自有模板的囧局。這使得項(xiàng)目可維護(hù)性大幅降低,另外代碼在生成后,多數(shù)情況下還需要進(jìn)行一些二次補(bǔ)充和修改。這個(gè)些過(guò)程中通常是不可逆的,這使得代碼生成只能在項(xiàng)目初始構(gòu)建的時(shí)候使用,對(duì)于功能擴(kuò)展或者代碼重構(gòu)都無(wú)法發(fā)揮其應(yīng)有的作用。
小結(jié):
單純的代碼生成模式如果純粹作為程序員或者微型項(xiàng)目組,作為代碼工具使用尚可,在早期低代碼平臺(tái)中也比較常見(jiàn)于各種行業(yè)模板等應(yīng)用,但隨著技術(shù)進(jìn)步,這種方式正在逐步被淘汰。
(2)引擎驅(qū)動(dòng)模式(出碼為DSL)
引擎驅(qū)動(dòng)模式最早來(lái)起源于“中間件”設(shè)計(jì),其設(shè)計(jì)目的是將大量具有通用意義的業(yè)務(wù)邏輯進(jìn)行抽象包裝,提供獨(dú)立的數(shù)據(jù)模型業(yè)務(wù)驅(qū)動(dòng)模式再根據(jù)業(yè)務(wù)特性,抽象出特定的DSL業(yè)務(wù)描述語(yǔ)言,例如:流程語(yǔ)言BPEL, 報(bào)表中延續(xù)的EXECL公式,數(shù)據(jù)庫(kù)的SQL語(yǔ)言等等。用戶通過(guò)DSL語(yǔ)言來(lái)描述業(yè)務(wù)結(jié)構(gòu)以及數(shù)據(jù)信息,然后將DSL交由引擎去執(zhí)行,從而有效實(shí)現(xiàn)業(yè)務(wù)與代碼的解耦。這種技術(shù)在低代碼平臺(tái)中應(yīng)用還是比較廣泛的,在企業(yè)級(jí)低代碼平臺(tái)應(yīng)用中更是標(biāo)配。
結(jié)構(gòu)組成
出碼實(shí)施過(guò)程
引擎模式優(yōu)點(diǎn):
引擎模式是將業(yè)務(wù)模型輸出為“DSL”這種中間語(yǔ)言,這種方式很好的解決了模型的二次維護(hù)與可逆性輸出,在通用性的功能以及技術(shù)細(xì)節(jié)處理也相對(duì)更完善,能給直接用戶帶來(lái)更好的使用感受,在項(xiàng)目的重構(gòu)以及后期維護(hù)方面也有不錯(cuò)的表現(xiàn)。
引擎模式缺點(diǎn):
(1)易用性缺失,對(duì)使用者技術(shù)要求太高:
引擎模式有著諸多的優(yōu)勢(shì),但在低代碼平臺(tái)除了需要強(qiáng)勁的功能支持以及擴(kuò)展性支持外,還需要兼顧其易用性,對(duì)于低代碼平臺(tái)的核心用戶主要還是定位在泛開發(fā)者而非專家型程序員。多引擎的設(shè)計(jì)會(huì)隨著引擎細(xì)分越多、功能越強(qiáng)大、對(duì)于開發(fā)者而言所需的專業(yè)領(lǐng)域也會(huì)越寬泛。集成二次開發(fā)要求也會(huì)越來(lái)越強(qiáng)。而多引擎模式下所推崇的中臺(tái)模式、APAAS平臺(tái)初衷雖是為了更好的解耦應(yīng)用實(shí)現(xiàn)微服務(wù)架構(gòu)。但在一定程度上與低代碼平臺(tái)泛開發(fā)者定位是背道而馳的。往往在企業(yè)應(yīng)用中往往是一旦建立起來(lái)中臺(tái),APAAS應(yīng)用就成為了巨無(wú)霸的存在,使得業(yè)務(wù)缺少靈活性,技術(shù)架構(gòu)更是僵硬不堪。
(2)構(gòu)建過(guò)程復(fù)雜,不適合簡(jiǎn)單應(yīng)用
引擎模式下,業(yè)務(wù)功能拆分會(huì)比較細(xì),這種拆分對(duì)于構(gòu)建復(fù)雜應(yīng)用是有益處的,但在日常企業(yè)應(yīng)用開發(fā)中在大多數(shù)的應(yīng)用功能,往往是類似于:“實(shí)驗(yàn)數(shù)據(jù)上報(bào)”、“儀器設(shè)備管理”等等只在相對(duì)封閉的環(huán)境下使用的小功能。對(duì)于這種簡(jiǎn)單應(yīng)用,引擎的功能就會(huì)顯得過(guò)于強(qiáng)大。而其中包含的隱形規(guī)則和設(shè)計(jì)要求更使得普通開發(fā)者無(wú)所是從。
(3)引擎擴(kuò)展困難
業(yè)務(wù)應(yīng)用往往是復(fù)雜多變的,對(duì)引擎的要求也會(huì)多種多樣,有的時(shí)候功能強(qiáng)大和業(yè)務(wù)實(shí)用是兩個(gè)概念。單純依靠引擎功能的無(wú)限窮舉擴(kuò)充來(lái)達(dá)避免業(yè)務(wù)代碼對(duì)引擎的侵入有的時(shí)候會(huì)適得其反。適當(dāng)?shù)耐庋覣PI允許開發(fā)者進(jìn)行深度的調(diào)用開發(fā)是大多數(shù)引擎的策略。但要使用好這一策略其實(shí)并不容易,需要開發(fā)者提出了對(duì)引擎結(jié)構(gòu)具備相當(dāng)?shù)氖炀毘潭?。者一點(diǎn)往往成為引擎模式下最大的攔路虎。
(3)DDD領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)(出碼為DDD領(lǐng)域設(shè)計(jì)驅(qū)動(dòng)語(yǔ)言)
領(lǐng)域域驅(qū)動(dòng)設(shè)計(jì)(簡(jiǎn)稱 ddd)概念來(lái)源于2004年著名建模專家Eric Evans 發(fā)表的他最具影響力的書籍:《領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)——軟件核心復(fù)雜性應(yīng)對(duì)之道》(Domain-Driven Design –Tackling Complexity in the Heart of Software),簡(jiǎn)稱Evans DDD,在DDD中涵蓋了業(yè)務(wù)需求分解方法,項(xiàng)目工程管理方法,以及其通過(guò)倉(cāng)儲(chǔ)庫(kù)、領(lǐng)域模型等一些列概念的定義來(lái)達(dá)到其高聚合、低耦合的設(shè)計(jì)目的。
域驅(qū)動(dòng)設(shè)計(jì)早期是作為軟件架構(gòu)設(shè)計(jì)的基礎(chǔ)理論模型,是架構(gòu)師的理論必修課。但在低代碼應(yīng)用中,根據(jù)DDD驅(qū)動(dòng)設(shè)計(jì)模型的低代碼工具則使得普通的開發(fā)者也可以設(shè)計(jì)出優(yōu)秀的軟件作品。這使得支持DDD理論模型成為了新一代的低代碼平臺(tái)理論標(biāo)桿。而一系列領(lǐng)域模型工具的出現(xiàn)也大幅的降低了領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)的門檻。
領(lǐng)域建模模型:
DDD領(lǐng)域驅(qū)動(dòng)模式優(yōu)點(diǎn):
(1)簡(jiǎn)單業(yè)務(wù)與復(fù)雜引擎業(yè)務(wù)統(tǒng)一模型支持
領(lǐng)域驅(qū)動(dòng)模式,是代碼生成與引擎模式的加強(qiáng)版。在領(lǐng)域驅(qū)動(dòng)模型中各個(gè)引擎的功能,通過(guò)通用域、支撐域等領(lǐng)域模型進(jìn)行了更高階的包裝與描述。開發(fā)者不再單獨(dú)的圍繞著獨(dú)立的引擎API來(lái)完成開發(fā),而是統(tǒng)一到領(lǐng)域服務(wù)與領(lǐng)域事件中使用統(tǒng)一的領(lǐng)域工具完成配置應(yīng)用,而簡(jiǎn)單單一的業(yè)務(wù)模型也可以通過(guò)倉(cāng)儲(chǔ)模版構(gòu)建復(fù)合領(lǐng)域模型聚合實(shí)體庫(kù),最終統(tǒng)一到獨(dú)立的自定義用戶域服務(wù),開發(fā)者在基于領(lǐng)域模型時(shí)可以有機(jī)的將二者串聯(lián)起來(lái)。的以便于業(yè)務(wù)邏輯與具體實(shí)現(xiàn)的分離。而統(tǒng)一的語(yǔ)言環(huán)境支持則允許領(lǐng)域服務(wù)可直接觸及各引擎的DSL規(guī)則,方便于在領(lǐng)域事件中有機(jī)的完成各引擎的協(xié)同工作。
(2)以業(yè)務(wù)應(yīng)用為中心建模高聚合應(yīng)用
領(lǐng)域建模設(shè)計(jì)理念上是以具體的“業(yè)務(wù)模型”為基礎(chǔ)的,其對(duì)應(yīng)的出碼輸出物也是可直接運(yùn)行的業(yè)務(wù)代碼。這一點(diǎn)得益于其高聚合的設(shè)計(jì),但同時(shí)也為低代碼平臺(tái)向無(wú)代碼過(guò)渡提供了有力的建模理論支持與技術(shù)支撐。
?
(3)模塊間的低耦合設(shè)計(jì)
DDD領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)在強(qiáng)調(diào)業(yè)務(wù)主導(dǎo)的同時(shí),也更注重元圍繞著業(yè)務(wù)主體流程及數(shù)據(jù)的元數(shù)據(jù)以及元元數(shù)據(jù)的支持,在主體業(yè)務(wù)之外采用元數(shù)據(jù)以及元元數(shù)據(jù)模型來(lái)描述業(yè)務(wù)源本身關(guān)聯(lián)的事件、動(dòng)作、交互展現(xiàn)等等。這使得業(yè)務(wù)本身的隔離性會(huì)更優(yōu)秀,業(yè)務(wù)模塊的之間的關(guān)聯(lián)關(guān)系也更清晰。在設(shè)計(jì)業(yè)務(wù)關(guān)聯(lián)以及實(shí)現(xiàn)時(shí)只需要關(guān)心業(yè)務(wù)本身的關(guān)聯(lián)即可,而對(duì)于其他的事件,展現(xiàn)交互等統(tǒng)一作為元數(shù)據(jù)與元元數(shù)據(jù)處理實(shí)現(xiàn)解耦應(yīng)用。
元元數(shù)據(jù)配置
?
?
DDD領(lǐng)域驅(qū)動(dòng)模式缺點(diǎn):
領(lǐng)域驅(qū)動(dòng)設(shè)計(jì)高度抽象隔離了業(yè)務(wù)實(shí)現(xiàn),但其作為一個(gè)新型的設(shè)計(jì)模式。對(duì)應(yīng)的工具以及開發(fā)者生態(tài)還相對(duì)匱乏,對(duì)于大多數(shù)已經(jīng)通過(guò)原生代碼完成集成的業(yè)務(wù)模塊以及基于引擎DSL語(yǔ)言的業(yè)務(wù)模型而言,元數(shù)據(jù)以及元元數(shù)據(jù)的剝離還需有待時(shí)日。
二,OneCode低代碼引擎出碼設(shè)計(jì)
OneCode低代碼引擎是一款基于DDD驅(qū)動(dòng)設(shè)計(jì)的通用低代碼引擎。OneCode 采用Java作為原生語(yǔ)言,通過(guò)Java元數(shù)據(jù)注解方式,實(shí)現(xiàn)了一套完整通用領(lǐng)域驅(qū)動(dòng)元數(shù)據(jù)模型。并且針對(duì)領(lǐng)域模型的元數(shù)據(jù)以及支撐元數(shù)據(jù)應(yīng)用的元元數(shù)據(jù)提供了完整的配置管理以及元數(shù)據(jù)出碼設(shè)計(jì)。開發(fā)者只需要引入OneCode元數(shù)據(jù)注解包,添加相應(yīng)的元數(shù)據(jù)注解即可通過(guò)OneCode低代碼引擎渲染輸出為領(lǐng)域模型應(yīng)用。
(1)OneCode 元數(shù)據(jù)注解
?
(2)OneCode 元數(shù)據(jù)注解讀取即可視化編輯
?
(3)通用領(lǐng)域模型元數(shù)據(jù)設(shè)計(jì)
?