亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

首頁 慕課教程 PyCharm 編輯器教程 PyCharm 編輯器教程 使用 PyCharm 進行代碼生成與重構

使用 PyCharm 進行代碼生成與重構

在工作學習中,我們可能會遇到下面的場景,要編寫一些想似度很高的代碼,或者需要移動某個函數到其它文件中或者類中,并且希望引用該函數的代碼都能自動更新,如果要解決上述問題,就涉及到代碼生成與重構功能。為了提高工作效率,PyCharm 提供了多種生成通用代碼結構和重復元素的方法,也提供了各種各樣的代碼重構,可自動跟蹤和更正受影響的代碼引用,本節將介紹與代碼生成與重構相關常用功能。

1. 代碼生成

1.1 使用活動模板(Live Template) 生成定制代碼

PyCharm 為許多常見代碼構造提供了大量預定義的 Live Template。我們也可定義自定義模板,以適應特定的工作流。

step1:光標停留在要展開模板的位置。
step2:輸入模板縮寫,或者打開主菜單 code -> Insert Live Template...,打開建議列表并選擇需要的模板。如圖所示:自定義模板與 IDE 預定義的模板都會顯示在列表里。

圖片描述

1.2 根據用途生成 Symbols

Python 有不同類型對象, 像類、方法或者變量。這些對象都是用字符串符號代表其名字,根據用途生成Symbols 就是根據名字所代表的對象類型,生成與之匹配的對象。

step1:引用不存在方法的名稱。IDE高亮顯示引用。按?? (Alt + Enter),然后從建議列表中選擇相應的選項。

Tips:一個 Symbol 可能是一個變量名或者一個方法名。

圖片描述

step2:選中第一項,如圖所示, Write 方法自動添加到 People 類 。

圖片描述

1.3 重寫超類的方法

step1:依然是上面的例子,Student 是 People 子類,現在想重寫父類的 speak 方法。主菜單:Code -> Override methods 或者右鍵單擊 類 Student 代碼塊中的任意位置,點擊 Generate, 然后選擇 Override methods,在彈出列表中選擇要重寫的方法。

圖片描述
step2:單擊ok, 生成新的代碼。
圖片描述

1.4 實現接口或抽象類的方法

step1:Skills是個抽象類,定義了 Write 與 Read 兩個方法, Junior 是 Skills 子類,現在需要實現抽象方法。主菜單:Code -> Implement Methods 或者右鍵單擊 類 Junior 代碼塊中的任意位置,點擊 Generate, 然后選擇 Implement Methods,在彈出列表中選擇要實現的方法。
圖片描述

Tips: 如果有多個方法需要實現,可以一次同時選擇多個方法(按住Shift)
step2:單擊ok, 生成新的代碼。

圖片描述

1.5 自動生成 Surround code 代碼片段

所謂 Surround code 就是像if…else , do…while and for loops 以及try…catch…finally這樣的語句。PyCharm 提供了基于這種代碼片段的標準模板。

