麻豆黑色丝袜jk制服福利网站-麻豆精品传媒视频观看-麻豆精品传媒一二三区在线视频-麻豆精选传媒4区2021-在线视频99-在线视频a

千鋒教育-做有情懷、有良心、有品質的職業教育機構

手機站
千鋒教育

千鋒學習站 | 隨時隨地免費學

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

關注千鋒學習站小程序
隨時隨地免費學習課程

當前位置:首頁  >  技術干貨  > 什么是可維護性的代碼(下)

什么是可維護性的代碼(下)

來源:千鋒教育
發布人:qyf
時間: 2022-09-14 16:28:59 1663144139

什么是可維護性的代碼

  五、變量類型透明化

  因為 JS 是一個弱類型語言,在定義變量的時候,不會限制數據類型

  但是我們在給變量賦值的時候,也要盡可能的做到數據類型統一

  當你需要定義一些變量,在后期操作中進行賦值的時候

  盡可能在定義的時候,給一個初始值表示一下你變量將來要存儲的數據類型

  比如:

  var count = 0;

  var name = '';

  var boo = false;

  var person = null;

  var todoList = [ ];

  如果你實在不想給一個初始值

  也可以使用注釋的形式表明一下你定義的變量, 將來存儲的是什么類型的數據

  var count /* Number */;

  var name /* String */;

  var boo /* Boolean */;

  六、代碼書寫習慣

  我們要保證一個良好的代碼書寫習慣

  七、鏈式編程的習慣

  我們來看一下下面這個代碼

  [ ... ].map(function () {

  // code ...

  }).filter(function () {

  // code ...

  }).reduce(function () {

  // code ...

  })

  其實沒啥問題, 而且也挺好的

  更甚至當代碼簡單一些的時候有人把它寫成一行

  [ ... ].map(function () { ... }).filter(function () { ... }).reduce(function () { ... })

  但是到了后期修改的時候,問題就會逐步顯示,一旦修改了第一個,那么后面的都有可能會出現問題

  而且當代碼量過大的時候,很難保證你不修改串行了

  · 我們可以把上面的代碼換成下面的方式

  [ ... ]

  .map(function () {

  // code ...

  })

  .filter(function () {

  // code ...

  })

  .reduce(function () {

  // code ...

  })

  這樣的話,看起來會舒服的多

  而且可以利用編輯器的代碼折疊,一個函數一個函數的來書寫

  八、書寫運算符的習慣

  很多人喜歡相對緊湊的書寫結構

  比如下面的代碼

  if (year%4===0&&year%100!==0||year%400===0) { ... }

  很簡單的一個判斷閏年的代碼

  但是當你的運算符很緊湊的時候,那么看起來就會比較費眼睛

  相對來說,我更喜歡在運算符兩邊都加上空格

  讓結構相對松散一些,看起來可能也容易一些

  我們也不用擔心這些空格,后期處理都會幫我們處理掉的

  if ( year % 4 === 0 && year % 100 !== 0 || year % 400 === 0) { ... }

  還有一種寫法

  if (

  year % 4 === 0 &&

  year % 100 !== 0 ||

  year % 400 === 0

  ) { ... }

  這個適用于條件比較長的時候使用

  看起來會更加清晰一些

  九、函數調用傳遞參數

  · 當調用一個函數,需要傳遞一個函數作為參數的時候

  · 我們通常都會直接書寫一個匿名函數或者箭頭函數在參數位置

  · 或者說傳遞一個復雜數據類型作為參數的時候,都會直接講對應的數組或者對象寫在參數位置

  · 比如下面這段代碼

  $.get('/xxx', {

  a: 100,

  b: 200

  }, function (res) {

  // code ...

  }, 'json')

  代碼沒有問題,但是一旦對象中數據過多

  或者函數中代碼過多的時候

  后期看起來就會很復雜

  我會建議把這些內容單獨書寫出來

  var params = {

  a: 100,

  b: 200

  }

  function success(res) {

  // code ...

  }

  $.get('/xxx', params, success, 'json')

  這樣一來, 不管是修改, 還是增加一些內容, 都會比較方便了

  十、功能性函數的單獨封裝

  把我們自定義的一些功能性函數進行單獨的封裝,放在一個單獨的 JS 文件中進行引入或者導入使用,其實就是模塊化的概念

  十一、松散耦合

  對于比較難以閱讀的代碼來說,強耦合的代碼是最難閱讀的,JS 代碼本身層面上的耦合我們就不說了,大家都應該了解面向對象編程和模塊化編程

  十二、HTML 和 JavaScript 的耦合

  在前端開發中,我們經常會見到有些人寫代碼會把一些簡單的事件直接寫到 html 結構上

  <button onclick="doSomething()" ></button> 

  從代碼層面上來說完全沒有問題

  但是實際上,這個是 HTML 和 JavaScript 的強耦合現象

  第一: 每次對于代碼進行的修改,都要從 HTML 和 JavaScript 兩個位置去進行修改

  第二: 代碼引入位置不可變,一定要保證在用戶點擊之前就已經有函數存在了,不然一定會報錯的

  比較好的方法就是進行 HTML 和 JavaScript 的分離

  在 .js 文件中獲取 DOM 元素

  通過事件綁定的形式來完成操作

  var btn = document.querySelector('button')

  btn.addEventListener('click', doSomething)

  還有一種情況更常見, 就是在 JS 代碼中為了渲染頁面而進行字符串拼接

