可以一學的代碼優化小技巧:減少if-else冗餘

来源:https://www.cnblogs.com/huaweiyun/archive/2023/01/06/17030701.html
-Advertisement-
Play Games

摘要:if-else 語句對於程式員來說,是非常非常熟悉的一個判斷語句,我們在日常開發和學習中都經常看見它。 本文分享自華為雲社區《JavaScript代碼之美—代碼優化,減少if-else冗餘的技巧》,作者:黛琳ghz。 前言 if-else 語句對於程式員來說,是非常非常熟悉的一個判斷語句,我們 ...


摘要:if-else 語句對於程式員來說,是非常非常熟悉的一個判斷語句,我們在日常開發和學習中都經常看見它。

本文分享自華為雲社區《JavaScript代碼之美—代碼優化,減少if-else冗餘的技巧》,作者:黛琳ghz。

前言

if-else 語句對於程式員來說,是非常非常熟悉的一個判斷語句,我們在日常開發和學習中都經常看見它,if-else語句主要用於需要做出選擇的地方進行判斷,這裡就不再贅述if-else語法和特點了。

我們在寫代碼(如圖下,是我以前寫的計算器項目)或看項目的時候或多或少都接觸過擁有大量if語句(簡稱“屎山”)的項目代碼,多重嵌套的if-else在維護和修改的時候真的讓人崩潰(特別是看被人的項目的時候),有時候一個 bug 排查下來,整個人都麻木了。

如圖下的計算器項目的代碼就是多重if-else的一個例子,一眼看過去就覺得很冗餘了,在功能不完善時,需要添加代碼很不方便。維護時,可讀性很差,而且很多bug。

關於R星公司(Rockstar Games游戲公司)的屎山代碼,相信很多人都有所耳聞,據說公司旗下的GTA 5游戲中迴圈19.8億次的if語句,可想而知加入游戲要多久啊。

因此,接下來我們將瞭解和學習一些優化的小技巧,來優化自己的代碼。

短路運算

什麼是短路運算,顧名思義,就是觸發到特定條件就短路,只要短路了就不會繼續往後執行。短路運算可以分為兩種邏輯運算符,分別是&&(與)和||(或)。

短路 &&

運算規則

表達式1 && 表達式2,只有所有表達式都為true,則整個表達式的運算結果才為true。根據集合的補集的思想,只要任意表達式為false,則整個表達式的運算結果為false。

只要碰到了false或者等價於false的條件就短路,只要短路了就不會繼續往後執行了,然後得到造成短路的這個值,如果不短路,得到的是第二個值

代碼測試

console.log( true && true ); // true
console.log( false && true ); // false
console.log( true && false); // false
console.log(1 && 0); // 0
console.log( undefined && 0); // undefined 
console.log(null && 1); // null

短路 ||

運算規則

表達式1 || 表達式2,只要任意表達式為true,則整個表達式的運算結果為true。

只要碰到了true或者等價於true的條件就短路,只要短路了就不會繼續往後執行了,然後得到造成短路的這個值,如果不短路,得到的是第二個值

代碼測試

​console.log( true || true ); // true
console.log( false || true ); // true
console.log( true || false); // true
console.log(1 || 0); // 1
console.log( undefined || 0); // 0 
console.log(null || 1); // 1

三元運算符

三元運算符是一種需要三個操作數的運算符,運算的結果根據給定條件決定,有時候可以用三元運算符代替簡單的if-else判斷,但是三元運算符不建議多層嵌套,可讀性較差

語法規則

條件表達式 ? 表達式1 : 表達式2

先求條件表達式的值,如果為true,則返回表達式1的執行結果;如果條件表達式的值為false,則返回表達式2的執行結果。

代碼測試

//三元表達式來判斷
var age = prompt('請輸入需要判斷的年齡:')
var status = age >= 18 ? '已成年' : '未成年'
console.log(status)
//if-else來判斷
var age = prompt('請輸入需要判斷的年齡:')
if(age>=18){
    console.log('已成年')
}else{
    console.log('未成年')
}

switch語句

語法規則

swtich(n) { 
 case 常量1 :
 要執行的語句;
 break;
 case 常量2 :
 要執行的語句;
 break;
 case 常量3 :
 要執行的語句;
 break;
 default:
 要執行的語句;
 break;
}

switch 後面的 (n) 可以是表達式,也可以(並通常)是變數。然後表達式中的值會與 case 中的數字作比較,如果與某個 case 相匹配,那麼其後的代碼就會被執行。break 的作用是防止代碼自動執行到下一行。

switch 語句和具有同樣表達式的一系列的if語句相似。很多場合下需要把同一個變數(或表達式)與很多不同的值比較,並根據它等於哪個值來執行不同的代碼。

面對多層嵌套的if-else判斷時,可以選擇使用switch語句來寫,這樣代碼可讀性更好

PS:有時候簡單的if判斷比switch語句更加簡潔

在寫讓數字1-9前面加上0時的效果,我就用過switch語句來寫,發現非常冗餘

其實一句if判斷就解決了,就是判斷這個是否小於10,如果是就在數字前加上0

設計模式—策略模式