step1: 光標停留在某條語句末尾。
step2: 主菜單 Code -> Surround With 或者 ? ?T ( Alt + Ctrl + T
step3: 從列表中選擇需要的語句。
圖片描述
step4:比如選擇 try / except, 相應的語句自動生成。

圖片描述

2. 代碼重構

代碼重構是在不改變代碼外在行為的前提下對代碼做出修改,以改進代碼的內部結構的過程。 PyCharm提供了各式各樣的重構,下面將介紹一些常用的重構方法。

2.1 代碼重構基本步驟

step1:選擇要重構的代碼片段。
step2:在主菜單 Refactor -> Refactor This ... 或所選內容的上下文菜單中(擊右鍵),選擇Refactor
圖片描述
step3:在打開對話框會列出所有重構項目,指定重構選項(比如:Change Signature…)。在彈出窗口執行更改,若要立即應用更改,請單擊"Refactor"。
圖片描述
Tips: 對于某些重構,可以選擇在實際執行重構之前預覽更改。在這種情況下,"預覽"按鈕在相應的對話框中可用。

step4:點擊 “Refactor”, 返回到編輯器,代碼已經被自動更新了。
圖片描述

2.2 更改簽名

更改簽名重構包括以下幾種情況:

  • 更改函數名稱;
  • 添加、刪除和重新排序參數 ( 上面的例子就是這種情況);
  • 將默認值分配給參數。

圖片描述

更改函數簽名時,PyCharm 會搜索函數的所有用法,通常調用函數的簽名會相應地更改,同時,這些更改還取決于為新參數設置的默認值。

2.3 轉換為包和模塊

PyCharm 允許 Python 模塊轉換為 Python 包,反之也可以。
step1:選擇一個 .py 文件, 比如 “test.py”;
step2:主菜單 Refactor -> Convert to Python Package 或者 選擇文件擊右鍵,如下圖所示:
圖片描述
step3:查看項目, 創建名為轉換模塊的包 (test), __init__.py 文件包含來自 .py 文件的所有代碼。
圖片描述
Tips:創建包后,通常需要修改 init.py 文件,添加包的一些初始化代碼。也可以向其添加更多新模塊。

2.4 移動和復制重構

移動重構可以項目中移動類、函數、模塊、文件和目錄。PyCharm 會跟蹤這些改變,并自動更正源代碼中對移動對象的所有引用。

將文件或目錄移動到其他目錄

  1. 在"Project"工具窗口中選擇文件或目錄;
  2. 從主菜單或擊右鍵在上下文菜單中選擇Refactor -> Move File...;
  3. 在"To directory"字段中,指定要將所選文件或文件夾移動到的文件夾。從列表中選擇現有文件夾,或鍵入要創建的父文件夾的完整路徑。

圖片描述

Tips:在選定文件后, 也可以在"Project"工具窗口中,按住 Ctrl,然后將選擇的文件拖動到目標位置。

移動頂層符號(symbols)

所謂頂層符號是頂格定義對象,像類、函數或變量,以及main 函數定義的變量。這些對象都可以移到
其它文件里。
圖片描述

  1. 在編輯器打開文件,將光標停留在某個頂層函數聲明處;
  2. 從主菜單或擊右鍵在上下文菜單中選擇Refactor -> Move...;
  3. 在彈出對話框中,選擇要移動的成員,并指定目標文件;
  4. 點擊 Refactor, 函數移動到新文件。

圖片描述
移動函數/方法到頂層

  1. 在編輯器打開文件,將光標停留在類方法聲明處。
  2. 從主菜單或擊右鍵在上下文菜單中選擇Refactor -> Move...
  3. 在彈出對話框中,指定目標文件。

圖片描述

  1. 查看移動后結果。

圖片描述

復制重構

復制重構可以在不同的或同一目錄中創建文件或目錄的副本。

  1. 在 Project 窗口中選擇文件;
  2. 從主菜單或右鍵在上下文菜單 “Refactor -> Copy File…;
  3. 在打開的 “Copy” 對話框中,指定要創建的副本的名稱和位置,然后單擊"Refactor",新的文件就會被創建在指定目錄下。

圖片描述

Tips:在選擇文件后,上下文菜單里直接選擇 copy->copy, 然后右鍵點擊目標路徑,在上下文菜單選擇 Paste 也會彈出上面的窗口。

2.5 提取重構

提取重構使源代碼更易于閱讀和維護。PyCharm 也提供了不同的方法,包括常量、方法及超類的提取等等。下面以提取方法為例介紹提取重構的過程:

  1. 在編輯器中,選擇要轉換為方法或函數的代碼塊;
  2. 從主菜單或上下文菜單中選擇 Refactor -> Extract Method…

圖片描述

Tips: 形成方法的代碼片段不一定必須是一組語句。它也可以是代碼中某處使用的表達式。

  1. 在打開的"Extract Method"對話框中,指定新函數的名稱。

圖片描述

  1. 查看結果,所選代碼片段將替換為函數調用。

圖片描述

2.6 內聯重構

內聯重構相當于提取重構的逆過程。比如上面的方法,內聯方法將方法的正文放入其調用它demo2方法的主體中。

  1. 在編輯器中,選擇要轉換的方法;
  2. 從主菜單或上下文菜單中選擇 Refactor -> inline...;
  3. 在打開的對話框 “inline method 具體的方法名“ , PyCharm 會提示選擇是在重構后刪除方法聲明還是保持其完好無損。根據選擇,重構結果會有所不同。
    圖片描述

代碼是需要抽取重構還是內聯重構,要具體問題具體分析,比如一段代碼出現在代碼多處位置,就應該有抽取重構構造新的方法。上面的方法如果被多處調用,做內聯重構也是不合適的。

除此以外,一個變量只是被簡單的賦值,然后又被其它表達式使用,那這個變量可能是冗余的,需要內聯重構去掉冗余變量??傊?,我們要通過不斷的實踐學習才能在重構過程中做出正確的判斷。

2.7 重命名重構

使用重命名重構更改symbols、文件的名稱以及在整個代碼中對它們的所有引用。

  1. 在"Project"工具窗口中選擇要重命名的文件, 或者在編輯器中選擇一個要重命名的元素(類名、方法名);
  2. 從主菜單或擊右鍵在上下文菜單中選擇 Refactor -> Rename...。
    圖片描述

在大項目內,通常模塊或者公共方法接口的名字都在編碼前事先定義好了,像上面重命名重構是極少做的,畢竟涉及很多改動,風險比較大。如果由于特殊情況需要做,也要在重構前,仔細閱讀所有引用代碼,評估其風險。

3. 小結

本節主要講解了代碼生成與代碼重構的相關功能。代碼生成更多功能的是幫助開發人員提高開發效率,在大多數情況下,還是需要在自動生成代碼基礎上修改完善的。而代碼重構更多的是保證代碼在完成基本功能前提下,更好的使代碼具有更好的適應性與可讀性,難點是分析哪些代碼需要重構,這依賴于編寫大量代碼后的經驗積累,所以,多寫代碼做更多項目才能逐漸掌握相關的知識。
圖片描述