亚洲 国产精品 日韩-亚洲 激情-亚洲 欧美 91-亚洲 欧美 成人日韩-青青青草视频在线观看-青青青草影院

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

手機站
千鋒教育

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

千鋒教育

掃一掃進入千鋒手機站

領取全套視頻
千鋒教育

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

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

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

來源:千鋒教育
發布人: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
開班信息
北京校區
  • 北京校區
  • 大連校區
  • 廣州校區
  • 成都校區
  • 杭州校區
  • 長沙校區
  • 合肥校區
  • 南京校區
  • 上海校區
  • 深圳校區
  • 武漢校區
  • 鄭州校區
  • 西安校區
  • 青島校區
  • 重慶校區
  • 太原校區
  • 沈陽校區
  • 南昌校區
  • 哈爾濱校區
亚洲大尺度专区无码浪潮AV| 亚洲综合AV色婷婷国产野外 | 国产日韩AV无码免费一区二区三| 亚洲旡码A∨一区二区三区| 人妻 色综合网站| 久久精品人成免费| 国产精品 视频一区 二区三区| 伊人婷婷六月狠狠狠去| 天天躁夜夜躁狠狠夜夜| 欧美交性一级视频免费播放| 好男人好资源在线影视官网| 国产A1A2A3| 被黑人猛躁10次高潮视频| 偷窥少妇久久久久久久久| 精品成人毛片一区二区| 中文字幕在线不卡一区二区| 无码专区天天躁天天躁在线| 欧美成人精品一区二区三区色欲| 动漫高H纯肉无码视频在线观看| 在线涩涩免费观看国产精品| 天天躁夜夜躁狠狠是什么心态| 免费看永久不收费下载软件| 黑人与亚洲美女ⅩXXX| 国产AⅤ无码专区亚洲AV| 99在线精品免费视频九九视| 久久久久99精品国产片| 成人区精品人妻人妻AV| 亚洲成A人片在线观看中文无码| 日本在线观看母与子| 精品人妻系列无码人妻在线不| 国产精品毛片Av无码一区二区| 成 人 免 费 黄 色| S货叫大声点C烂你的SBXS| 亚洲国产午夜无码精品小说| 日韩人妻无码一区二区三区| 蜜桃传媒在线观看免费版7| 久久婷婷国产剧情内射白浆| 国产成人午夜福利在线小电影| 草木影视在线视频免费观看| YY111111少妇影院无码老| 亚洲超碰无码色中文字幕97| 亚洲成AV人片天堂网| 亚洲成A人片在线观看无遮挡| 亚洲AV无码一区二区三区人| 亚洲AV无码成人影院一尤物区 | 热久久美女精品天天吊色| 久久香综合精品久久伊人| 韩国三级大乳在线观看| 海角精产国品一二三区别| 国产手机AV片在线无码观你| 黑人疯狂巨大XXⅩ0O0| 久久精品国产自在天天线| 免费又黄又硬又爽大片免费| 青青草无码伊人久久| 熟妇的荡欲BD高清| 亚洲VA久久久噜噜噜久久无码 | 69女性XXXXⅩ丰满HD| 99精品久久精品一区二区| 中国老太毛茸茸XXXXHD| 曰韩无码无遮挡A级毛片| ZOMBIE视频SUPREME| 国产精品18久久久久久vr| 精品日产一卡2卡三卡4卡自拍| 美女裸体无遮挡免费视频| 日日噜噜夜夜狠狠久久丁香五月| 香蕉久久夜色精品国产| 亚洲人成电影一区二区在线| 亚洲熟妇V一区二区三区色堂| 亚洲色偷偷AV男人的天堂| 亚洲人妻AAA网站| 又爽又黄又无遮挡的视频在线观看 | 日韩中文高清在线专区| 熟妇的荡欲BD高清| 野花韩国高清免费视频6| 成人国产精品一区二区网站| 禁止18点击进入在线观看尤物| 女人张开腿扒开内裤让男生桶| 铜铜铜铜铜铜铜好大好深色板| 野花高清免费观看完整视频中文版| 在公车上拨开内裤进入毛片| 国产99久久久久久免费看| 久久天天婷婷五月俺也去| 天天摸日日添狠狠添婷婷| 正文畸情~内裤奇缘小说| 别揉我奶头~嗯~啊~免费视频| 狠狠色丁香婷婷久久综合不卡| 久久综合狠狠色综合伊人| 无码AV蜜臀AⅤ色欲在线观看| 中文字幕人妻高清乱码| 国产在线无码视频一区二区三区 | 玩弄丰满奶水的女邻居| 一面亲上边一面膜的免费| 久久久国产精品亚洲一区| 亚洲一码和欧洲二码的尺码区别| YW尤物AV无码| 国内自拍视频一区二区三区| 人妻少妇精品无码专区芭乐视网| 亚洲AV无码性色AV无码网站| 城中村快餐嫖老妇对白| 免费无码观看的AV在线播放| 无码人妻一区二区三区在线| 色欲人妻AAAAAAA无码| 亚洲成A人片77777国产| 国产乱码精品一品二品| 欧美性巨大╳╳╳╳╳高跟鞋| 熟女熟妇丰满自慰AV| 中文字幕大香视频蕉免费| 国产99在线 | 亚洲| 美女高潮黄又色高清视频免费| 亚洲AV永久无码精品水牛影视| 国产精品国产自线拍免费| 书房双乳晃动干柴烈火视频| 第一次爱的人视频播放完整版 | 亚洲AV无码片VR一区二区三区| 国产成人精品无码片区| 他趴在两腿中间舔我私密有事| 饭桌上故意张开腿让公H视频| 日韩视频中文字幕精品偷拍| 触及真心在线观看| 色婷婷亚洲十月十月色天| 第九理论午夜电影院| 天堂8А√中文在线官网| 国产成人精品2021| 午夜DY888国产精品影院| 国产色XX群视频射精| 亚洲AV无码一区二区三区网址| 国内精品久久久久久99蜜桃| 亚洲AV中文无码字幕色本草| 精品人妻视频一区二区三区| 亚洲天天做日日做天天谢日日欢| 久久精品亚洲综合专区| 又粗又大又硬毛片免费看| 麻花传媒MV在线播放高清MBA| 中文无码伦AV中文字幕在线 | 7777色情XXXX欧美| 欧美乱大交XXXXX在线观看| 啊灬啊灬啊灬快灬高潮少妇软件| 人善交VIDEOS欧美3D| 高H日本视频一区| 无码中文字幕AⅤ精品影| 狠狠噜天天噜日日噜AV| 亚洲一久久久久久久久| 麻豆WWW传媒入口| JIZZJIZZ日本护士| 色综合伊人色综合网站| 国产人成亚洲综合无码AⅤ蜜桃| 亚洲国产精品VA在线看黑人 | 黑人狂躁中国人AⅤ| 亚洲中文字幕精品久久久久久动漫| 裸体美女扒开下部无遮挡网站免费 | 99久久久精品免费观看国产| 日本熟妇XXⅩ浓密黑毛| 国产精品成人嫩草影院| 亚洲成AⅤ人在线观看无码| 久久人人爽人人爽人人片AV| BRAZZERSHD欧美巨大| 熟妇的滚烫的肉唇翻进翻出| 国内永久免费CRM系统Z在线| 亚洲伊人五月丁香激情| 欧美三级三级三级爽爽爽| 国产AV无码专区国产乱码| 亚洲爆乳AAA无码专区| 老妇做爰XXXⅩ性视频| YSL千人千色T9和T9的区别| 婷婷成人五月综合激情| 精品人妻A∨一区二区夫上司犯| 综合精品欧美日韩国产在线| 日韩在线一区二区不卡视频| 国语第一次处破女| 再深点灬舒服灬太大了AV| 日本伦奷在线播放| 韩国19禁床震无遮掩免费| 岳潮湿的大肥梅开二度第三部最新| 人妻av中年熟妇无码系列| 国产女人18毛片水真多18精品| 一本大道无码AV天堂| 人妻在夫面前被性爆| 国产呻吟久久久久久久92| 曰本伦理漂亮妈妈| 色欲av蜜臀一区二区三区多少 | 亚洲WWW永久成人网站| 男女作爱在线播放免费网站| 疯狂做受XXXX高潮不断| 亚洲熟妇AV乱码在线观看| 欧亚专线欧洲S码W MY| 国产亚洲欧美日韩二三线| 18禁美女裸体无遮挡免费观看国| 少妇99久久黑人| 久久久亚洲AV波多野结衣| 第九午夜不卡影院| 亚洲综合久久一本久道| 人人妻人人藻人人爽欧美一区| 国语自产拍精品香蕉在线播放| 99久久国产综合精品女| 小妖精好爽H快穿共妻| 免费无码AV片在线观看网站| 国产精品 视频一区 二区三区| 伊人久久东京AV| 无码人妻AⅤ一区二区三区水密桃| 两个黑人大战娇妻的小说|