什麼是策略模式❓

策略模式是指有一定行動內容的相對穩定的策略名稱,策略模式作為一種
軟體設計模式,指對象有某個行為,但是在不同的場景中,該行為有不同的實現演算法。

策略模式是一種行為設計模式,定義一系列演算法,將每一個演算法封裝起來,並讓它們可以相互替換。目的是實現方法的使用和實現分開。

實際運用

文章開頭我也說過,我在寫計算器項目的時候,在編寫計算器的功能時,我寫了大量的if-else語句來實現這些功能,但是這樣操作了代碼的冗餘,並且可讀性差、bug很多,因此我親切的稱呼其為“8噶機”。如下圖可以看到代碼非常冗餘,嵌套了大量的if-else來進行判斷,導致項目越寫bug越多

於是我選擇用JavaScript設計模式-策略模式來重新編寫封裝這些功能函數,使用之前我們要分清楚策略模式的兩個組成部分,一個是策略類,一個是環境類

  • 策略類(可變):封裝了具體的方法,並且負責方法的實現。
  • 環境類(不可變):接受調用,並把請求委托給某個方法,最終被客戶端調用。

一些功能圖如下,由此可知圖一為策略類,圖二為環境類

圖一

圖二

脫離這個項目,我們做一個簡單測試

代碼如下

let strategy = {
 "A": function ( salary ){
 return salary*4;
 },
 "B": function ( salary ) {
 return salary*3;
 },
 "C": function ( salary ) { 
 return salary*2;
 }
}
let calculateBonus = function ( level, salary ) { //level是指 A B C這三個對象
 return strategy[ level ]( salary );
}
console.log(calculateBonus('A', 10)) // 40

總結

JavaScript的對象可以直接創建,將函數封裝進去,這樣一來就可以減少if-else語句進行多層嵌套了,代碼顯得清晰簡潔,可讀性更好。而且代碼的維護和修改更加清晰。

 

點擊關註,第一時間瞭解華為雲新鮮技術~


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • mycode : mycode 思考 突破引導程式方法: 再寫一個程式,並且把這個程式放到存儲介質中; 主引導程式要載入這個新的程式,將控制權轉交給新的程式; 遇到的問題:怎麼在存儲介質中找這個新的程式呢? 那就需要藉助於一個文件系統,有了文件系統,就可以很方便的把寫好的程式放到軟盤裡了,也可以根據 ...
  • 目的 手裡有調試STM32的DAP-LINK,想試試通過JTAG調試ESP32 OpenOCD支持CMSIS-DAP DAP-LINK支持的晶元,我手上這款描述如下,應該JTAG協議的都支持 平臺 windows10 + ESP-IDF ESP-WROOM-32E模組 + 燒錄底座 DAP-LINK ...
  • 目錄 PostgreSQL(01): Ubuntu20.04/22.04 PostgreSQL 安裝配置記錄 PostgreSQL(02): PostgreSQL常用命令 PostgreSQL 常用命令 滿足驗證條件的用戶, 可以用psql命令進入pg的命令行交互模式 用戶管理相關 查看用戶列表 \ ...
  • 摘要:主要介紹華為雲在HBase 2.x內核所做的一些MTTR優化實踐。 本文分享自華為雲社區《華為雲在HBase MTTR上的優化實踐》,作者: 搬磚小能手。 隨著HBase在華為雲的廣泛應用,HBase的數據節點規模也越來越大。最新版本的MRS可支持的單集群HBase數據節點規模可達到1024節 ...
  • 一:背景 1. 講故事 在 SQLSERVER 中有非常多的索引,比如:聚集索引,非聚集索引,唯一索引,複合索引,Include索引,交叉索引,連接索引,奇葩索引等等,當索引多了之後很容易傻傻的分不清,比如:複合索引 和 Include索引,但又在真實場景中用的特別多,本篇我們就從底層數據頁層面釐清 ...
  • 如果覺得文章對你有幫助,點贊、收藏、關註、評論,一鍵四連支持,你的支持就是我創作最大的動力。 ❤️ 本文原創聽蟬 公眾號:碼里特別有禪 歡迎關註原創技術文章第一時間推送 ❤️ 前言 沒錯,繼Flutter 異常監控 | 框架 Catcher 原理分析 之後,帶著那顆騷動的好奇心我又搗鼓著想找其他 F ...
  • 模塊化編程 1.基本介紹 傳統的非模塊化開發有如下的缺點:(1)命名衝突(2)文件依賴 JavaScript代碼越來越龐大,JavaScript引入模塊化編程,開發者只需要實現核心的業務邏輯,其他都可以載入別人已經寫好的模塊 JavaScript使用“模塊”(module)的概念來實現模塊化編程,解 ...
  • 這裡給大家分享我在網上總結出來的一些知識,希望對大家有所幫助 微信調用jssdk全流程詳解 系統框架使用的是前後端分離,前端使用vant,後端是springboot 一、網頁授權的時序圖 二、公眾號配置 1. 綁定功能變數名稱 登錄微信公眾平臺進入“公眾號設置”的“功能設置”里填寫“JS介面安全功能變數名稱”。也就 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...