加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 建站 > 正文

重构的艺术:五个小妙招助你写出好代码!

发布时间:2019-11-05 16:53:38 所属栏目:建站 来源:读芯术
导读:糟糕的代码可以运作,但迟早会让我们支付价钱。你有没有碰着过这样的题目:几周后,你无法领略本身的代码,于是不得不花上几个小时,乃至几天的时刻来弄清晰到底产生了什么。 办理这个常见题目的要领是使代码尽也许清楚。假如做得更好的话,纵然长短技强人

可是,你是否意识到,除了转达给getNewsContent的范例字符串之外,这两个函数完全沟通?这是重构代码时常常产生的工作。凡是环境下,变动一个会导致另一个变动,以此类推,直到重构后的代码最终酿成原始代码的一半巨细。代码汇报你它必要什么:

  1. function getNews(type) { 
  2.   const allNews = getNewsFromWeb(); 
  3.   return getNewsContent(allNews, type); 
  4.  
  5. function getNewsContent(newsList, type) { 
  6.   const news = []; 
  7.   for (let i = newsList.length - 1; i >= 0; i--) { 
  8.     if (newsList[i].type === type) { 
  9.       news.push(newsList[i].content); 
  10.     } 
  11.   } 
  12.   return news; 

getJavaScriptNews, getRustNews和getGolangNews函数去了那边?将它们替代为getNews函数,该函数将消息范例作为参数吸取。这样,无论添加几多范例的消息,老是行使沟通的成果。这称为抽象,应承我们重用函数,因此很是有效。抽象是我在写代码的时辰最常用的技能之一。

(2) 增补:行使es6特征使for轮回更具可读性

for轮回并不完全可读。通过引入es6数组函数,可以有95%的机遇停止行使它们。在本例中可以行使array.filter和array.map组合来替代原始轮回:

  1. function getNews(type) { 
  2.   const allNews = getNewsFromWeb(); 
  3.   return getNewsContent(allNews, type); 
  4.  
  5. function getNewsContent(newsList, type) { 
  6.   return newsList 
  7.     .filter(newsItem => newsItem.type === type) 
  8.     .map(newsItem => newsItem.content); 

用 Array.filter 和 Array.map 来取代轮回

  • 用Array.filter只返回其范例便是作为参数转达的范例的元素。
  • 用Array.map只返回item工具的content属性,而不是整个item。

恭喜你,颠末三次简朴的重构,最初的三个函数已经缩减为两个,这更轻易领略和维护。其它,抽象让getNews函数变得可以从头操作。

重构的艺术:五个小妙招助你写出好代码!

5. 一个函数只用来做一件事

一个函数应该只做一件事。做不止一件事的函数是全部罪恶的来源,也是代码中也许碰着的最糟糕的工作之一(嵌套的if语句也是)。它们很紊乱,搞得代码难以领略。下面是一个来自现实应用措施的伟大函数示例:

  1. function startProgram() { 
  2.   if (!window.indexedDB) { 
  3.     window.alert("Browser not support indexeDB"); 
  4.   } else { 
  5.     let openRequest = indexedDB.open("store", 1); 
  6.   
  7.     openRequest.onupgradeneeded = () => {}; 
  8.   
  9.     openRequest.onerror = () => { 
  10.       console.error("Error", openRequest.error); 
  11.     }; 
  12.   
  13.     openRequest.onsuccess = () => { 
  14.       let db = openRequest.result; 
  15.     }; 
  16.   
  17.     document.getElementById('stat-op').addEventListener('click', () => {}); 
  18.     document.getElementById('pre2456').addEventListener('click', () => {}); 
  19.     document.getElementById('cpTagList100').addEventListener('change', () => {}); 
  20.     document.getElementById('cpTagList101').addEventListener('click', () => {}); 
  21.     document.getElementById('gototop').addEventListener('click', () => {}); 
  22.     document.getElementById('asp10').addEventListener('click', () => {}); 
  23.   
  24.     fetch("employeList.json") 
  25.       .then(res => res.json()) 
  26.       .then(employes => { 
  27.         document.getElementById("employesSelect").innerHTML = employes.reduce( 
  28.           (content, employe) => employe.name + "<br>", 
  29.           "" 
  30.         ); 
  31.       }); 
  32.   
  33.     document.getElementById("usernameLoged").innerHTML = `Welcome, ${username}`; 
  34.   } 

又多又伟大又让人难以领略的函数

小贴士:因为本例不必要变乱侦听器的处理赏罚措施,以是删除了它们。

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读