国产精品chinese,色综合天天综合精品网国产在线,成午夜免费视频在线观看,清纯女学生被强行糟蹋小说

    <td id="ojr13"><tr id="ojr13"><label id="ojr13"></label></tr></td>
        • <source id="ojr13"></source>
            <td id="ojr13"><ins id="ojr13"><label id="ojr13"></label></ins></td>

            Article / 文章中心

            面向中后臺復(fù)雜場景的低代碼實(shí)踐思路

            發(fā)布時間:2022-01-11 點(diǎn)擊數(shù):841

            導(dǎo)語:現(xiàn)實(shí)中,業(yè)務(wù)場景多,迭代頻繁,變化快到跟不上,規(guī)則可能由多人掌握,無法通過一個人了解全貌;還有業(yè)務(wù)所在行業(yè)固有的復(fù)雜度和歷史包袱,這些問題都會讓我們感到痛苦。除了邏輯問題,我們還關(guān)注易用性交互開發(fā)的問題。


            一 中后臺前端研發(fā)復(fù)雜度背景


            做中后臺前端開發(fā),會經(jīng)常碰到復(fù)雜交互和復(fù)雜邏輯問題:

            復(fù)雜交互和復(fù)雜邏輯問題

            你負(fù)責(zé)的業(yè)務(wù)中,規(guī)則是不是很多?是不是會不自覺的試圖用if...else解決一切問題,邏輯是不是在迭代過程中變得越來越亂?最后徹底變成一個看不懂改不動的黑盒子,沒有人能搞清楚黑盒子里面到底發(fā)生了什么。


            現(xiàn)實(shí)中,業(yè)務(wù)場景多,迭代頻繁,變化快到跟不上,規(guī)則可能由多人掌握,無法通過一個人了解全貌;


            還有業(yè)務(wù)所在行業(yè)固有的復(fù)雜度和歷史包袱,這些問題都會讓我們感到痛苦。


            除了邏輯問題,我們還關(guān)注易用性交互開發(fā)的問題。


            易用性交互開發(fā)問題


            試想,在中后臺系統(tǒng)中,沒有說明、沒有指引,那該有多難用?所以通過內(nèi)容運(yùn)營,增加指引提升易用性是十分必要的,但對于前端開發(fā)來說,又像是下了一道魔咒。為什么這么說呢?


            易用性交互的形式很多,不但會放大整體功能開發(fā)難度,而且很容易干擾到業(yè)務(wù)功能,讓本來已經(jīng)很復(fù)雜的開發(fā)工作更加復(fù)雜,加速了整體腐化。


            本身排期就已經(jīng)低于功能需求了,再加上這些問題,導(dǎo)致大家都不愛去做,長此下去,平臺越來越難用。


            那么問題逐漸顯現(xiàn),如何面對中后臺復(fù)雜場景中最深刻的兩個問題:即復(fù)雜交互、復(fù)雜邏輯。

            動態(tài)標(biāo)注生成交互界面

            二 復(fù)雜交互解法


            1 思路


            首先是使用動態(tài)標(biāo)注生成交互界面,來解決復(fù)雜交互問題:

            后臺功能配置頁

            這是一個典型的后臺功能配置頁:這里面有列表有詳情,加入了很多指引。這里相當(dāng)一部分交互的繁瑣編碼工作,其實(shí)是以一種簡潔高效的低代碼方式去解決的。

            業(yè)務(wù)功能交互以及輔助內(nèi)容交互

            首先我們需要把頁面劃分為業(yè)務(wù)功能交互以及輔助內(nèi)容交互,所謂業(yè)務(wù)功能交互,即脫離了這部分交互業(yè)務(wù)就不再完整了,而輔助內(nèi)容交互則是沒有這部分交互系統(tǒng)也能用,但是可能會很難用。


            那么我們方案的核心目標(biāo)就是:將業(yè)務(wù)功能交互,還是由前端通過procode開發(fā)完成,而這些輔助內(nèi)容交互,就可以由低代碼配置去完成了。


            想法比較直接,那么真實(shí)的效果如何呢?


            procode

            這是一個比較復(fù)雜的配置頁,使用了大量引導(dǎo)類交互,有點(diǎn)擊出現(xiàn)彈窗、查看文檔、還有各種加下劃線氣泡、stepbystep引導(dǎo)、還有更過分的要加復(fù)雜流程圖、這是SVG做的,圖里面還要帶有氣泡按鈕解釋的,等等,像這種交互在系統(tǒng)中有近400個,如果把這些寫在代碼里面,是一個非常大的負(fù)擔(dān),而這些,我們都是通過低代碼配置化去解決的。


            2 實(shí)踐


            接下來是實(shí)戰(zhàn)部分:

            procode的業(yè)務(wù)關(guān)鍵能力

            第一步,我們要找到輔助類的交互,哪些是必須要procode的業(yè)務(wù)關(guān)鍵能力,哪些是非必須的。在我們的實(shí)踐經(jīng)驗中,像這些輔助類交互都是可以抽象成組件復(fù)用的。

            動態(tài)標(biāo)注渲染

            第二步,我們將這些組件,通過動態(tài)標(biāo)注的方式,渲染到界面上。


            關(guān)鍵流程可以描述為,首先捕捉用戶的行為,如元素點(diǎn)擊、移入移出,或是節(jié)點(diǎn)生成、銷毀、或是URL改變了等等。


            當(dāng)匹配這些行為時,找到組件插入或更新的位置,然后渲染出來,這個時候組件會按預(yù)設(shè)的規(guī)則動態(tài)的標(biāo)注到頁面指定位置上。


            比如,當(dāng)用戶進(jìn)入某個頁面時(行為是URL改變),我們給指定區(qū)域(可能是一個選擇器指定的),插入一張流程圖。

            易用性交互的標(biāo)注和動作過程

            第三步,這些組件可能互相之間是有交互的,比如點(diǎn)擊問號按鈕的時候出現(xiàn)彈窗,點(diǎn)擊好用不好用的時候要感謝反饋等等,這個我們是通過一種自定義協(xié)議的url來完成的,這里給出了一些例子來展示下我們正在使用的動作,如:


            向機(jī)器人提問、提交工單、顯示消息、打開彈窗、復(fù)制內(nèi)容等等


            通過給組件配置url來完成不同的動作


            這樣就完成整個易用性交互的標(biāo)注和動作過程。


            3 相關(guān)問題


            那么問題來了,現(xiàn)在都是一些動態(tài)渲染技術(shù),狀態(tài)變了那么頁面結(jié)構(gòu)可能也變了呀,那組件也丟失了。沒有關(guān)系,當(dāng)DOM變化的時候,我們?nèi)匀皇窃诒O(jiān)聽的,只要檢測到DOM樹變化或關(guān)鍵屬性變化,我們就重新執(zhí)行一次渲染。


            第二個問題是,這些規(guī)則都太專業(yè)了,CSS選擇器、XPath,這些對于非技術(shù)同學(xué)來說使用成本非常高,而且可能因為一個很小的頁面改動就會導(dǎo)致配置失效。


            這類問題我們的實(shí)踐方案是,可以通過視覺特征的相似度去做模糊匹配,使用者只要去勾選出相應(yīng)的特征和偏差范圍,就可以自動生成腳本去做匹配,這里我們是通過擴(kuò)展了XQuery形成了自己的模糊查詢方式。



            復(fù)雜交互動作

            4 復(fù)雜交互動作


            標(biāo)注的問題解決了,但是復(fù)雜的交互動作怎么做呢?這里有個例子說明一下:


            試想一個場景,一個系統(tǒng),對于新用戶、老用戶,需要有不同的引導(dǎo)方式


            新用戶場景

            而老用戶場景下,僅提示用戶,歡迎查看常見問題,當(dāng)點(diǎn)擊常見問題時,向機(jī)器人發(fā)問獲取知識;


            在每個環(huán)節(jié)中,我們都是通過url來產(chǎn)生動作,但是怎么串起來呢?


            在我們的定義中,url可以被串聯(lián)順序執(zhí)行,也可以加上@if,條件執(zhí)行,還可以加上@delay延時執(zhí)行,這樣就可以將所有一系列的url組織成一個url,并在兩種場景去分別觸發(fā)。

            url串聯(lián)順序執(zhí)行

            而老用戶場景下,僅提示用戶,歡迎查看常見問題,當(dāng)點(diǎn)擊常見問題時,向機(jī)器人發(fā)問獲取知識;


            在每個環(huán)節(jié)中,我們都是通過url來產(chǎn)生動作,但是怎么串起來呢?


            在我們的定義中,url可以被串聯(lián)順序執(zhí)行,也可以加上@if,條件執(zhí)行,還可以加上@delay延時執(zhí)行,這樣就可以將所有一系列的url組織成一個url,并在兩種場景去分別觸發(fā)。

            策略編排生成邏輯代碼

            三 復(fù)雜邏輯解法


            接下來要面對更難的一個問題,復(fù)雜邏輯,通過策略編排生成邏輯代碼。


            方案的核心目標(biāo),是將所有的交互邏輯從ProCode開發(fā),轉(zhuǎn)為低/無代碼配置,但這個核心目標(biāo)的前提并不是要用低代碼來替代procode,而是因為procode寫復(fù)雜邏輯很難,所以要使用簡單的低代碼實(shí)現(xiàn)。


            在我們實(shí)際業(yè)務(wù)的實(shí)踐中有一例典型的高復(fù)雜度表單,一個表單三種場景,每種場景的各個字段都有聯(lián)系,一共有33個狀態(tài),82條邏輯規(guī)則。當(dāng)時是以procode開發(fā),到第5個工作日時就因為各種錯漏返工無法繼續(xù)了,而轉(zhuǎn)用策略編排,我們用了近2個工作日就解決了這些邏輯寫作問題。


            這聽起來有些不可思議,但是這種方案其實(shí)是可以高效的替代常規(guī)編碼的。


            1 思路


            先認(rèn)識下我們要面對的問題。

            邏輯黑盒



            復(fù)雜邏輯帶來的是高驗證成本、高研發(fā)成本、邏輯黑盒以及返工風(fēng)險等。


            而問題的本質(zhì)和解法有三點(diǎn):


            1.狀態(tài)多難以預(yù)測和驗證:我們的解法是,要確定狀態(tài)的來源,明確狀態(tài)為什么改變了,還要能快速驗證這個狀態(tài)的來龍去脈。


            2.聯(lián)動多 / 條件多:我們需要一個高效的方法論指導(dǎo),可以管理每個狀態(tài)的聯(lián)動及條件


            3.技術(shù)更迭,代碼腐化問題:如果代碼是由規(guī)則生產(chǎn)出來的,那就沒有問題了


            綜上,復(fù)雜交互邏輯的問題,已經(jīng)被轉(zhuǎn)變?yōu)榱藦?fù)雜條件、復(fù)雜聯(lián)動下的狀態(tài)管理問題


            2 決策編排


            先看一下決策編排是怎么解決復(fù)雜條件的:


            if...else嵌套結(jié)構(gòu)

            這是以ProCode實(shí)現(xiàn)的一個三角形類型的判斷邏輯,是一個經(jīng)典的if...else嵌套結(jié)構(gòu)。


            這可以幾乎等價的使用流程編排方式來完成,可以看到使用這種方式,其實(shí)是沒有得到化簡的目的的,因為編排這個流程本質(zhì)上跟編碼沒有區(qū)別。


            ProCode轉(zhuǎn)為衛(wèi)述句式

            如果換一種寫法,將ProCode轉(zhuǎn)為衛(wèi)述句式,雖然有了一些冗余,但是整體code結(jié)構(gòu)變得很清楚,那這種方式,可以使用決策表來表達(dá),也就是偏重復(fù)雜邏輯表達(dá)的方式。


            通過這種決策表編排的方式,我們是可以完成復(fù)雜條件編排的,但是邏輯不僅僅是條件還有聯(lián)動,聯(lián)動是有觸發(fā)條件的,但決策表僅能描述條件關(guān)系,那么接下來來看聯(lián)動部分是怎么編排解決的。

            經(jīng)典的聯(lián)動邏輯

            這里給出的是一個經(jīng)典的聯(lián)動邏輯,可以轉(zhuǎn)換為2張等價的決策表,這里,我們進(jìn)一步將決策表轉(zhuǎn)換為等價的決策樹表示,并為決策樹標(biāo)識出了接受聯(lián)動事件的節(jié)點(diǎn),這樣我們就通過決策樹同時完成了聯(lián)動及條件邏輯的編排。


            再以一例來說明,這是一個貸款利率計算器:

            貸款利率的取值

            我們將貸款類型、還款方式、貸款利率、貸款期數(shù)和累計利息作為不同的對象,將這些對象的狀態(tài),如賦值、可選值等,組織成為三顆決策樹。當(dāng)貸款類型的值變更時、還款方式的可選值以及貸款利率的取值都會發(fā)生變化,點(diǎn)擊計算時,手動調(diào)用第三顆決策樹計算出結(jié)果。


            以上就是通過決策樹的編排來解決復(fù)雜邏輯問題的方案思路。


            3 實(shí)踐


            那么具體的實(shí)踐是怎樣的呢?


            首先,需要定義出策略編排的對象:


            決策樹編排方案

            以表單為例,通常這些對象是表單中一個個的字段,字段有不同的狀態(tài),比如可見、只讀、賦值等等,而這些都可以從后端接口定義中獲取,當(dāng)然也可以自行定義。


            第二步,按照決策樹編排方案,將所有對象狀態(tài)的邏輯關(guān)系、聯(lián)動關(guān)系分治、編排出來,這樣所有邏輯都成為決策樹了;

            邏輯關(guān)系、聯(lián)動關(guān)系分治

            第三步,將元數(shù)據(jù)生成模擬表單。

            元數(shù)據(jù)生成模擬表單

            這樣我們可以實(shí)時的驗證出決策樹中的狀態(tài)是否符合預(yù)期;而策略規(guī)則也可以轉(zhuǎn)換為測試用例腦圖,方便看到各個邏輯case。


            最后一步,有了元數(shù)據(jù)可以生成類型定義,有了決策樹,可以生成邏輯代碼。

            api跨越技術(shù)棧


            這兩樣相結(jié)合,我們可以得到非常專業(yè)注釋詳細(xì)的代碼,這份代碼可以托管在git倉庫擁有高延續(xù)性,也可以直接編譯直接執(zhí)行,或者發(fā)布到npm/cdn被各個業(yè)務(wù)引用,甚至可以作為api跨越技術(shù)棧。


            四 總結(jié)


            再回頭去看兩個方案,一個是面向復(fù)雜交互,另一個是面向復(fù)雜邏輯,其實(shí)這兩個問題每個都能單獨(dú)拿出來深入去聊,聯(lián)系并不那么緊密,而在實(shí)踐上也確是被分為兩個平臺去單獨(dú)求解,割裂感比較重,無法為同一個業(yè)務(wù)提供統(tǒng)一的解決方案。所以接下來,我們打算是尋求一種方式能夠?qū)煞N方案結(jié)合起來,作為一個整體去服務(wù)同一個業(yè)務(wù)。