成人无码视频,亚洲精品久久久久av无码,午夜精品久久久久久毛片,亚洲 中文字幕 日韩 无码

資訊專欄INFORMATION COLUMN

前端數(shù)據(jù)驅(qū)動的價值

ivyzhang / 1682人閱讀

摘要:數(shù)據(jù)驅(qū)動應(yīng)該是從這種模式開始流行的。這種其實已經(jīng)非常趨向與數(shù)據(jù)驅(qū)動了??梢钥吹綌?shù)據(jù)驅(qū)動的難點和關(guān)鍵點就是數(shù)據(jù)結(jié)構(gòu)的設(shè)計。數(shù)據(jù)驅(qū)動主要是處理模塊之間的一種邏輯。

數(shù)據(jù)驅(qū)動應(yīng)該是從flux/redux + react這種模式開始流行的。

他的背后不僅僅是數(shù)據(jù)驅(qū)動這么簡單,在復(fù)雜的系統(tǒng)中,我覺得它解決了一個很關(guān)鍵的問題就是模塊間的交互/通信。有很多文章拿他和mvc/mvvm去比較,我個人覺得沒有特別的可比性,因為解決的問題不同。

以往處理模式

一個稍微復(fù)雜點的例子:

假如有這么一個頁面,我們按照以往模式開發(fā),首先模塊化開發(fā),拆分成A,B,C 三個模塊,然后每個模塊有自己的子模塊。

如果需求簡單還比較好解決,每個模塊中自己解決自己的邏輯,解耦的非常清晰。父子之間的關(guān)系也非常明確。

例如銷毀C模塊,會自動銷毀它的子模塊C1C101。

模塊間的關(guān)系也很清晰,B1不會和B2有直接關(guān)系,他們之間需要通過B模塊去傳遞。同理,B模塊A模塊也沒有直接關(guān)系,他們都需要通過外層頁面去處理關(guān)系。

但是假如有這么一個需求,A2的顯示和B2(用戶交互)以及C101(用戶交互)相關(guān)怎么辦。

按照這種模式,它的解決方案是:

B2如果發(fā)生改變,通知B模塊B模塊在通知頁面,頁面調(diào)用A模塊C模塊,C模塊調(diào)用C1C1調(diào)用C101獲取C101的數(shù)據(jù)處理,頁面調(diào)用A模塊A模塊再調(diào)用A2,再結(jié)合一下從C101獲取的數(shù)據(jù),改變它的展示。

是不是看著很繞,從圖上看是這么個關(guān)系:

圖中僅僅顯示了其中一個復(fù)雜交互,假如我們再多兩個模塊間關(guān)聯(lián)的邏輯:

B1B2模塊影響A2模塊(圖中黃線)

C1影響B1模塊(圖中白線)

如下圖:

3個復(fù)雜一點的交互,整個模塊間的通信已經(jīng)變成蜘蛛網(wǎng)了,重要的是,每一條關(guān)系線都需要開發(fā)者維護的,不僅影響開發(fā)效率,而且不好維護,容易引發(fā)bug,假如后期加新需求或者調(diào)整需求,開發(fā)成本都是比較高的。

可見,對于復(fù)雜的交互,或者模塊間關(guān)系復(fù)雜時,這種依賴父子關(guān)系的通信,是一個很大的障礙。

但是我們怎么辦,拒絕模塊化開發(fā)嗎?那樣頁面設(shè)計起來耦合度更大,更加不可維護。

首先一點,模塊化開發(fā)是一個不可逆的趨勢,然而在這種趨勢下,解決模塊化通信是一個非常重要的點。

模塊間通信其他方案

在那個時候,我考慮最多的就是如何去解決模塊之間的通信,如何讓模塊之間交互更加輕松,模塊之間更加獨立。

方案一:

當時考慮的一個方案是使用一個全局的event(全局的on和fire)。這樣模塊之間就不用依賴父子關(guān)系了。模塊和模塊間是可以之間交互的。

但是這樣會有一些弊端:

事件名稱如何定義,保證不重名

事件是否會重復(fù)的on

模塊和模塊之間會因為事件產(chǎn)生一些耦合

當交互特別復(fù)雜時,也會比較麻煩,還是上面的例子,B2通知C2改變后,C2還需要通知C101獲取一次數(shù)據(jù),來確認改變

整體來看:

優(yōu)勢: 擺脫了模塊間父子層級關(guān)系,可以簡單的跨模塊通信

劣勢: 依然需要維護復(fù)雜的模塊間關(guān)系,只是可以繞過父子依賴

方案二:

全局共享一個model + component模式。這種其實已經(jīng)非常趨向與數(shù)據(jù)驅(qū)動了。每個模塊都是共享全局的model,然后每個component都可以被全局獲取到到,里面的功能屬性可以直接被使用。

其實這種模式已經(jīng)比較理想,頁面上面的任何component都可以被直接調(diào)用到并且使用。

