javascript - 最小函數(shù)準(zhǔn)則 一個(gè)函數(shù)里只能干一件相關(guān)事情 為什么?真的有意義嗎?~
問(wèn)題描述
$scope.del = function () { var delItemId = getDelId(); // 要?jiǎng)h除的項(xiàng)目的身份標(biāo)識(shí) // 如果沒(méi)選擇刪除項(xiàng) if (!delItemId.length) {$promptLayer.show({ str: $message.delItemIsEmpty});return; } delTarArr = delItemId; $weuiAndroidDialog2.show($message.store.delConfirm, $message.store.delCloseBtn, $message.store.delOkBtn);};// 確認(rèn)刪除$rootScope.$on(’androidDialog2Btn1’, function () { del( delTarArr.join(’,’) ); $weuiAndroidDialog2.hide();});// 取消刪除$rootScope.$on(’androidDialog2Btn0’, function () { $weuiAndroidDialog2.hide();});var delTarArr;// 獲取要?jiǎng)h除項(xiàng)標(biāo)識(shí)function getDelId() { var delTarArr = []; $angular.forEach($scope.selectAllItem, function (v, i) {if (v) { delTarArr.push($scope.storeList[i].Sid);} }); return delTarArr;}// 刪除function del(param) { // 請(qǐng)求刪除接口 $handler.store.del( param ).then(function () {delAllJumpPage(delTarArr.length, $scope.selectAllItem.length); // 刪空跳頁(yè) });}// 刪空跳頁(yè)function delAllJumpPage(delNum, totalNum) { var curPage = $scope.pageControlCurNum; // 當(dāng)前所在頁(yè)數(shù) // 此頁(yè)刪空 跳上一頁(yè) if (delNum === totalNum)curPage = curPage - 1; $scope.loadList(curPage); $scope.pageControlCurNum = curPage;}
or
var delTarArr;$scope.del = function () { // 看是否有選中項(xiàng) $angular.forEach($scope.selectAllItem, function (v, i) {if (v) { delTarArr.push($scope.storeList[i].Sid); // 獲取選中項(xiàng) Sid } }); // 如果沒(méi)有刪除項(xiàng) if (!delTarArr.length) {$promptLayer.show({ str: $message.delItemIsEmpty});return; } // 再次確認(rèn)提示層 $weuiAndroidDialog2.show($message.store.delConfirm, $message.store.delCloseBtn, $message.store.delOkBtn);};// 確認(rèn)刪除$rootScope.$on(’androidDialog2Btn1’, function () { // 請(qǐng)求刪除接口 $handler.store.del( delTarArr.join(’,’) ).then(function () {// 刪空跳頁(yè)var curPage = $scope.pageControlCurNum; // 當(dāng)前所在頁(yè)數(shù)// 此頁(yè)刪空 跳上一頁(yè)if (delTarArr.length === $scope.selectAllItem.length) curPage = curPage - 1;$scope.loadList(curPage);$scope.pageControlCurNum = curPage; }); $weuiAndroidDialog2.hide();});// 取消刪除$rootScope.$on(’androidDialog2Btn0’, function () { $weuiAndroidDialog2.hide();});
這兩段代碼哪個(gè)相對(duì)較優(yōu)一點(diǎn)…… 雖然都挺渣的 大佬們對(duì)付看吧
一個(gè)函數(shù)只能干一件事這么做是為什么 可讀性?擴(kuò)展性?復(fù)用性?在我看來(lái)聲明函數(shù)也不是沒(méi)有成本的啊 一個(gè)函數(shù)就占內(nèi)存的一些空間呢 調(diào)用函數(shù)也沒(méi)有直接解析來(lái)的快吧~
如果是為了復(fù)用、擴(kuò)展的話 第一次寫的時(shí)候就這樣做的真的不是提前優(yōu)化嗎 以后的需求都確定不了呢 怎么知道提出的函數(shù)放在未來(lái)是通用的呢 這樣看絕對(duì)不是最佳性能的實(shí)踐啊~
提前 / 過(guò)渡優(yōu)化不是萬(wàn)惡之源嗎?~
問(wèn)題解答
回答1:就一個(gè)類而言,應(yīng)該僅有一個(gè)引起它變化的原因。在 JavaScript 中,需要用到類的場(chǎng)景并不太多,單一職責(zé)原則更多地是被運(yùn)用在對(duì)象或者方法級(jí)別上,因此本節(jié)我們的討論大多基于對(duì)象和方法。單一職責(zé)原則(SRP)的職責(zé)被定義為“引起變化的原因”。如果我們有兩個(gè)動(dòng)機(jī)去改寫一個(gè)方法,那么這個(gè)方法就具有兩個(gè)職責(zé)。每個(gè)職責(zé)都是變化的一個(gè)軸線,如果一個(gè)方法承擔(dān)了過(guò)多的職責(zé),那么在需求的變遷過(guò)程中,需要改寫這個(gè)方法的可能性就越大。此時(shí),這個(gè)方法通常是一個(gè)不穩(wěn)定的方法,修改代碼總是一件危險(xiǎn)的事情,特別是當(dāng)兩個(gè)職責(zé)耦合在一起的時(shí)候,一個(gè)職責(zé)發(fā)生變化可能會(huì)影響到其他職責(zé)的實(shí)現(xiàn),造成意想不到的破壞,這種耦合性得到的是低內(nèi)聚和脆弱的設(shè)計(jì)。因此, SRP 原則體現(xiàn)為:一個(gè)對(duì)象(方法)只做一件事情。
談一下個(gè)人見解,程序是給人讀的,一個(gè)函數(shù)的復(fù)雜度越高,讀通的成本就越高。即使是你寫的程序,幾個(gè)月后,看懂其中的意思可能就需要一會(huì)兒,何況別人也可能接手你的代碼!
程序先讓人看懂了,再談運(yùn)行的性能優(yōu)化
回答3:如果你的代碼只需要用很短的時(shí)間,不需要以后迭代,不需要提供給其他同事用,也不需要單元測(cè)試,那么隨便寫吧,功能實(shí)現(xiàn)就行了。
如果你的代碼需要被其他同事調(diào)用,需要進(jìn)行迭代,需要擴(kuò)展,需要單元測(cè)試。那還是按照規(guī)范來(lái)做吧,性能從來(lái)就不是代碼的形式?jīng)Q定的。
最簡(jiǎn)單的方法,如果你的代碼隔一個(gè)月以后自己來(lái)看,發(fā)現(xiàn)很難閱讀,很難維護(hù),很難擴(kuò)展,那還是重構(gòu)吧。
回答4:我認(rèn)為一個(gè)函數(shù)只干一件事更好 .... 鬼知道這些陰險(xiǎn)的函數(shù)會(huì)不會(huì)到處散播副作用 ... 還是只做一件事,最后把他們黏連起來(lái)使用比較好。
還有我不認(rèn)為性能上有很大差距 也許一個(gè)函數(shù)只干一件事性能還會(huì)更好。
第一段代碼相比第二段的一個(gè)明顯特點(diǎn)就是 每個(gè)函數(shù)的平均行數(shù)少了,第二個(gè)平均行數(shù)比較多。
維護(hù)編寫短小的代碼心智負(fù)擔(dān)比較小 從而維護(hù)編寫的效率高
只做一件事意味著 這個(gè)函數(shù)只要能做完這件事就可以了, 你可以輕而易舉地用別的算法實(shí)現(xiàn)的這個(gè)函數(shù)的副本直接替換。
由于編寫了眾多短小精悍的小函數(shù),組裝的時(shí)候抽象層次會(huì)高一些,更符合思考。
如果是為了復(fù)用、擴(kuò)展的話 第一次寫的時(shí)候就這樣做的真的不是提前優(yōu)化嗎
為了復(fù)用、為了拓展從來(lái)都不是 提前優(yōu)化,相反,更應(yīng)該重視這兩個(gè)
回答5:你說(shuō)得沒(méi)錯(cuò)。就是為了可讀性、擴(kuò)展性、和復(fù)用。最主要還是可讀性/可維護(hù)性。干多件事情的函數(shù)你都沒(méi)法起名呢,更別說(shuō)讓別人理解了。
過(guò)早優(yōu)化是這個(gè):「一個(gè)函數(shù)就占內(nèi)存的一些空間呢」。
相關(guān)文章:
1. 如何解決docker宿主機(jī)無(wú)法訪問(wèn)容器中的服務(wù)?2. 前端 - CSS3 box-shadow如何設(shè)置,或者用什么方法可以產(chǎn)生圖中這樣陰影的效果。3. node.js - vue-cll+sass 樣式不出來(lái) 已經(jīng)npm install sass、 sass-loader了4. html - css 如何讓文字標(biāo)題顯示在邊框上?5. docker 下面創(chuàng)建的IMAGE 他們的 ID 一樣?這個(gè)是怎么回事????6. 在應(yīng)用配置文件 app.php 中找不到’route_check_cache’配置項(xiàng)7. html按鍵開關(guān)如何提交我想需要的值到數(shù)據(jù)庫(kù)8. vim中編輯HTML文件時(shí)換行不能縮進(jìn)9. HTML5中怎么判斷用戶是否正在瀏覽頁(yè)面?10. html - 微信端video標(biāo)簽播放mp4視頻,安卓端提示視頻解析錯(cuò)誤
