欧美一区二区三区老妇人-欧美做爰猛烈大尺度电-99久久夜色精品国产亚洲a-亚洲福利视频一区二区

VSCode中如何進(jìn)行前端重構(gòu)

這篇文章主要介紹“VSCode中如何進(jìn)行前端重構(gòu)”,在日常操作中,相信很多人在VSCode中如何進(jìn)行前端重構(gòu)問(wèn)題上存在疑惑,小編查閱了各式資料,整理出簡(jiǎn)單好用的操作方法,希望對(duì)大家解答”VSCode中如何進(jìn)行前端重構(gòu)”的疑惑有所幫助!接下來(lái),請(qǐng)跟著小編一起來(lái)學(xué)習(xí)吧!

創(chuàng)新互聯(lián)-專(zhuān)業(yè)網(wǎng)站定制、快速模板網(wǎng)站建設(shè)、高性?xún)r(jià)比廬陽(yáng)網(wǎng)站開(kāi)發(fā)、企業(yè)建站全套包干低至880元,成熟完善的模板庫(kù),直接使用。一站式廬陽(yáng)網(wǎng)站制作公司更省心,省錢(qián),快速模板網(wǎng)站建設(shè)找我們,業(yè)務(wù)覆蓋廬陽(yáng)地區(qū)。費(fèi)用合理售后完善,十余年實(shí)體公司更值得信賴(lài)。

重命名

為什么要重命名:命名不清晰,無(wú)法讓人理解。

操作步驟:

  • 選中變量名,鼠標(biāo)右鍵選擇重命名符號(hào)(Rename Symbol),或者使用快捷鍵 F2

  • 彈出框輸入想要修改的名字;

  • VSCode 會(huì)把后續(xù)相關(guān)的名字都改掉。

重構(gòu)操作

  • 選中要重構(gòu)的內(nèi)容,鼠標(biāo)右鍵選擇重構(gòu)(Refactor),或者使用 Ctrl + Shift + R

  • 根據(jù)選中的內(nèi)容,可能會(huì)出現(xiàn)以下內(nèi)容供選擇重構(gòu):

    • generate ‘get’ and ‘set’ accessors 生成get、set處理器

    • 將函數(shù)轉(zhuǎn)換成 ES2015類(lèi)

    • 將所有函數(shù)轉(zhuǎn)換成類(lèi)

    • 提取到 class 'xxx' 中的 Method

    • 提取到 class 'xxx' 中的 readonly field

    • generate ‘get’ and ‘set’ accessors 生成get、set處理器

    • Extract function

    • 提取到當(dāng)前函數(shù)里的 inner function

    • 提取到 Module 范圍的 function

    • 提取到 global 范圍的 function

    • Convert to template string 轉(zhuǎn)換成模板字符串

    • Extract constant

    • 提取到封閉范圍的 constant

    • 提取到 Module 范圍的 constant

    • Convert to optional chain expression

    • 刪除未使用的聲明

    • 在未使用的聲明前

    • Move to a new File

    • Convert default export to named export

    • Convert named export to default export

    • Convert namespace import to named export

    • Convert named imports to namepace export

    • import/export

    • 函數(shù)/類(lèi)

    • 變量/表達(dá)式

    • 字符串

    • 表達(dá)式/函數(shù)

    • 對(duì)象方法

    • 類(lèi)

魔法數(shù)字

為什么要修改魔法數(shù)字?因?yàn)槌M(jìn)制數(shù)之外,數(shù)字的實(shí)際意義無(wú)法被人看懂。

目標(biāo):定義一個(gè)常量值,寫(xiě)清楚改數(shù)字的實(shí)際意義。

操作:

  • 選中魔法數(shù)字進(jìn)行重構(gòu)。根據(jù)需要,推薦選擇:

    兩者都會(huì)定義一個(gè)常量,前者定義在當(dāng)前函數(shù)內(nèi),后者則是整個(gè)模塊/文件中;

    • 提取到封閉范圍的 constant

    • 提取到 Module/global 范圍的 constant

  • 代碼抽取到新的變量中,并出現(xiàn)重命名的輸入框;

  • 使用全大寫(xiě)單詞,單詞使用“_”間隔。

