javascript - 最小函數準則 一個函數里只能干一件相關事情 為什么?真的有意義嗎?~
問題描述
$scope.del = function () { var delItemId = getDelId(); // 要刪除的項目的身份標識 // 如果沒選擇刪除項 if (!delItemId.length) {$promptLayer.show({ str: $message.delItemIsEmpty});return; } delTarArr = delItemId; $weuiAndroidDialog2.show($message.store.delConfirm, $message.store.delCloseBtn, $message.store.delOkBtn);};// 確認刪除$rootScope.$on(’androidDialog2Btn1’, function () { del( delTarArr.join(’,’) ); $weuiAndroidDialog2.hide();});// 取消刪除$rootScope.$on(’androidDialog2Btn0’, function () { $weuiAndroidDialog2.hide();});var delTarArr;// 獲取要刪除項標識function getDelId() { var delTarArr = []; $angular.forEach($scope.selectAllItem, function (v, i) {if (v) { delTarArr.push($scope.storeList[i].Sid);} }); return delTarArr;}// 刪除function del(param) { // 請求刪除接口 $handler.store.del( param ).then(function () {delAllJumpPage(delTarArr.length, $scope.selectAllItem.length); // 刪空跳頁 });}// 刪空跳頁function delAllJumpPage(delNum, totalNum) { var curPage = $scope.pageControlCurNum; // 當前所在頁數 // 此頁刪空 跳上一頁 if (delNum === totalNum)curPage = curPage - 1; $scope.loadList(curPage); $scope.pageControlCurNum = curPage;}
or
var delTarArr;$scope.del = function () { // 看是否有選中項 $angular.forEach($scope.selectAllItem, function (v, i) {if (v) { delTarArr.push($scope.storeList[i].Sid); // 獲取選中項 Sid } }); // 如果沒有刪除項 if (!delTarArr.length) {$promptLayer.show({ str: $message.delItemIsEmpty});return; } // 再次確認提示層 $weuiAndroidDialog2.show($message.store.delConfirm, $message.store.delCloseBtn, $message.store.delOkBtn);};// 確認刪除$rootScope.$on(’androidDialog2Btn1’, function () { // 請求刪除接口 $handler.store.del( delTarArr.join(’,’) ).then(function () {// 刪空跳頁var curPage = $scope.pageControlCurNum; // 當前所在頁數// 此頁刪空 跳上一頁if (delTarArr.length === $scope.selectAllItem.length) curPage = curPage - 1;$scope.loadList(curPage);$scope.pageControlCurNum = curPage; }); $weuiAndroidDialog2.hide();});// 取消刪除$rootScope.$on(’androidDialog2Btn0’, function () { $weuiAndroidDialog2.hide();});
這兩段代碼哪個相對較優一點…… 雖然都挺渣的 大佬們對付看吧
一個函數只能干一件事這么做是為什么 可讀性?擴展性?復用性?在我看來聲明函數也不是沒有成本的啊 一個函數就占內存的一些空間呢 調用函數也沒有直接解析來的快吧~
如果是為了復用、擴展的話 第一次寫的時候就這樣做的真的不是提前優化嗎 以后的需求都確定不了呢 怎么知道提出的函數放在未來是通用的呢 這樣看絕對不是最佳性能的實踐啊~
提前 / 過渡優化不是萬惡之源嗎?~
問題解答
回答1:就一個類而言,應該僅有一個引起它變化的原因。在 JavaScript 中,需要用到類的場景并不太多,單一職責原則更多地是被運用在對象或者方法級別上,因此本節我們的討論大多基于對象和方法。單一職責原則(SRP)的職責被定義為“引起變化的原因”。如果我們有兩個動機去改寫一個方法,那么這個方法就具有兩個職責。每個職責都是變化的一個軸線,如果一個方法承擔了過多的職責,那么在需求的變遷過程中,需要改寫這個方法的可能性就越大。此時,這個方法通常是一個不穩定的方法,修改代碼總是一件危險的事情,特別是當兩個職責耦合在一起的時候,一個職責發生變化可能會影響到其他職責的實現,造成意想不到的破壞,這種耦合性得到的是低內聚和脆弱的設計。因此, SRP 原則體現為:一個對象(方法)只做一件事情。
談一下個人見解,程序是給人讀的,一個函數的復雜度越高,讀通的成本就越高。即使是你寫的程序,幾個月后,看懂其中的意思可能就需要一會兒,何況別人也可能接手你的代碼!
程序先讓人看懂了,再談運行的性能優化
回答3:如果你的代碼只需要用很短的時間,不需要以后迭代,不需要提供給其他同事用,也不需要單元測試,那么隨便寫吧,功能實現就行了。
如果你的代碼需要被其他同事調用,需要進行迭代,需要擴展,需要單元測試。那還是按照規范來做吧,性能從來就不是代碼的形式決定的。
最簡單的方法,如果你的代碼隔一個月以后自己來看,發現很難閱讀,很難維護,很難擴展,那還是重構吧。
回答4:我認為一個函數只干一件事更好 .... 鬼知道這些陰險的函數會不會到處散播副作用 ... 還是只做一件事,最后把他們黏連起來使用比較好。
還有我不認為性能上有很大差距 也許一個函數只干一件事性能還會更好。
第一段代碼相比第二段的一個明顯特點就是 每個函數的平均行數少了,第二個平均行數比較多。
維護編寫短小的代碼心智負擔比較小 從而維護編寫的效率高
只做一件事意味著 這個函數只要能做完這件事就可以了, 你可以輕而易舉地用別的算法實現的這個函數的副本直接替換。
由于編寫了眾多短小精悍的小函數,組裝的時候抽象層次會高一些,更符合思考。
如果是為了復用、擴展的話 第一次寫的時候就這樣做的真的不是提前優化嗎
為了復用、為了拓展從來都不是 提前優化,相反,更應該重視這兩個
回答5:你說得沒錯。就是為了可讀性、擴展性、和復用。最主要還是可讀性/可維護性。干多件事情的函數你都沒法起名呢,更別說讓別人理解了。
過早優化是這個:「一個函數就占內存的一些空間呢」。
相關文章:
1. javascript - ionic1的插件如何遷移到ionic2的項目中2. java - 如何在Fragment中調用Activity的onNewIntent?3. javascript - h5上的手機號默認沒有識別4. mysql里的大表用mycat做水平拆分,是不是要先手動分好,再配置mycat5. css - 關于input標簽disabled問題6. python - 獲取到的數據生成新的mysql表7. 怎么用css截取字符?8. window下mysql中文亂碼怎么解決??9. javascript - jquery hide()方法無效10. python的文件讀寫問題?
