站長資訊網
        最全最豐富的資訊網站

        VSCode中怎么進行前端重構?方法淺析

        如何使用VSCode進行前端重構?下面本篇文章給大家介紹一下在VSCode中進行前端重構的方法,希望對大家有所幫助!

        VSCode中怎么進行前端重構?方法淺析

        日常開發中,我們經常會碰到需要重構的時候,VS Code中的 “重構” 菜單給我們提供了豐富了的操作。可以幫我們更高效地完成重構工作?!就扑]學習:《vscode入門教程》】

        但是這個菜單每次提供的操作都不一樣,如果臨時去使用的話,會帶來一定的困擾。所以常有同學不敢碰這個重構功能。

        在這里,總結一下常用的一些操作,給大家做做參考。

        首先,來一個常見的重命名,熱熱身!

        重命名

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

        操作步驟:

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

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

        • VSCode 會把后續相關的名字都改掉。

        VSCode中怎么進行前端重構?方法淺析

        熱身完畢,下面我們進入正題!

        重構操作

        VSCode中怎么進行前端重構?方法淺析

        • 選中要重構的內容,鼠標右鍵選擇重構(Refactor),或者使用 Ctrl + Shift + R。

        • 根據選中的內容,可能會出現以下內容供選擇重構:

          • import/export

            • Convert default export to named export
            • Convert named export to default export
            • Convert namespace import to named export
            • Convert named imports to namepace export
          • 函數/類

            • Move to a new File
          • 變量/表達式

            • Extract constant
            • 提取到封閉范圍的 constant
            • 提取到 Module 范圍的 constant
            • Convert to optional chain expression
            • 刪除未使用的聲明
            • 在未使用的聲明前
          • 字符串

            • Convert to template string 轉換成模板字符串
          • 表達式/函數

            • Extract function
            • 提取到當前函數里的 inner function
            • 提取到 Module 范圍的 function
            • 提取到 global 范圍的 function
          • 對象方法

            • generate ‘get’ and ‘set’ accessors 生成get、set處理器
            • generate ‘get’ and ‘set’ accessors 生成get、set處理器
            • 將函數轉換成 ES2015類
            • 將所有函數轉換成類
            • 提取到 class 'xxx' 中的 Method
            • 提取到 class 'xxx' 中的 readonly field

        魔法數字

        為什么要修改魔法數字?因為除進制數之外,數字的實際意義無法被人看懂。

        目標:定義一個常量值,寫清楚改數字的實際意義。

        操作:

        • 選中魔法數字進行重構。根據需要,推薦選擇:

          • 提取到封閉范圍的 constant
          • 提取到 Module/global 范圍的 constant

          兩者都會定義一個常量,前者定義在當前函數內,后者則是整個模塊/文件中;

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

        • 使用全大寫單詞,單詞使用“_”間隔。

        例子:今年雙十一持續13天,計算除雙十一促銷結束的時間。

        function promotionEndDate() {   return new Date(new Date('2022-11-11').getTime() + 13 * 60 * 60 * 24 * 1000); }  /**  * 修改后:  * 將開始時間 START_DATE,持續的天數 LASTING_DAYS 抽取出來做成變量  * 如果只有一處使用,則在使用到的函數內定義;  * 如果多處都有用,可以考慮放在函數外,模塊內。  */ 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); }

        復雜的邏輯條件

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

        操作:

        • 選中復雜的邏輯條件進行重構。根據需要,選擇:

          • 提取到封閉范圍的 constant
          • 提取到當前函數里的 inner function
          • 提取到 Module/global 范圍的 function
        • 代碼抽離到一個新的變量/函數中,并出現重命名的輸入框;

        • 使用駝峰命名,使用 is/has 起頭,每個單詞首字母大寫。

        例子:返回指定的某個月有多少天

        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;         }     } }  /**  * 修改后  * 是否閏年在日期處理函數中會經常使用,所以將其提取到當前模塊的最外層了  */ 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); }

        寫了注釋的代碼片段

        更推薦代碼即注釋的理念。我們寫注釋之前要想明白為什么需要注釋?

        • 如果代碼本身已經很清晰,應該刪除注釋。
        • 如果抽取代碼片段,取個合適的名字,能讓代碼易于閱讀,也可以刪除注釋。

        目標:將代碼片段抽取出來做成函數,函數以此代碼塊的具體功能做命名。

        操作:

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

          • 提取到當前函數里的 inner function

        例子:ajax 請求

        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;    // 創建 - 非IE6 - 第一步   if (window.XMLHttpRequest) {     xhr = new window.XMLHttpRequest();   } else { // IE6及其以下版本瀏覽器     xhr = new window.ActiveXObject('Microsoft.XMLHTTP');   }    // 連接 和 發送 - 第二步   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() {...} }

        過長的函數

        功能拆分做成外部函數,再在內部調用。

        操作:

        • 選擇代碼塊重構,選擇:

          • 提取到 Module/Global 范圍的 function
        • 代碼塊會生成一個函數,并攜帶必要的參數

        例子:上個例子中,可以將 ajax 的接收模塊獨立成模塊的function

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

        重復的代碼/過長的文件

        操作:

        • 選擇代碼塊重構,選擇 Move to a new file

        • 代碼會遷移到以當前函數/類作為文件名的文件中;如果有多個類/函數,會以第一個類/函數做命明

        • 將函數/類使用 export 暴露出去;

        • 在原文件中用 import 引入函數/類。

        例子:日期處理函數:

        VSCode中怎么進行前端重構?方法淺析

        移動到新文件后:

        VSCode中怎么進行前端重構?方法淺析

        index.js 中,還能跳轉到定義的代碼,但是實際上并沒有引入。

        VSCode中怎么進行前端重構?方法淺析

        重命名,修復 import/export;

        VSCode中怎么進行前端重構?方法淺析

        import/export

        default 和命名、命名空間和命名的轉換。

        // named export function nextMonthDay(year, month) {}  // default export default function nextMonthDay(year, month) {}  // namepace  import * as refactor from './refactor';  // named import { nextMonthDay } from './refactor';

        對象方法

        生成get、set處理器

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

        模板字符串

        字符串拼接,快速轉換成模板字符串:

        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}`;   } }

        生成get、set處理器,與對象方法的結果類似。

        提取到 class xxx 的 Method, 與上面寫注釋的代碼、重復代碼提取的類似。

        在此不再復述。

        提供 ES 2015 類轉換,支持原型方法轉換。

        const Person = function() {   this.age = 32; }; Person.prototype.getAge = function() {   return this.age; } Person.prototype.setAge = function(value) {   return this.age = value; }  // ES 2015 類 class Person {   constructor() {     this.age = 32;   }   getAge() {     return this.age;   }   setAge(value) {     return this.age = value;   } }

        總結

        重構代碼的方法還有很多,這里暫時列了一些。希望對大家有所幫助。

        剩下的內容,大家可以在重構代碼時,多點點這個重構菜單,看看是否有驚喜。

        贊(0)
        分享到: 更多 (0)
        網站地圖   滬ICP備18035694號-2    滬公網安備31011702889846號
        主站蜘蛛池模板: 无码国内精品久久人妻蜜桃| 精品国产_亚洲人成在线高清| 久久久久人妻一区精品色| 青青青国产依人精品视频| 9191精品国产免费久久| 亚洲av无码精品网站| 国语自产精品视频在线观看| 精品视频在线v| 国产精品久线在线观看| 亚洲精品午夜无码电影网| 国产在线91精品入口| 91精品国产成人网在线观看| 国产精品igao视频网网址| 无码人妻精品一区二区三区在线| 欧美日韩国产精品 | 秋霞午夜鲁丝片午夜精品久| 囯产精品一品二区三区| 精品久久久久香蕉网| 欧美精品一区二区蜜臀亚洲| 亚洲精品蜜桃久久久久久| 中文字幕日本精品一区二区三区| 日韩福利视频精品专区| 午夜精品久久久久久| 日韩精品一二三四区| 亚洲精品第一国产综合境外资源| 无码人妻一区二区三区精品视频 | 99久久精品免费| 亚洲精品高清久久| 777被窝午夜精品影院| 四虎国产精品永久地址51| 中文字幕成人精品久久不卡| 91精品国产综合久久四虎久久无码一级| 欧美精品一区二区精品久久| 51久久夜色精品国产| 国产欧美精品专区一区二区| 久久国产综合精品五月天| 另类国产精品一区二区| 亚洲а∨天堂久久精品| 亚洲AV永久无码精品水牛影视| 欧美精品hdvideosex4k| 国产成人精品电影在线观看|