国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專(zhuān)欄INFORMATION COLUMN

前端數(shù)據(jù)驅(qū)動(dòng)的陷阱

Andrman / 1155人閱讀

摘要:結(jié)論三對(duì)于某些具體的模塊,單向數(shù)據(jù)流不是萬(wàn)靈藥,整體架構(gòu)單向數(shù)據(jù)驅(qū)動(dòng),具體模塊可以根據(jù)場(chǎng)景選擇最合適的總結(jié)個(gè)人感覺(jué)數(shù)據(jù)驅(qū)動(dòng)對(duì)于開(kāi)發(fā)人員的要求其實(shí)有一些增加,開(kāi)發(fā)是需要更多的全局觀,對(duì)于業(yè)務(wù)需要更加的了解。

年前一篇文章《前端數(shù)據(jù)驅(qū)動(dòng)的價(jià)值》聊了一下數(shù)據(jù)驅(qū)動(dòng)的一些看法。

其中數(shù)據(jù)驅(qū)動(dòng)的核心在于整個(gè)系統(tǒng)中對(duì)于數(shù)據(jù)的架構(gòu),設(shè)計(jì),維護(hù)。對(duì)于數(shù)據(jù)的處理直接決定了系統(tǒng)的穩(wěn)定性,可維護(hù)性,可擴(kuò)展性。但是這里的數(shù)據(jù)維護(hù)也是相當(dāng)復(fù)雜和難搞的一塊。

精選評(píng)論

引用nightiresegmentfault對(duì)于《前端數(shù)據(jù)驅(qū)動(dòng)的價(jià)值》的評(píng)論:
我覺(jué)得非常好所以完整復(fù)制過(guò)來(lái)

數(shù)據(jù)驅(qū)動(dòng)肯定不是從 flux/redux + react 才開(kāi)始的
上者特別強(qiáng)調(diào)單向數(shù)據(jù)流,所以才給人造成“由它開(kāi)始”的錯(cuò)覺(jué)

單向數(shù)據(jù)流有一個(gè)前置依賴(lài),那就是 Single Data Source,也就是你的“提線(xiàn)木偶”所描述的那樣

然而在你的文章里卻把它寫(xiě)成了 Data Driven 的前置依賴(lài)

問(wèn)題來(lái)了:只有單向數(shù)據(jù)流才算數(shù)據(jù)驅(qū)動(dòng)嗎?

肯定不是的,其實(shí)老牌的 Angular/Ember/……等等都是一樣的,無(wú)非就是對(duì)待 Data 的方式各有不同罷了;刨除這些細(xì)微差別,它們都是從 “DOM 驅(qū)動(dòng)” 轉(zhuǎn)向 “數(shù)據(jù)驅(qū)動(dòng)” 的代表作品

只是它們并沒(méi)有把這個(gè)的概念提煉的深入人心,如此說(shuō)來(lái),React 一家是功不可沒(méi)的,不可變數(shù)據(jù) + 單向數(shù)據(jù)流讓數(shù)據(jù)驅(qū)動(dòng)真正成為了“理念”,而不只是“概念”

然而,單向數(shù)據(jù)流也不是十全十美的,對(duì)于 UI 編程來(lái)說(shuō),有些地方的確是雙向綁定來(lái)得更“漂亮”一些,比如:表單

所以 React 也適時(shí)的加入了雙向綁定;不過(guò)這并不妨礙數(shù)據(jù)驅(qū)動(dòng)這一理念得以貫徹

Single Data Source 也不是萬(wàn)能靈藥,如果 A B C 三個(gè)模塊都是各自獨(dú)立開(kāi)發(fā)的,之后因?yàn)樾枨蠖喜⒃谝黄穑趺崔k?在它們之上再來(lái)一個(gè) SDS?那這樣還算不算是 SDS 呢?(或者反過(guò)來(lái),不是 SDS 的話(huà)難道就不行嗎?)

這個(gè)問(wèn)題其實(shí)也還在發(fā)展中,這會(huì)兒我也給不出答案,只是客觀描述一番罷了。

數(shù)據(jù)驅(qū)動(dòng)的陷阱

對(duì)于一個(gè)真正完美的數(shù)據(jù)驅(qū)動(dòng),就如同《前端數(shù)據(jù)驅(qū)動(dòng)的價(jià)值》中的例子,所有業(yè)務(wù)全部由一個(gè)store驅(qū)動(dòng),維護(hù)好store就是維護(hù)好了整個(gè)系統(tǒng)。