個人覺得缺點就是:
多了一個全局可調(diào)用component的功能。如果砍掉他可以實現(xiàn)完成數(shù)據(jù)驅(qū)動,如果模塊調(diào)用時,使用多了直接獲取component的功能,還是需要在模塊間維護好和其他模塊間的交互邏輯。

數(shù)據(jù)驅(qū)動

先看一個圖,我感覺可以很好的體現(xiàn)數(shù)據(jù)驅(qū)動

提線木偶:他的特點就是每個動作都是,頭,手臂,腳,金箍棒都是由操作的人手決定的,頭和手臂直接沒有任何關(guān)系。

數(shù)據(jù)驅(qū)動也可以這么理解,頁面上面所以的展示都是由數(shù)據(jù)決定的,和頁面其他地方?jīng)]有任何關(guān)系。

再來看看上面那個例子如果加上數(shù)據(jù)驅(qū)動的設(shè)計思想。

頁面之間每個模塊,不用關(guān)心父子模塊之間的關(guān)系,每個獨立的模塊都是由一個全局的model決定。

回到上面那個麻煩的場景。當B2改變時,它會修改model中對應(yīng)的數(shù)據(jù)(效驗C101數(shù)據(jù),結(jié)合B2的改變,修改A2的數(shù)據(jù)),然后A2的業(yè)務(wù)模塊跟進A2的數(shù)據(jù)改變。

這種設(shè)計的核心是每一個模塊的改變,全部都交給model處理。

然后model里面會和個個模塊一一對應(yīng),每個模塊無需關(guān)注其他模塊的變化,只需要關(guān)注model里面對應(yīng)自己數(shù)據(jù)的變化即可。所以模塊間關(guān)系鏈條會顯得非常簡單。

重點在于,當交互邏輯不斷增加時,這個關(guān)系鏈條依然不會增加,因為模塊只和model里面對于的數(shù)據(jù)相關(guān)聯(lián)。

當然,這種模式也無法去省略復(fù)雜的業(yè)務(wù)邏輯,只是業(yè)務(wù)邏輯全部都會聚集在model中??梢岳斫鉃轫撁嫔纤械牟僮鞫际菍?shù)據(jù)的操作。然后每個模塊只需要監(jiān)聽關(guān)注的數(shù)據(jù)改變即可,這個監(jiān)聽關(guān)系就是圖中唯一的一條關(guān)系線。

換一個理解,我們將直接的模塊和模塊直接的耦合關(guān)系全部轉(zhuǎn)移到了數(shù)據(jù)中去體現(xiàn)。而數(shù)據(jù)的維護是遠遠比模塊更好維護的。

Model如何對應(yīng)View

還是上面頁面為例子:

model

var page = {
    a: {
        isShow: true,
        children: [{
            a1: {
                isShow: true
            }
        },
        {
            a2: {
                isShow: true
            }
        }]
    },
    b: {
        isShow: true,
        children: [{
            b1: {
                isShow: true
            }
        },
        {
            b2: {
                isShow: true
            }
        }]
    },
    c: {
        isShow: true,
        children: [{
            c1: {
                isShow: true,
                children: [{
                    c101: {
                        isShow: true
                    }
                }]
            }
        }]
    }
}

isShow 表示展示的意思。這個狀態(tài)對應(yīng)文章第一個圖片。

當數(shù)據(jù)改變時,例如model發(fā)生變化如下:

var page = {
    a: {
        isShow: true,
        children: [{
            a1: {
                isShow: true
            }
        },
        {
            a2: {
                isShow: false
            }
        }]
    },
    b: {
        isShow: true,
        children: [{
            b1: {
                isShow: true
            }
        },
        {
            b2: {
                isShow: false
            }
        }]
    },
    c: {
        isShow: true,
        children: [{
            c1: {
                isShow: false,
                children: [{
                    c101: {
                        isShow: true
                    }
                }]
            }
        }]
    }
}

對應(yīng)下面這樣:

換一個理解就是每一種數(shù)據(jù)狀態(tài)對應(yīng)一種頁面的展示狀態(tài)。頁面想展示成什么樣子,需要數(shù)據(jù)處理成什么樣子。數(shù)據(jù)是這個頁面的核心。

數(shù)據(jù)驅(qū)動開發(fā)關(guān)注點

第一點數(shù)據(jù)結(jié)構(gòu)的處理,因為數(shù)據(jù)決定了整個頁面的展示,數(shù)據(jù)結(jié)構(gòu)開始的設(shè)計非常關(guān)鍵,數(shù)據(jù)結(jié)構(gòu)的可擴展性決定了頁面的可擴展性,如果開始數(shù)據(jù)模式不好,后期維護也會非常難受。

第二點是處理好模塊和數(shù)據(jù)中對應(yīng)的關(guān)系。

可以看到數(shù)據(jù)驅(qū)動的難點和關(guān)鍵點就是數(shù)據(jù)結(jié)構(gòu)的設(shè)計。而這個也是很考驗開發(fā)者能力的。數(shù)據(jù)結(jié)構(gòu)的好壞直接決定了后期業(yè)務(wù)開發(fā)的質(zhì)量。