container.innerHTML = `

<div>

...

<p> ... </p>

<span> ... </span>

</div>

  這個代碼也是完全沒有問題的,而且大部分同學都會這樣書寫代碼,因為省時省力

  但是這樣的情況,一旦渲染到頁面上,出現樣式問題需要調整的時候

  我們在 HTML 結構中很難找到內容來修改,必須要到 JavaScript 代碼里面去修改

  如果我們的字符串拼接是在循環里面完成的話,那么有可能你添加一個或者刪除一個標簽的時候,導致整個頁面崩潰

  比較好的做法

  使用一些第三方小腳本或者模板引擎來進行渲染:

  比如:art-template / e.js / ...

  真的需要這樣渲染的時候,那么在原始 html 結構中以注釋的形式留下一部分渲染內容

<div class="container">

    <!-- 商品詳情信息渲染結構

    <div>

        ...

        <p> ... </p>

        <span> ... </span>

    </div>

    -->

</div>

  · 當 HTML 和 JavaScript 解耦以后

  · 可以大量節省我們的排錯時間, 和錯誤的準確定位

  十三、CSS 和 JavaScript 的耦合

  在前端的開發中,使用 JS 來操作一些元素的樣式,是在常見不過的事情了

  比如我們經常會寫

  ele.style.color = 'red' ;

  ele.style.display = 'none' ;

  這樣書寫代碼其實沒有大問題

  對于渲染也不會造成很大的困擾

  但是,一旦我們需要修改樣式的時候,那么就比較麻煩了

  因為有的樣式可能需要在 .css 文件內修改,有的樣式需要在 .js 文件內修改

  · 比較好的做法是, 把我們需要修改的樣式寫成一個單獨類名下

  · 放在 .css 文件內

  · 我們在代碼里面通過操作元素的類名來進行修改

  ele.classList.add('active')

  ele.classList.remove('active')

  這樣做保證了樣式和行為的分離,我們在調整頁面樣式的時候,不需要 JS,直接在 CSS 中修改就可以

  十四、事件處理 和 應用邏輯 的耦合

  在開發過程中, 我們經常要處理一些事件,并且在事件里面要進行一些邏輯的運算

  比如:我們在點擊登錄的時候,要對用戶填寫的內容進行一個正則的驗證,然后提交到服務器

  ele.addEventListener('submit', function () {

  let username = xxx.value

  let password = xxx.value

  // 正則驗證

  if ( ... ) { ... }

  if ( ... ) { ... }

  // 提交到服務器

  var xhr = new XMLHttpRequest()

  xhr.open( ... )

  xhr.send( ... )

  xhr.onload = function () { ... }

  })

  這是一段合法的代碼

  但是函數里面包含了太多的內容

  有事件處理

  有邏輯處理

  有請求發送

  這樣就相當于在一個函數里面做了太多的事情

  這個代碼的邏輯運算還是比較少的,但是一旦邏輯運算多了以后,那么后期閱讀的時候就很麻煩了

  我們可以把里面的邏輯運算和請求發送都單獨提取出來,變成下面這個形式:

  function validateValue(val) {

  // 正則驗證

  if ( ... ) { ... }

  if ( ... ) { ... }

  // 將驗證結果返回

  return true // or false

  }

  function sendAjax() {

  // 發送請求的業務邏輯

  }

  ele.addEventListener('submit', function () {

  let username = xxx.value

  let password = xxx.value

  // 正則驗證

  if (!validateValue( xxx )) return

  // 提交到服務器

  sendAjax()

  })

  這樣一來,只要我們給函數寫好注釋,那么后期的時候,哪里出現問題,我們可以快速準確的定位問題所在位置

  十五、尊重對象所有權

  · JavaScript 的動態天性決定了沒有什么是不能修改的

  · 從代碼層面出發,我們可以修改任何內容,包括向 Object 的 prototype 上擴展一些方法,,向 Array 的 prototype 上擴展一些方法

  · 但是在真實的企業級開發過程中,我們要絕對的尊重每一個對象的所有權

  不要修改任何不屬于你的代碼,如果某一個對象不是由你負責創建或者維護,那么你也不要修改他的構造函數

  在好久好久以前:

  我接觸過一個叫做 prototype 的第三方庫

  它里面向 document 對象上擴展了一個叫做 getElementsByClassName 的方法

  是不是看起來很無聊,但是在沒有 getElementsByClassName 的年代,確實很好用

  并且,擴展的這個 getElementsByClassName 方法的返回值是一個 Array 并不是我們后來使用的 NodeList

  而且還在實例身上擴展了一個叫做 each() 的方法,專門用來遍歷

  我們用起來的時候就會很方便

  document.getElementsByClassName('item').each()

  這個很好,而且對代碼開發進行了簡化

  但是,一旦瀏覽器廠商開始支持這個方法了,那么你的方法就會出現問題了

  后來,在所有瀏覽器廠商都支持了 getElementsByClassName 以后

  當在使用這個方法的時候,因為和原生的重名了

  會出現代碼的大面積報錯

  這個就是尊重代碼所有權

  因為你不知道瀏覽器廠商什么時候會 告知 或 不告知 的更新一些內容,或者修改一些 API

  所以,不要修改任何不屬于你的內容

  十六、盡量不聲明全局變量

  和尊重對象所有權有密切關系的就是盡可能少的聲明全局變量

  拋開變量污染的層面不說,我們的每一個全局變量其實都是在向 window 上添加成員

  var name = 'Jack'

  function getInfo() { ... }

  這都是全局變量,用起來也沒什么問題

  但是也確實是在 window 上掛載了兩個名字

  我們在開發自己的代碼的時候, 盡可能的在全局制作一個命名空間,然后把我們所有需要的內容全部放在里面

  var myApp = {

  name: 'jack',

  getInfo () { ... }

  }

  這樣一來, 我們只是向 window 上掛載了一個 myApp

  剩下的所有東西都在我自己的命名空間里面

  一旦出現問題,你能準確的知道是你自己定義的變量或者方法出現了問題,還是原生的變量或者方法出現了問題

  這個也是前端從沒有模塊化到模塊化開發的演變過程的原始階段:

  o 獨立命名空間

  o IIFE

  o AMD / CMD

  o CommonJS

  o ES6 模塊化

  十七、習慣使用常量

  我們在開發的過程中,經常要使用一些變量來操作某些內容

  o 任何出現一次以上的內容,都應該提取出來變成一個常量的定義

  o 任何一個需要顯示給用戶看到的文本內容,都應該提取出來變成一個常量

  o 任何一個變量,在定義的時候都要考慮,將來會不會發生變化,如果不發生變化,那么就直接定義成常量

  o 包括我們在操作一些類名的時候,應該把這些類名提取出來做成常量,然后統一操作

  這樣一來,我們可以避免因為不小心修改變量而導致出現的問題,也可以在代碼的各個部分保證代碼數據的統一,避免一個東西這里修改了,那里沒有修改的問題

tags:
聲明:本站稿件版權均屬千鋒教育所有,未經許可不得擅自轉載。
10年以上業內強師集結,手把手帶你蛻變精英
請您保持通訊暢通,專屬學習老師24小時內將與您1V1溝通
免費領取
今日已有369人領取成功
劉同學 138****2860 剛剛成功領取
王同學 131****2015 剛剛成功領取
張同學 133****4652 剛剛成功領取
李同學 135****8607 剛剛成功領取
楊同學 132****5667 剛剛成功領取
岳同學 134****6652 剛剛成功領取
梁同學 157****2950 剛剛成功領取
劉同學 189****1015 剛剛成功領取
張同學 155****4678 剛剛成功領取
鄒同學 139****2907 剛剛成功領取
董同學 138****2867 剛剛成功領取
周同學 136****3602 剛剛成功領取
相關推薦HOT
開班信息
北京校區
  • 北京校區
  • 大連校區
  • 廣州校區
  • 成都校區
  • 杭州校區
  • 長沙校區
  • 合肥校區
  • 南京校區
  • 上海校區
  • 深圳校區
  • 武漢校區
  • 鄭州校區
  • 西安校區
  • 青島校區
  • 重慶校區
  • 太原校區
  • 沈陽校區
  • 南昌校區
  • 哈爾濱校區
主站蜘蛛池模板: 又粗又大又爽又长又紧又水| 在线观看www成人影院| 干b视频在线观看| 亚洲一级毛片免费在线观看| 欧美电影院一区二区三区| 欧美日韩国产精品| 日本一道本| 久久精品国产99久久香蕉| 四虎永久在线精品国产免费| 三级黄色免费片| 卡通动漫精品一区二区三区| 久草网在线| 2021国产麻豆剧果冻传媒影视| 啊好深好硬快点用力视频| 午夜视频91| 国产精品久久一区二区三区| 一个人看日本www| а√在线地址最新版| 快点使劲舒服爽视频| 波多野结衣作品大全| 抱着cao才爽| 小莹的性荡生活37章| 久久这里只精品99re免费| 健身私教干了我好几次| 亚洲国产天堂久久综合2261144| 久久精品国产色蜜蜜麻豆| 日本爆乳片手机在线播放| 国内自产拍自a免费毛片| 国产破处在线| 久久久久久久综合| 免费看黄色a级片| 深夜a级毛片免费视频| 免费毛片a线观看| 美女的尿口无遮掩的照片| 精品乱码一区二区三区在线| 日本一区二区三区在线观看| 国产女主播喷水视频在线观看 | 国产91精品久久久久久久| 欧美亚洲另类综合| 欧美zoozzooz在线观看| 视频在线免费观看资源|