優(yōu)化代碼分支,讓代碼更優(yōu)雅

作者:辰風(fēng)沐陽 閱讀:1765 發(fā)布時(shí)間:2023-04-03 上次更新:2023-04-08

1. 分支代碼


前端開發(fā)中經(jīng)常遇到的一個(gè)困擾,就是有的時(shí)候代碼里邊會出現(xiàn)很多的分支,下面舉了個(gè)例子,這個(gè)分支比較少,有些情況下會有幾十個(gè)分支,導(dǎo)致了代碼非常難看,那么有沒有什么辦法來優(yōu)化這個(gè)結(jié)構(gòu)呢?

JS 是一種非常靈活的語言,即便不刻意的去用一些設(shè)計(jì)模式,使用一些簡單的操作,都可以來優(yōu)化這種分支代碼

  1. function speak(name) {
  2. if (name === "老牛") {
  3. console.log("老牛哞哞叫");
  4. } else if (name === "老虎") {
  5. console.log("老虎嗷嗷叫");
  6. } else if (name === "小貓") {
  7. console.log("小貓喵喵叫");
  8. } else {
  9. console.log("不知道怎么叫");
  10. }
  11. }
  12. speak("老牛");

2. 對象映射


使用一個(gè)對象進(jìn)行映射,這樣代碼就簡單很多,無論有多少分支,都會被轉(zhuǎn)換為兩個(gè)分支,并且很容易擴(kuò)展新的內(nèi)容

  1. function speak(name) {
  2. const map = {
  3. 老牛: "老牛哞哞叫",
  4. 老虎: "老虎嗷嗷叫",
  5. 小貓: "小貓喵喵叫",
  6. };
  7. if (map[name]) {
  8. console.log(map[name]);
  9. } else {
  10. console.log("不知道怎么叫");
  11. }
  12. }
  13. speak("老牛");

這種映射方式在開發(fā)中一般用于狀態(tài)值轉(zhuǎn)為具體名稱時(shí)使用

  1. function statusText(status) {
  2. const map = {
  3. "-1": "已取消",
  4. 0: "待付款",
  5. 1: "待發(fā)貨",
  6. 2: "待收貨",
  7. 3: "已完成",
  8. };
  9. return map[status] ?? "";
  10. }
  11. statusText(1)

3. 映射函數(shù)


當(dāng) name 參數(shù)匹配到某一個(gè)屬性時(shí),就一定會輸出,萬一不能分支里邊做的事情不一樣呢 ?比如:老牛是要將內(nèi)容輸出,老虎是將內(nèi)容寫入文件,小貓是將內(nèi)容發(fā)送到服務(wù)器。我們可以改進(jìn)代碼,將每個(gè)屬性對應(yīng)的東西改為一個(gè)函數(shù)

  1. function speak(name) {
  2. const map = {
  3. 老牛: () => console.log("老牛哞哞叫"),
  4. 老虎: () => console.log("老虎嗷嗷叫".repeat(3)),
  5. 小貓: () => {
  6. for (let index = 0; index < 3; index++) console.log(index);
  7. },
  8. };
  9. if (map[name]) {
  10. map[name]();
  11. } else {
  12. console.log("不知道怎么叫");
  13. }
  14. }
  15. speak("小貓");

4. 終極代碼


如果說代碼更復(fù)雜一點(diǎn)呢,比如:判斷條件不一定是 name 等于某一個(gè)值,也就是判斷條件不同時(shí)

現(xiàn)有代碼如下所示,因?yàn)榕袛鄺l件不同,所以不能根據(jù)對象的鍵名映射了

  1. function speak(name) {
  2. if (name.includes("牛")) {
  3. console.log(name + "哞哞叫");
  4. } else if (name.endsWith("貓")) {
  5. console.log(name + "喵喵叫");
  6. } else {
  7. console.log("不知道怎么叫");
  8. }
  9. }

優(yōu)化后代碼如下所示,在 map 中定義判斷條件和執(zhí)行邏輯的函數(shù)

  1. function speak(name) {
  2. const map = [
  3. [() => name.includes("牛"), () => console.log(name + "哞哞叫")],
  4. [() => name.endsWith("貓"), () => console.log(name + "喵喵叫")],
  5. ];
  6. const item = map.find(item => item[0]());
  7. if (item) {
  8. item[1]();
  9. } else {
  10. console.log("不知道怎么叫");
  11. }
  12. }
  13. speak("小貓");

標(biāo)簽: JavaScript