摘要:組件的正確依賴于數(shù)據(jù)的正確,而在開(kāi)發(fā)的過(guò)程中不同的開(kāi)發(fā)人員有著不同的風(fēng)格的數(shù)據(jù)處理方式。總的來(lái)說(shuō),就是在編寫(xiě)這樣復(fù)雜的業(yè)務(wù)組件,我們應(yīng)該同時(shí)編寫(xiě)相關(guān)的輔助函數(shù)來(lái)方便組件的調(diào)用者來(lái)使用。
Bug發(fā)生原因寫(xiě)這篇文章的初衷是為了記錄我在修復(fù)項(xiàng)目中一個(gè)復(fù)雜業(yè)務(wù)組件中的bug而引起其他依賴這個(gè)組件的功能無(wú)法使用的過(guò)程中,對(duì)使用、維護(hù)復(fù)雜業(yè)務(wù)組件的一些思考
原文地址
我所在的項(xiàng)目組中, 有一個(gè)類似樹(shù)狀文件管理的需求
對(duì)于這樣的需求,當(dāng)時(shí)我設(shè)計(jì)一個(gè)基礎(chǔ)的UI組件treeListView用來(lái)實(shí)現(xiàn)基礎(chǔ)的樹(shù)狀UI, 同時(shí)在其基礎(chǔ)上實(shí)現(xiàn)了explorer業(yè)務(wù)組件來(lái)實(shí)現(xiàn)具體的業(yè)務(wù)邏輯。
由于是樹(shù)狀的視圖,所以在當(dāng)時(shí)設(shè)計(jì)數(shù)據(jù)結(jié)構(gòu)時(shí)也采用樹(shù)作為數(shù)據(jù)結(jié)構(gòu)。為了能夠方便的查找樹(shù)中的數(shù)據(jù),我按照系統(tǒng)的文件管理給所有的數(shù)據(jù)添加了一個(gè)path屬性。
但是在實(shí)現(xiàn)的時(shí)候沒(méi)有考慮到同級(jí)目錄下面可能同時(shí)存在同名的文件夾和文件這種情況,假設(shè)文件夾folder下面同時(shí)存在名為file的文件和文件夾,這個(gè)時(shí)候會(huì)造成它們的路徑相同,在查找的時(shí)候無(wú)法區(qū)分這兩個(gè)數(shù)據(jù)。修復(fù)的方法是在文件夾的路徑后面增加/。
這樣修復(fù)后,由于在我們的項(xiàng)目中有許多的地方直接使用path來(lái)來(lái)做判讀,例如有的地方直接分割path來(lái)獲取當(dāng)前數(shù)據(jù)的名稱或者其父元素的名稱(雖然有更好的方式獲取這些數(shù)據(jù),但是開(kāi)發(fā)過(guò)程中可能為了省事直接這樣獲?。?,或者在新建文件、文件夾時(shí)自己手動(dòng)的拼寫(xiě)path。
當(dāng)我按照上面的方式修復(fù)bug時(shí),就必須同時(shí)修改這個(gè)依賴path的函數(shù)操作,當(dāng)項(xiàng)目中的代碼太多時(shí)就可能出現(xiàn)遺漏的情況,給代碼的維護(hù)帶來(lái)很大的困擾。
為什么會(huì)出現(xiàn)這么多的問(wèn)題?問(wèn)題出現(xiàn)了之后就應(yīng)該去反思為什么造成現(xiàn)在這樣的局面。誠(chéng)然有一部分的原因是我們?cè)陂_(kāi)發(fā)過(guò)程中經(jīng)常會(huì)圖方便而隨意的使用數(shù)據(jù),但是根本的原因是在對(duì)一個(gè)復(fù)雜的業(yè)務(wù)組件調(diào)用過(guò)程中,沒(méi)有一個(gè)方便、有效的操作造成的。換句話說(shuō)就是對(duì)于組件依賴的數(shù)據(jù)沒(méi)有一個(gè)有效的操作造成的。
組件的正確依賴于數(shù)據(jù)的正確,而在開(kāi)發(fā)的過(guò)程中不同的開(kāi)發(fā)人員有著不同的風(fēng)格的數(shù)據(jù)處理方式。 一旦數(shù)據(jù)結(jié)構(gòu)出現(xiàn)了錯(cuò)誤或者發(fā)生了修改,就會(huì)導(dǎo)致組件出現(xiàn)意想不到問(wèn)題。
如何解決這樣的問(wèn)題?對(duì)于業(yè)務(wù)組件, 我們是可以總結(jié)出對(duì)這個(gè)業(yè)務(wù)組件的調(diào)用的使用情況,例如本文中的explorer組件主要有以下幾種情況:
新建文件夾、文件
刪除文件夾、文件
修改文件夾、文件
根據(jù)路徑查找文件夾、文件
根據(jù)路徑查找父文件夾
對(duì)于這些操作,在組件的編寫(xiě)過(guò)程中我們可以同時(shí)編寫(xiě)對(duì)應(yīng)的輔助函數(shù),
如explorer組件我就編寫(xiě)下面的輔助函數(shù)
return { // 修改屬性操作 modify: modify, // 重命名操作 rename: rename, // 新建操作 create: create, // 復(fù)制操作 copy: copy, // 移動(dòng)操作 move: move, // 刪除操作 remove: remove, // 搜索樹(shù)中符合要求的數(shù)據(jù) searchTree: searchTree, // 根據(jù)路徑返回在樹(shù)種的索引 searchByPath: searchByPath, // 根據(jù)路徑獲取數(shù)據(jù) getDataByPath: getDataByPath, // 根據(jù)路徑獲取父目錄的數(shù)據(jù) getParentDataByPath: getParentDataByPath, // 根據(jù)路徑獲取父目錄路徑 getParentPath: getParentPath // 初始化數(shù)據(jù)中的path addSourcePath: addSourcePath, // 判斷是否存在同名數(shù)據(jù)(用于新建時(shí)同名判斷) hasSameName: hasSameName };
這樣對(duì)于調(diào)用者來(lái)說(shuō),只要使用組件提供的輔助函數(shù)就可以方便的使用組件;對(duì)于組件的維護(hù)者來(lái)說(shuō),只要保證輔助函數(shù)的正確性,就可以保證組件在被調(diào)用的過(guò)程的正確,方便組件的維護(hù)。
總的來(lái)說(shuō),就是在編寫(xiě)這樣復(fù)雜的業(yè)務(wù)組件,我們應(yīng)該同時(shí)編寫(xiě)相關(guān)的輔助函數(shù)來(lái)方便組件的調(diào)用者來(lái)使用。而我們?cè)陂_(kāi)發(fā)中也應(yīng)當(dāng)避免寫(xiě)出上文中那樣對(duì)數(shù)據(jù)直接進(jìn)行操作的代碼,這會(huì)導(dǎo)致業(yè)務(wù)的正確依賴于組件的內(nèi)部數(shù)據(jù)相耦合,使組件難以維護(hù)。
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/89016.html
摘要:背景作為單頁(yè)大型應(yīng)用的框架愛(ài)好者的我,不實(shí)現(xiàn)個(gè)大型應(yīng)用練練手怎么趕說(shuō)自己熟練,于是嘗試實(shí)現(xiàn)了大部分的進(jìn)銷存功能。本文主要對(duì)實(shí)現(xiàn)業(yè)務(wù)需求中遇到的問(wèn)題以及解決方案進(jìn)行闡述。不確保對(duì)其他項(xiàng)目有可移植性。 背景 作為單頁(yè)大型應(yīng)用的mv*框架AngularJS愛(ài)好者的我,不實(shí)現(xiàn)個(gè)大型web應(yīng)用練練手怎么趕說(shuō)自己熟練ng,于是嘗試實(shí)現(xiàn)了大部分erp的進(jìn)銷存功能。本文主要對(duì)實(shí)現(xiàn)業(yè)務(wù)需求中遇到的問(wèn)題以...
摘要:?jiǎn)卧獪y(cè)試針對(duì)程序模塊進(jìn)行測(cè)試。是開(kāi)源的單元測(cè)試工具。一個(gè)好的單元測(cè)試應(yīng)該具備的條件安全重構(gòu)已有代碼單元測(cè)試一個(gè)很重要的價(jià)值是為重構(gòu)保駕護(hù)航。斷言外部依賴單元測(cè)試的一個(gè)重要原則就是無(wú)依賴和隔離。 前端測(cè)試金字塔 對(duì)于一個(gè) Web 應(yīng)用來(lái)說(shuō),理想的測(cè)試組合應(yīng)該包含大量單元測(cè)試(unit tests),部分快照測(cè)試(snapshot tests),以及少量端到端測(cè)試(e2e tests)。參...
摘要:是一個(gè)專門為應(yīng)用所設(shè)計(jì)的集中式狀態(tài)管理架構(gòu)。此時(shí)可以幫助我們實(shí)現(xiàn)狀態(tài)的管理。每個(gè)任務(wù)都?xì)w屬于一個(gè)清單,有唯一的清單。說(shuō)到這,一個(gè)復(fù)雜的的基本結(jié)構(gòu)和功能已經(jīng)出現(xiàn)了。 使用過(guò)一些清單類的應(yīng)用程序,像 WunderList, Google Keep等,用來(lái)記錄一些計(jì)劃和安排,也試著將自己的計(jì)劃安排同筆記一起整理在 Evernote 中,但是無(wú)論哪種方式用起來(lái)總覺(jué)得少了點(diǎn)什么,如果兩者的一些功...
閱讀 727·2021-11-18 10:02
閱讀 2269·2021-11-15 18:13
閱讀 3230·2021-11-15 11:38
閱讀 2996·2021-09-22 15:55
閱讀 3708·2021-08-09 13:43
閱讀 2477·2021-07-25 14:19
閱讀 2481·2019-08-30 14:15
閱讀 3472·2019-08-30 14:15