但是對(duì)于這個(gè)一筆帶過(guò)的維護(hù)store其實(shí)技術(shù)含量非常高。

下面分業(yè)務(wù)場(chǎng)景和情況描述

新項(xiàng)目

這種情況是比較幸運(yùn)的,開(kāi)始的模型中設(shè)計(jì)好業(yè)務(wù)數(shù)據(jù)結(jié)構(gòu),設(shè)計(jì)好未來(lái)可擴(kuò)展點(diǎn)。

當(dāng)然,即使是新產(chǎn)品,也會(huì)遇到麻煩點(diǎn),因?yàn)槊恳粋€(gè)參與開(kāi)發(fā)的人,必須要全局的理解整個(gè)數(shù)據(jù)結(jié)構(gòu)。

看看數(shù)據(jù)難搞的地方,舉個(gè)例子:

模式A:

var store = {
    userInfo: {
        name: "test",
        age: "20"
    },
    planNum: 2,
    plans: {
        "plan1": {
            name: "plan1",
            price: 2.00,
            unitNum: 1,
            unit: {
                "unit1": {
                    name: "unit1",
                    price: 1.22,
                    keywordNum: 2,
                    keyword: {
                        "keyword1": {
                            name: "word1",
                            price: 22.00
                        },
                        "keyword2": {
                            name: "word2",
                            price: 21.00
                        }
                    }
                }
            }
        },
        "plan2": {
            name: "plan2",
            price: 3.00,
            unitNum: 0,
            unit: {}
        }
    }
}

上面是一種最簡(jiǎn)單的數(shù)據(jù)結(jié)構(gòu),清晰的展現(xiàn)了planunitkeyword直接的關(guān)系,簡(jiǎn)單直白。

但是如果當(dāng)層級(jí)關(guān)系越來(lái)越深,這個(gè)里面增刪改查信息就是一個(gè)麻煩點(diǎn),可以說(shuō)上面結(jié)構(gòu)的可擴(kuò)展性不強(qiáng)。

那么換下面一種結(jié)構(gòu)是否更加合適:

模式B:

var store = {
    userInfo: {
        name: "test",
        age: "20"
    },
    planNum: 2,
    plans: {
        "plan1": {
            name: "plan1",
            price: 2.00,
            unitNum: 1,
            unit: [unit1]
        },
        "plan2": {
            name: "plan2",
            price: 3.00,
            unitNum: 0,
            unit: []
        }
    },
    units: {
        "unit1": {
            plan: "plan1",
            name: "unit1",
            price: 1.22,
            keywordNum: 2,
            keyword: [keyword1]
        }
    },
    keywords: {
        "keyword1": {
            plan: "plan1",
            unit: "unit1",
            name: "word1",
            price: 22.00
        },
        "keyword1": {
            plan: "plan1",
            unit: "unit1",
            name: "word2",
            price: 21.00
        },
    }
}

個(gè)人感覺(jué)這種模式更加適合,便于查找和更新,那么問(wèn)題來(lái)了,先拋開(kāi)哪種數(shù)據(jù)結(jié)構(gòu)更合適問(wèn)題,假如開(kāi)發(fā)初期模式A是ok的,隨著業(yè)務(wù)的復(fù)雜,發(fā)現(xiàn)模式A越來(lái)越難維護(hù),經(jīng)過(guò)重新設(shè)計(jì),發(fā)現(xiàn)轉(zhuǎn)換到模式B更加合適,能明顯提高開(kāi)發(fā)和維護(hù)效率,那么怎么辦?

個(gè)人還沒(méi)有實(shí)踐過(guò),但是經(jīng)驗(yàn)上看感覺(jué)是會(huì)導(dǎo)致大面積重構(gòu)。即使重構(gòu)完成,假如后期發(fā)現(xiàn)更好的數(shù)據(jù)模式呢?

所以可以看出初期的數(shù)據(jù)結(jié)構(gòu)決定了未來(lái)架構(gòu),看上去像不像后端開(kāi)發(fā),數(shù)據(jù)庫(kù)的設(shè)計(jì)很重要。