數(shù)據(jù)驅(qū)動和mvc/mvvm的關(guān)系

文章開頭說了,從我的角度理解數(shù)據(jù)驅(qū)動這種模式和mvc并沒有什么競爭關(guān)系,在具體的實踐中,每一個模塊可以是一個mvc或者mvvm,模塊的內(nèi)部處理交給模塊自己,可以是mvc,或者單例也可以。數(shù)據(jù)驅(qū)動主要是處理模塊之間的一種邏輯。

那么為什么數(shù)據(jù)驅(qū)動和react這種結(jié)合的更加好了?因為react更進一步是講模塊內(nèi)部也實現(xiàn)一個數(shù)據(jù)驅(qū)動,模塊內(nèi)部的數(shù)據(jù)改變了,模塊的狀態(tài)會跟著改變。

微信公眾號

博客地址

http://tangguangyao.github.io/

文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請注明本文地址:http://m.hztianpu.com/yun/78620.html

相關(guān)文章

  • 前端數(shù)據(jù)驅(qū)動陷阱

    摘要:結(jié)論三對于某些具體的模塊,單向數(shù)據(jù)流不是萬靈藥,整體架構(gòu)單向數(shù)據(jù)驅(qū)動,具體模塊可以根據(jù)場景選擇最合適的總結(jié)個人感覺數(shù)據(jù)驅(qū)動對于開發(fā)人員的要求其實有一些增加,開發(fā)是需要更多的全局觀,對于業(yè)務(wù)需要更加的了解。 showImg(https://segmentfault.com/img/bVsPfl); 年前一篇文章《前端數(shù)據(jù)驅(qū)動的價值》聊了一下數(shù)據(jù)驅(qū)動的一些看法。 其中數(shù)據(jù)驅(qū)動的核心在于...

    Andrman 評論0 收藏0
  • 數(shù)據(jù)驅(qū)動模式借助react實踐探索

    摘要:之前談到過很多次數(shù)據(jù)驅(qū)動的理解,這次通過實際項目檢驗了一下自己的想法。對于數(shù)據(jù)驅(qū)動這種模式,至少從數(shù)據(jù)層,可以規(guī)避,做一層數(shù)據(jù)變化的效驗這個和寫服務(wù)端單側(cè)差不多。數(shù)據(jù)驅(qū)動和有點類似,只是借用在單頁面上實現(xiàn)了。 之前談到過很多次數(shù)據(jù)驅(qū)動的理解,這次通過實際項目檢驗了一下自己的想法。 相關(guān)文件 《前端數(shù)據(jù)驅(qū)動的價值》 《前端數(shù)據(jù)驅(qū)動的陷阱》 項目詳設(shè) 詳設(shè)的重要性 對于復(fù)雜一點的項目,...

    jone5679 評論0 收藏0
  • 數(shù)據(jù)時代,業(yè)務(wù)運維驅(qū)動企業(yè)變革

    摘要:業(yè)務(wù)運維是運維與企業(yè)業(yè)務(wù)深度融合的產(chǎn)物,是運維管理在互聯(lián)網(wǎng)時代和云計算大數(shù)據(jù)技術(shù)推動下的必然結(jié)果。 從信息化時代起,企業(yè)一直在試圖發(fā)現(xiàn)業(yè)務(wù)數(shù)據(jù)中深藏的商業(yè)價值,并為此誕生了數(shù)據(jù)挖掘、商業(yè)智能、BPM、BSM等諸多技術(shù),然而互聯(lián)網(wǎng)時代的到來,專為封閉生產(chǎn)環(huán)境而生的信息化系統(tǒng),已經(jīng)無法滿足企業(yè)高速增長的互聯(lián)網(wǎng)開放業(yè)務(wù)和隨著而來的海量信息的處理需求。互聯(lián)網(wǎng)+最大的價值在于連接,企業(yè)根據(jù)原有生...

    iliyaku 評論0 收藏0
  • 職場瓶頸:2~4 年前端走出離職困境與舒適區(qū)

    摘要:著作權(quán)歸作者所有。工作年限越長,公司對于開發(fā)者的要求就會越高。了解技術(shù)的內(nèi)部機制才能讓自己不被淘汰。 著作權(quán)歸作者所有。商業(yè)轉(zhuǎn)載請聯(lián)系 Scott 獲得授權(quán),非商業(yè)轉(zhuǎn)載請注明出處[務(wù)必保留全文,勿做刪減]。 Scott 近兩年無論是面試還是線下線上的技術(shù)分享,遇到許許多多前端同學(xué),由于團隊原因,個人原因,職業(yè)成長,技術(shù)方向,甚至家庭等等原因,在理想國與現(xiàn)實之間,在放棄與堅守之間,搖擺不停,...

    thursday 評論0 收藏0

發(fā)表評論

0條評論

閱讀需要支付1元查看
<