例子:今年雙十一持續(xù)13天,計(jì)算除雙十一促銷(xiāo)結(jié)束的時(shí)間。

function promotionEndDate() {
  return new Date(new Date('2022-11-11').getTime() + 13 * 60 * 60 * 24 * 1000);
}

/**
 * 修改后:
 * 將開(kāi)始時(shí)間 START_DATE,持續(xù)的天數(shù) LASTING_DAYS 抽取出來(lái)做成變量
 * 如果只有一處使用,則在使用到的函數(shù)內(nèi)定義;
 * 如果多處都有用,可以考慮放在函數(shù)外,模塊內(nèi)。
 */
function promotionEndDate() {
    const START_DATE = '2022-11-11';
    const LASTING_DAYS = 13;
    return new Date(new Date(START_DATE).getTime() + LASTING_DAYS * 60 * 60 * 24 * 1000);
}

復(fù)雜的邏輯條件

為什么要修改復(fù)雜邏輯?復(fù)雜的邏輯,往往條件判斷繁多,閱讀難度比較高。

操作:

  • 選中復(fù)雜的邏輯條件進(jìn)行重構(gòu)。根據(jù)需要,選擇:

    • 提取到封閉范圍的 constant

    • 提取到當(dāng)前函數(shù)里的 inner function

    • 提取到 Module/global  范圍的 function

  • 代碼抽離到一個(gè)新的變量/函數(shù)中,并出現(xiàn)重命名的輸入框;

  • 使用駝峰命名,使用 is/has起頭,每個(gè)單詞首字母大寫(xiě)。

例子:返回指定的某個(gè)月有多少天

function monthDay(year, month) {
    var day31 = [1, 3, 5, 7, 8, 10, 12];
    var day30 = [4, 6, 9, 11];
    if (day31.indexOf(month) > -1) {
        return 31;
    } else if (day30.indexOf(month) > -1) {
        return 30;
    } else {
        if ((year % 4 == 0) && (year % 100 != 0 || year % 400 == 0)) {
            return 29;
        } else {
            return 28;
        }
    }
}

/**
 * 修改后
 * 是否閏年在日期處理函數(shù)中會(huì)經(jīng)常使用,所以將其提取到當(dāng)前模塊的最外層了
 */
function monthDay(year, month) {
    ...
    if (day31.indexOf(month) > -1) {
        return 31;
    } else if (day30.indexOf(month) > -1) {
        return 30;
    } else {
        if (isLeapYear(year)) {
            return 29;
        } else {
            return 28;
        }
    }
}

function isLeapYear(year) {
    return (year % 4 == 0) && (year % 100 != 0 || year % 400 == 0);
}

寫(xiě)了注釋的代碼片段

更推薦代碼即注釋的理念。我們寫(xiě)注釋之前要想明白為什么需要注釋?zhuān)?/p>

  • 如果代碼本身已經(jīng)很清晰,應(yīng)該刪除注釋。

  • 如果抽取代碼片段,取個(gè)合適的名字,能讓代碼易于閱讀,也可以刪除注釋。

目標(biāo):將代碼片段抽取出來(lái)做成函數(shù),函數(shù)以此代碼塊的具體功能做命名。

操作:

  • 選擇代碼塊,重構(gòu)(Refactor)。選擇:

    • 提取到當(dāng)前函數(shù)里的 inner function

例子:ajax 請(qǐng)求

function ajax(options) {
  options = options || {};
  options.type = (options.type || 'GET').toUpperCase();
  options.dataType = options.dataType || 'json';
  const READY_STATE = 4;
  const NET_STATUS = {
    OK: 200,
    RIDERCT: 300
  };
  const params = this.formatAjaxParams(options.data);
  let xhr;

  // 創(chuàng)建 - 非IE6 - 第一步
  if (window.XMLHttpRequest) {
    xhr = new window.XMLHttpRequest();
  } else { // IE6及其以下版本瀏覽器
    xhr = new window.ActiveXObject('Microsoft.XMLHTTP');
  }

  // 連接 和 發(fā)送 - 第二步
  if (options.type === 'GET') {
    ...
  } else if (options.type === 'POST') {
    ...
  }
  
  // 接收 - 第三步
  xhr.onreadystatechange = function () {
    if (xhr.readyState === READY_STATE) {
      ...
    }
  };
}

