代碼的壞味道——長函數

? ? ? ? 前言:一個函數應該盡量做一件事情,如果非要做多個事情,要做函數提取,每次迭代應該考慮到是否有重復代碼或者可以優化的代碼。

????????長函數:長函數的產生:

  • 邏輯是平鋪直敘的
  • 需求迭代沒有考慮優化,一次加一點

一、避免邏輯是平鋪直敘

不要把多個邏輯的事情寫到一個函數中,每個函數只做一件事情。

badCase:

methods: {fetchDataAndRender() {// 數據請求axios.get('https://api.example.com/data').then(response => {// 數據處理this.data = response.data;// DOM操作document.getElementById('result').innerText = this.data;// 事件處理document.getElementById('button').addEventListener('click', () => {alert('Data loaded successfully!');});}).catch(error => {console.error('Error fetching data: ', error);});}
}

goodCase:

// Good Case
methods: {fetchData() {axios.get('https://api.example.com/data').then(response => {this.data = response.data;}).catch(error => {console.error('Error fetching data: ', error);});},renderData() {document.getElementById('result').innerText = this.data;},handleButtonClick() {document.getElementById('button').addEventListener('click', () => {alert('Data loaded successfully!');});}
}

二、函數最大行數

每個語言的設計不太一樣,每個人對長函數的理解也不同,所以說沒有一個規范的限制,可以給自己設定一個限制,前端應盡量保持一個函數不要超過30行

badCase:

 methods: {  registerUser() {  const { username, email, password } = this.form;  if (!username || !email || !password) {  alert('所有字段都是必填項!');  return;  }  if (!/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email)) {  alert('無效的電子郵件地址!');  return;  }  if (password.length < 6) {  alert('密碼長度至少為6個字符!');  return;  }  // 假設有一個axios實例  this.axios.post('/api/register', {  username,  email,  password  })  .then(response => {  if (response.data.success) {  alert('注冊成功!');  this.$router.push('/login');  } else {  alert('注冊失敗:' + response.data.message);  }  })  .catch(error => {  console.error('注冊出錯:', error);  alert('注冊時發生錯誤,請稍后再試!');  });  }  }  

goodCase:

  methods: {  registerUser() {  if (!this.validateForm()) {  return;  }  this.sendRegistrationRequest();  },  validateForm() {  const { username, email, password } = this.form;  if (!username || !email || !password) {  alert('所有字段都是必填項!');  return false;  }  if (!/^\w+([\.-]?\w+)*@\w+([\.-]?\w+)*(\.\w{2,3})+$/.test(email)) {  alert('無效的電子郵件地址!');  return false;  }  if (password.length < 6) {  alert('密碼長度至少為6個字符!');  return false;  }  return true;  },  sendRegistrationRequest() {  this.axios.post('/api/register', this.form)  .then(response => {  if (response.data.success) {  alert('注冊成功!');  this.$router.push('/login');  } else {  alert('注冊失敗:' + response.data.message);  }  })  .catch(error => {  console.error('注冊出錯:', error);  alert('注冊時發生錯誤,請稍后再試!');  });  }  }  

三、避免重復的語句出現(if|else居多)

遇到簡單的if的語句時應當換成三元表達式,遇到if|else邏輯相似時應該抽離

badCase:

 data() {  return {  userRole: 'admin'  };  },  computed: {  welcomeMessage() {  return this.getWelcomeMessage();  }  },  methods: {  getWelcomeMessage() {  let message = '';  if (this.userRole === 'admin') {  message = '歡迎管理員!';  } else if (this.userRole === 'editor') {  message = '歡迎編輯者!';  } else if (this.userRole === 'viewer') {  message = '歡迎查看者!';  } else {  message = '歡迎訪客!';  // 假設這里還有其他邏輯,導致函數過長  // ...(省略其他邏輯)  }  // 假設這里還有更多的條件判斷和邏輯處理  // ...(省略)  return message;  }  }  

goodCase:

 data() {  return {  userRole: 'admin',  roleMessages: {  admin: '歡迎管理員!',  editor: '歡迎編輯者!',  viewer: '歡迎查看者!',  }  };  },  computed: {  welcomeMessage() {  // 使用對象查找,如果不存在則返回默認消息  return this.roleMessages[this.userRole] || '歡迎訪客!';  }  }  
}  

四、需求迭代,是否考慮到了優化?

當遇到新的需求迭代,避免不了影響之前的函數內的邏輯處理。

  • 前瞻性設計:開發一開始是否考慮到如果需求有了迭代?是否提前留好了后續的余地?
  • 童子軍軍規:需求迭代后,是否比迭代前的代碼更加干凈整潔?
  • 粒度越小越好:是否真的做到了每個函數是獨立的只做了一件事情?

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/41237.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/41237.shtml
英文地址,請注明出處:http://en.pswp.cn/web/41237.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

解決微信讀書和Apple Books導入epub電子書不顯示圖片的問題

title: 解決微信讀書和Apple Books導入epub電子書不顯示圖片的問題 tags: 個人成長 categories:雜談 最近找到一本很喜歡的書的電子版的epub版&#xff0c;發現無論是導入微信讀書&#xff0c;還是Apple家的Books, 都無法正常顯示圖片。 于是我用calibre打開epub電子書&#x…

安卓虛擬位置修改

隨著安卓系統的不斷更新&#xff0c;確保軟件和應用與最新系統版本的兼容性變得日益重要。本文檔旨在指導用戶如何在安卓14/15系統上使用特定的功能。 2. 系統兼容性更新 2.1 支持安卓14/15&#xff1a;更新了對安卓14/15版本的支持&#xff0c;確保了軟件的兼容性。 2.2 路…

linux中可執行文件為什么不能拷貝覆蓋

對于一個普通的文件&#xff0c;假如有兩個文件&#xff0c;分別是file和file1&#xff0c;我們使用 cp file1 file的方式使用file1的內容來覆蓋file的內容&#xff0c;這樣是可以的。 但是對于可執行文件來說&#xff0c;當這個文件在執行的時候&#xff0c;是不能通過cp的方…

將 KNX 接入 Home Assistant 之四 功能測試

一&#xff1a;測試標準的KNX網關功能 測試軟件識別是否正常 可以看到再ETS6和ETS5上都能正常識別 測試數據收發 可以正常發送數據 測試配置設備參數&#xff08;下載配置&#xff09; 可以看出&#xff0c;在ETS5上是可以正常下載參數的 但是 ETS6下載是失敗的&#xff…

k8s-第十一節-Job和CronJob

Job Kubernetes jobs主要是針對短時和批量的工作負載。它是為了結束而運行的&#xff0c;而不是像deployment、replicasets、replication controllers和DaemonSets等其他對象那樣持續運行。 Kubernetes Jobs會一直運行到Job中指定的任務完成。也就是說&#xff0c;如果pods給…

Pandas 學習筆記(四)--CSV文件

CSV文件 CSV&#xff08;Comma-Separated Values&#xff0c;逗號分隔值&#xff0c;有時也稱為字符分隔值&#xff0c;因為分隔字符也可以不是逗號&#xff09;&#xff0c;其文件以純文本形式存儲表格數據&#xff08;數字和文本&#xff09;。 讀取與寫入 讀取csv文件 i…

可視化作品集(08):能源電力領域

能源電力領域的可視化大屏&#xff0c;有著巨大的用武之地&#xff0c;不要小看它。 監控能源生產和消耗情況&#xff1a; 通過可視化大屏&#xff0c;可以實時監控能源生產和消耗情況&#xff0c;包括發電量、能源供應情況、能源消耗情況等&#xff0c;幫助管理者及時了解能…

C語言 | Leetcode C語言題解之第218題天際線問題

題目&#xff1a; 題解&#xff1a; struct pair {int first, second; };struct Heap {struct pair* heap;int heapSize;bool (*cmp)(struct pair*, struct pair*); };void init(struct Heap* obj, int n, bool (*cmp)(struct pair*, struct pair*)) {obj->heap malloc(si…

調制信號識別系列 (一):基準模型

調制信號識別系列 (一)&#xff1a;基準模型 說明&#xff1a;本文包含對CNN和CNNLSTM基準模型的復現&#xff0c;模型架構參考下述兩篇文章 文章目錄 調制信號識別系列 (一)&#xff1a;基準模型一、論文1、DL-PR: Generalized automatic modulation classification method b…

軟件架構之操作系統

第 2 章操作系統 本章主要介紹操作系統的基本概念及其形成、發展歷史和主要類型&#xff0c;并指出操作系統的5 大管理功能。掌握操作系統原理的關鍵在于深入理解“一個觀點、兩條線索”。一個觀點是以資源管理的觀點來定義操作系統&#xff1b;兩條線索是指操作系統如何管理計…

【計算機畢業設計】020基于weixin小程序訂餐系統

&#x1f64a;作者簡介&#xff1a;擁有多年開發工作經驗&#xff0c;分享技術代碼幫助學生學習&#xff0c;獨立完成自己的項目或者畢業設計。 代碼可以私聊博主獲取。&#x1f339;贈送計算機畢業設計600個選題excel文件&#xff0c;幫助大學選題。贈送開題報告模板&#xff…

C語言獲取當前時間

一共有兩段代碼&#xff0c;一個是獲取當前時間&#xff0c;一個是獲取到現在的總毫秒數 求關注&#x1f604; 互粉必回 獲取當前時間 #include <stdio.h> #include <time.h> int main() { time_t rawtime; struct tm * timeinfo; char buffer[20]; // 獲取當前…

Linux內核編譯與調試menuos-linux-3.18.6-在ubuntu20.04環境

1 具體操作 下載 linux-3.18.6內核 wget https://www.kernel.org/pub/linux/kernel/v3.x/linux-3.18.6.tar.xz解壓進入linux-3.18.6文件夾 tar -xvf linux-3.18.6.tar.xz cd linux-3.18.6/編譯 #make x86_64_defconfig # 為x86_64生成配置 #make alldefconfig make i3…

每天一個數據分析題(四百零十)- 主成分

實際應用中&#xff0c;關于主成分數量K的取值&#xff0c;下列說法錯誤的是&#xff08; &#xff09; A. 可以基于碎石圖進行判斷 B. 特征根從大到小排序&#xff0c;通常要求前 K 個特征根都大于 1 C. 通常要求 K 個主成分的累積方差比超過 80% D. 各個主成分之間的方向…

什么是區塊鏈的“智能合約”

區塊鏈的“智能合約”是一種存儲在區塊鏈上的計算機協議&#xff0c;它能夠自動執行合約條款&#xff0c;并在滿足預設條件時自動執行相關操作。智能合約通過編程語言&#xff08;如Solidity&#xff09;編寫&#xff0c;可以在去中心化的環境中運行&#xff0c;無需人工干預。…

spdlog一個非常好用的C++日志庫(七): 源碼分析之異常類spdlog_ex

目錄 1.自定義異常類spdlog_ex 1.1.通用異常 1.2.系統調用異常 1.3.what()函數 2.異常的使用 2.1.拋出異常 2.2.控制異常使用 1.自定義異常類spdlog_ex 標準庫異常類&#xff08;std::exception&#xff09;系列&#xff0c;能滿足大多數使用異常的場景&#xff0c;但對…

100359.統計X和Y頻數相等的子矩陣數量

1.題目描述 給你一個二維字符矩陣 grid&#xff0c;其中 grid[i][j] 可能是 X、Y 或 .&#xff0c;返回滿足以下條件的子矩陣數量&#xff1a; 包含 grid[0][0]X 和 Y 的頻數相等。至少包含一個 X。 示例 1&#xff1a; 輸入&#xff1a; grid [["X","Y",…

Avalonia中的樣式

文章目錄 前言樣式定義代碼切換樣式樣式主題前言 Avalonia的樣式是Styles,與WPF類似。用于在控件之間共享屬性設置用于在控件之間共享屬性設置,樣式由 Selector和屬性組成。 樣式定義 下面定義一個最簡單的樣式 <Window.Styles><Style Selector="TextBlock…

雙 Token 無感刷新機制實現

?作者簡介&#xff1a;熱愛Java后端開發的一名學習者&#xff0c;大家可以跟我一起討論各種問題喔。 &#x1f34e;個人主頁&#xff1a;Hhzzy99 &#x1f34a;個人信條&#xff1a;堅持就是勝利&#xff01; &#x1f49e;當前專欄&#xff1a;項目實踐 &#x1f96d;本文內容…

微信小程序性能與體驗優化

1. 合理的設置可點擊元素的響應區域大小&#xff1b; 比較常見的是頁面的點擊按鈕太小&#xff0c;用戶點擊不到按鈕&#xff0c;這樣用戶體驗很不好。 2. 避免渲染頁面耗時過長&#xff1b; 當頁面渲染時間過長的話&#xff0c;會讓用戶感覺非常卡頓&#xff0c;當出現這種…