既然越來(lái)越像后端設(shè)計(jì)模式,那么是否會(huì)模仿當(dāng)時(shí)的前后端分離策略,底層數(shù)據(jù)結(jié)構(gòu)和業(yè)務(wù)展現(xiàn)通過(guò)api實(shí)現(xiàn)呢?個(gè)人感覺(jué)這樣有點(diǎn)問(wèn)題過(guò)于復(fù)雜化。那么是否可以加一個(gè)中間數(shù)據(jù)轉(zhuǎn)換層去處理數(shù)據(jù)呢?這樣在底層數(shù)據(jù)結(jié)構(gòu)變換時(shí),也能避免直接影響業(yè)務(wù)模塊,中間層做一個(gè)適當(dāng)?shù)慕怦睿故緝?nèi)容和數(shù)據(jù)結(jié)構(gòu)沒(méi)有什么關(guān)聯(lián),關(guān)聯(lián)的僅僅是數(shù)據(jù)信息。

結(jié)論一:初期的數(shù)據(jù)結(jié)構(gòu)設(shè)計(jì)會(huì)是未來(lái)的不定時(shí)炸彈,遲早會(huì)面對(duì),需要有相應(yīng)策略

模塊合并

再來(lái)考慮評(píng)論中的一個(gè)問(wèn)題:

Single Data Source 也不是萬(wàn)能靈藥,如果 A B C 三個(gè)模塊都是各自獨(dú)立開(kāi)發(fā)的,之后因?yàn)樾枨蠖喜⒃谝黄穑趺崔k?在它們之上再來(lái)一個(gè) SDS?那這樣還算不算是 SDS 呢?(或者反過(guò)來(lái),不是 SDS 的話(huà)難道就不行嗎?)

復(fù)雜的系統(tǒng)中確實(shí)會(huì)遇到這種問(wèn)題,直接舉例:

模塊C,主要負(fù)責(zé)修改level:

var store = {
    moduleA: {
        "plan1": {
            name: "plan1",
            price: 22.00
        },
        level: 2
    }
}

模塊D,主要負(fù)責(zé)修改auth:

var store = {
    moduleB: {
        "plan1": {
            name: "plan1",
            price: 22.00
        },
        auth: 0
    }
}

現(xiàn)在的邏輯是假如兩個(gè)獨(dú)立開(kāi)發(fā)好的模塊需要合并到一起,他們都有各自模塊的內(nèi)部數(shù)據(jù)結(jié)構(gòu),假如模塊C除了修改level,還修改了plan1的name會(huì)怎么樣?為了保證數(shù)據(jù)統(tǒng)一,需要去找到模塊D中的plan1信息,并且修改。假如他們都合并到上面一個(gè)例子模塊A中怎么辦,是否還需要繼續(xù)同步修改。如果漏掉一個(gè)同步,展示上,以及后面的處理都會(huì)引發(fā)各種bug。

當(dāng)然,如果不用數(shù)據(jù)驅(qū)動(dòng),可能這種模塊合并也是需要從展示層級(jí)各處同步修改信息的,也會(huì)特別麻煩。只是相比較而言,數(shù)據(jù)驅(qū)動(dòng)的這種合并同步并沒(méi)有給我們帶來(lái)很清晰簡(jiǎn)單的處理方式。

結(jié)論二:數(shù)據(jù)驅(qū)動(dòng)下,數(shù)據(jù)的重復(fù)和同步是一個(gè)坑,要盡量避免

不適合的場(chǎng)景

然而,單向數(shù)據(jù)流也不是十全十美的,對(duì)于 UI 編程來(lái)說(shuō),有些地方的確是雙向綁定來(lái)得更“漂亮”一些,比如:表單

評(píng)論里面提到的這部分應(yīng)該是單向數(shù)據(jù)流的一個(gè)痛點(diǎn),如果模塊里面嚴(yán)格執(zhí)行單向數(shù)據(jù)流,對(duì)于這種表單驗(yàn)證來(lái)說(shuō),是非常痛苦的。

例如:

var form = {
    value: 2.00
}

對(duì)應(yīng)一個(gè)輸入框,輸入框只能限制輸入1-100的2位小數(shù)。整個(gè)驗(yàn)證過(guò)程單向數(shù)據(jù)驅(qū)動(dòng)就會(huì)特別麻煩。

一個(gè)簡(jiǎn)單的例子,在使用react實(shí)現(xiàn)表單驗(yàn)證就比較麻煩。

結(jié)論三:對(duì)于某些具體的模塊,單向數(shù)據(jù)流不是萬(wàn)靈藥,整體架構(gòu)單向數(shù)據(jù)驅(qū)動(dòng),具體模塊可以根據(jù)場(chǎng)景選擇最合適的

總結(jié)