// 修改后
function ajax(options) {
  ...
  let xhr;

  create();
  connectAndSend();
  recieve();

  function create() {...}
  function connectAndSend() {...}
  function recieve() {...}
}

過(guò)長(zhǎng)的函數(shù)

功能拆分做成外部函數(shù),再在內(nèi)部調(diào)用。

操作:

  • 選擇代碼塊重構(gòu),選擇:

    • 提取到 Module/Global  范圍的 function

  • 代碼塊會(huì)生成一個(gè)函數(shù),并攜帶必要的參數(shù)

例子:上個(gè)例子中,可以將 ajax 的接收模塊獨(dú)立成模塊的function

function ajax(options) {
  ...

  create();
  recieve();
  connectAndSend(options, xhr, params);
}
function connectAndSend(options, xhr, params) {
  if (options.type === 'GET') {
    ...
  } else if (options.type === 'POST') {
    ...
  }
}

重復(fù)的代碼/過(guò)長(zhǎng)的文件

操作:

  • 選擇代碼塊重構(gòu),選擇 Move to a new file

  • 代碼會(huì)遷移到以當(dāng)前函數(shù)/類(lèi)作為文件名的文件中;如果有多個(gè)類(lèi)/函數(shù),會(huì)以第一個(gè)類(lèi)/函數(shù)做命明

  • 將函數(shù)/類(lèi)使用 export 暴露出去;

  • 在原文件中用 import 引入函數(shù)/類(lèi)。

import/export

default 和命名、命名空間和命名的轉(zhuǎn)換。

// named
export function nextMonthDay(year, month) {}

// default
export default function nextMonthDay(year, month) {}

// namepace 
import * as refactor from './refactor';

// named
import { nextMonthDay } from './refactor';

對(duì)象方法

生成get、set處理器

const person = {
  age: 32
};

// 生成get、set處理器
const person = {
  _age: 32,
  get age() {
    return this._age;
  },
  set age(value) {
    this._age = value;
  },
};

模板字符串

字符串拼接,快速轉(zhuǎn)換成模板字符串:

class Person{
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  getFullName() {
    return this.firstName + ' ' + this.lastName;
  }
}

// 模板字符串
class Person{
  constructor(firstName, lastName) {
    this.firstName = firstName;
    this.lastName = lastName;
  }
  getFullName() {
    return `${this.firstName} ${this.lastName}`;
  }
}

類(lèi)

生成get、set處理器,與對(duì)象方法的結(jié)果類(lèi)似。

提取到 class xxx 的 Method, 與上面寫(xiě)注釋的代碼、重復(fù)代碼提取的類(lèi)似。

在此不再?gòu)?fù)述。

提供 ES 2015 類(lèi)轉(zhuǎn)換,支持原型方法轉(zhuǎn)換。

const Person = function() {
  this.age = 32;
};
Person.prototype.getAge = function() {
  return this.age;
}
Person.prototype.setAge = function(value) {
  return this.age = value;
}

// ES 2015 類(lèi)
class Person {
  constructor() {
    this.age = 32;
  }
  getAge() {
    return this.age;
  }
  setAge(value) {
    return this.age = value;
  }
}

到此,關(guān)于“VSCode中如何進(jìn)行前端重構(gòu)”的學(xué)習(xí)就結(jié)束了,希望能夠解決大家的疑惑。理論與實(shí)踐的搭配能更好的幫助大家學(xué)習(xí),快去試試吧!若想繼續(xù)學(xué)習(xí)更多相關(guān)知識(shí),請(qǐng)繼續(xù)關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編會(huì)繼續(xù)努力為大家?guī)?lái)更多實(shí)用的文章!

網(wǎng)站標(biāo)題:VSCode中如何進(jìn)行前端重構(gòu)
新聞來(lái)源:http://chinadenli.net/article4/gghiie.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供全網(wǎng)營(yíng)銷(xiāo)推廣標(biāo)簽優(yōu)化品牌網(wǎng)站制作服務(wù)器托管品牌網(wǎng)站設(shè)計(jì)微信小程序

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

成都app開(kāi)發(fā)公司