個(gè)人感覺(jué)數(shù)據(jù)驅(qū)動(dòng)對(duì)于開(kāi)發(fā)人員的要求其實(shí)有一些增加,開(kāi)發(fā)是需要更多的全局觀,對(duì)于業(yè)務(wù)需要更加的了解。這個(gè)其實(shí)算是缺點(diǎn),因?yàn)閺墓こ袒慕嵌龋@種模式提高了開(kāi)發(fā)成本,提高了開(kāi)發(fā)人員的學(xué)習(xí)成本。

那么優(yōu)點(diǎn)呢,應(yīng)該是系統(tǒng)的穩(wěn)定性,可維護(hù)性,健壯性會(huì)更好。

總之沒(méi)有銀彈,每種模式都有適合的場(chǎng)景。以上就是對(duì)于數(shù)據(jù)驅(qū)動(dòng)的一點(diǎn)點(diǎn)看法。僅供參考。

微信公眾號(hào)

個(gè)人博客

http://tangguangyao.github.io/

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

轉(zhuǎn)載請(qǐng)注明本文地址:http://m.specialneedsforspecialkids.com/yun/78681.html

相關(guān)文章

  • 數(shù)據(jù)驅(qū)動(dòng)模式借助react實(shí)踐探索

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

    jone5679 評(píng)論0 收藏0
  • 3月份前端資源分享

    摘要:面試如何防騙一份優(yōu)秀的前端開(kāi)發(fā)工程師簡(jiǎn)歷是怎么樣的作為,有哪些一般人我都告訴他,但是他都不聽(tīng)的忠告如何面試前端工程師 更多資源請(qǐng)Star:https://github.com/maidishike... 文章轉(zhuǎn)自:https://github.com/jsfront/mo... 3月份前端資源分享 1. Javascript 使用judge.js做信息判斷 javascript...

    nanchen2251 評(píng)論0 收藏0
  • Spring/Hibernate 應(yīng)用性能優(yōu)化7種方法

    摘要:對(duì)于大多數(shù)典型的企業(yè)應(yīng)用而言,其性能表現(xiàn)幾乎完全依賴(lài)于持久層的性能。速成法使用批處理對(duì)于批處理程序,驅(qū)動(dòng)程序提供了旨在減少網(wǎng)絡(luò)來(lái)回傳輸?shù)膬?yōu)化方法。速成法檢查錯(cuò)誤的提交間隔如果你使用批處理程序,提交間隔會(huì)對(duì)性能造成十倍甚至百倍的影響。 對(duì)于大多數(shù)典型的 Spring/Hibernate 企業(yè)應(yīng)用而言,其性能表現(xiàn)幾乎完全依賴(lài)于持久層的性能。此篇文章中將介紹如何確認(rèn)應(yīng)用是否受數(shù)據(jù)庫(kù)約束,同時(shí)...

    lavor 評(píng)論0 收藏0
  • 使用JavaScript閉包遇到陷阱(一)

    摘要:使用閉包遇到的陷阱一陷阱在類(lèi)的原型對(duì)象中添加特權(quán)方法首先定義一個(gè)類(lèi),該類(lèi)中有一個(gè)私有變量定義個(gè)特權(quán)方法來(lái)訪(fǎng)問(wèn)修改私有變量然后我們對(duì)類(lèi)進(jìn)行測(cè)試到目前為止,類(lèi)正常工作。 使用JavaScript閉包遇到的陷阱(一) 陷阱:在類(lèi)的原型對(duì)象中添加特權(quán)方法 首先定義一個(gè)Page類(lèi),該類(lèi)中有一個(gè)私有變量dom: function Page(){ var dom; } 定義2個(gè)特權(quán)方法來(lái)訪(fǎng)問(wèn)...

    caohaoyu 評(píng)論0 收藏0
  • 常見(jiàn)JavaScript“陷阱

    摘要:隨著標(biāo)準(zhǔn)的普及,已經(jīng)擁有許多新的語(yǔ)法糖,這讓我們編寫(xiě)可讀的,高質(zhì)量的代碼變得更加方便,但即使這樣仍然會(huì)遇到一些潛在的陷阱。例如集合的最終長(zhǎng)度是,由于兩次添加的數(shù)組不是同一個(gè)。最終會(huì)得到大小為的集合,因?yàn)樽址遣豢勺儭? showImg(https://segmentfault.com/img/remote/1460000019006033); 隨著ES6標(biāo)準(zhǔn)的普及,JavaScript...

    greatwhole 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<