真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

IDE使用技巧具體有哪些

這篇文章的內(nèi)容主要圍繞IDE使用技巧具體有哪些進(jìn)行講述,文章內(nèi)容清晰易懂,條理清晰,非常適合新手學(xué)習(xí),值得大家去閱讀。感興趣的朋友可以跟隨小編一起閱讀吧。希望大家通過這篇文章有所收獲!

10年積累的成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)經(jīng)驗(yàn),可以快速應(yīng)對客戶對網(wǎng)站的新想法和需求。提供各種問題對應(yīng)的解決方案。讓選擇我們的客戶得到更好、更有力的網(wǎng)絡(luò)服務(wù)。我雖然不認(rèn)識你,你也不認(rèn)識我。但先網(wǎng)站設(shè)計(jì)制作后付款的網(wǎng)站建設(shè)流程,更有城東免費(fèi)網(wǎng)站建設(shè)讓你可以放心的選擇與我們合作。

一 背景

1 目的

欲善其事,先利其器。對于研發(fā)同學(xué),在日常的開發(fā)工作中,我們與之打交道最多的便是編程的IDE。能否高效和靈活的使用IDE,將對我們的工作效率起著舉足輕重的作用。

研發(fā)同學(xué)在開發(fā)中最主要做的兩件事分別是架構(gòu)設(shè)計(jì)和編碼,前者主要取決于大量的項(xiàng)目經(jīng)驗(yàn)積累和個人的思考深度,也是作為研發(fā)的核心競爭力,短時間內(nèi)很難快速求成;后者主要取決于日常的編碼練習(xí)和一定程度的IDE信息差,能夠通過下文中介紹的一系列技巧進(jìn)行能力的快速補(bǔ)齊和鞏固加強(qiáng)。

小編的主要目的有兩方面:

  • 一方面,對IDE的快捷操作和高效技巧,結(jié)合自己多年的實(shí)踐和理解,進(jìn)行一次系統(tǒng)性的總結(jié)和梳理。

  • 另一方面,希望通過本文系統(tǒng)性的梳理,能夠幫助更多的同學(xué)提高研發(fā)效率,無論你是剛?cè)胧植痪玫男氯?,還是有著多年開發(fā)經(jīng)驗(yàn)的專家,相信你都能夠在本文中發(fā)現(xiàn)一片新天地,讓你能夠有更多的時間和精力去做更有意義的事情。

2 定位

網(wǎng)上很多技術(shù)網(wǎng)站和個人博客,對于IDE各種技巧和便捷操作總結(jié)得非常具體且詳細(xì),對于單點(diǎn)的詳盡程度都是極具參考和學(xué)習(xí)價值的。但其對應(yīng)的問題是,這些很多很優(yōu)秀的文章,出自于不同的手筆,有各自的行文風(fēng)格,且分散在各個網(wǎng)站的散點(diǎn),難以系統(tǒng)化。

我對本文的定位是,將各種技巧以大分類的形式進(jìn)行收攏和聚合,以幫助大家構(gòu)建和完善整體的知識體系,大幅度提高開發(fā)效率。對于每個分類點(diǎn)到即止,替代咀嚼式灌輸方式的是,盡量使用漸進(jìn)式引導(dǎo)的方式。

3 普適性

JetBrains系列的IDE產(chǎn)品眾多,除了下圖之外,還有其他未列入的,如Google二次開發(fā)的Android Studio等。雖然歸為多個產(chǎn)品實(shí)例,但這些IDE的內(nèi)核都是一樣的,只是在內(nèi)核的基礎(chǔ)上額外添加了各自的語言特性。本文將以使用量最高的一款I(lǐng)DE——IDEA為例進(jìn)行展開,文中提到的絕大多數(shù)能力和技巧,在其他IDE均同樣適用,一通則百通。

IDE使用技巧具體有哪些

二 Postfix Completion

1 介紹

Postfix Completion (下稱Postfix) 是一種通過 . + 模板Key 來對當(dāng)前已經(jīng)輸出的表達(dá)式,添加和應(yīng)用預(yù)設(shè)代碼模板的編碼增強(qiáng)能力。

其核心要解決的問題是,將編碼過程中一些通用的代碼結(jié)構(gòu)范式進(jìn)行抽象和沉淀,并能在同類型的場景下,通過 . + 模板Key 的方式進(jìn)行喚醒和復(fù)用。

舉個例子,現(xiàn)在需要完成下面一段代碼的編寫,為了對name參數(shù)進(jìn)行判空保護(hù):

if (name != null) {
  
}

在普通文本編輯器中,其中 if 2次,name 4次,(){}!= 共6次,再加空格Tab和光標(biāo)切換,一共需要按鍵23次。

在IDEA編輯器中,不使用Postfix時,一共需要按鍵20次,不考慮代碼格式化的情況可以減少到16次。

在IDEA編輯器中,使用Postfix時,只需要8次,如下圖:

IDE使用技巧具體有哪些

在這個例子中,可以對比出使用Postfix前后的效果,使用之后在編碼中減少了一半的手動按鍵操作,且生成的代碼是自帶格式化的。在實(shí)際的編碼過程中,各項(xiàng)目大小和復(fù)雜度差異性雖然很大,但細(xì)化到這種基本單位的編程范式時,它們都是融會貫通的。

與上例中nn并列的Postfix,IDEA給我們預(yù)設(shè)的還有很多,下面對一些非常高頻使用的Postfix進(jìn)行梳理。

2 梳理

var

快速定義一個局部變量,自帶IDE的類型推斷

IDE使用技巧具體有哪些

notnull

快速進(jìn)行NPE的判空保護(hù):

IDE使用技巧具體有哪些

nn

同notnull,是它的簡寫,推薦用這個,更加便捷:

IDE使用技巧具體有哪些

try catch

快速對當(dāng)前語句添加try catch異常捕獲,同時IDE還會對catch中的Exception自動做類型推斷:

IDE使用技巧具體有哪些

cast

快速實(shí)現(xiàn)類型強(qiáng)轉(zhuǎn),不需要反復(fù)使用()包裹和光標(biāo)切換;配合instanceof使用時還能自動實(shí)現(xiàn)cast類型的推斷:

IDE使用技巧具體有哪些

if

快速實(shí)現(xiàn)if判斷的代碼范式:

IDE使用技巧具體有哪些

throw

快速實(shí)現(xiàn)拋異常:

IDE使用技巧具體有哪些

for

快速實(shí)現(xiàn)集合或數(shù)組的迭代:

IDE使用技巧具體有哪些

fori

快速實(shí)現(xiàn)集合或數(shù)組的帶索引值迭代;同時對整型數(shù)字也支持:

IDE使用技巧具體有哪些

sout/soutv

快速實(shí)現(xiàn)(不帶參數(shù)/帶參數(shù))的打印功能:

IDE使用技巧具體有哪些

return

快速實(shí)現(xiàn)方法中的值返回邏輯:

IDE使用技巧具體有哪些

format

快速實(shí)現(xiàn)字符串格式化:

IDE使用技巧具體有哪些

3 高級用法

擔(dān)心系統(tǒng)預(yù)設(shè)的Postfix不足以滿足我們的編碼需求,IDEA還提供了Postfix的自定義功能。

這里我以自定義一個對集合判空的代碼范式,來舉例說明自定義Postfix的流程:

1)進(jìn)入IDE設(shè)置界面,然后依次進(jìn)入Editor => General => Postfix Completion => 面板左下角加號 => Java:

IDE使用技巧具體有哪些

2)在彈起的頁面中,按照下圖進(jìn)行配置,然后保存退出設(shè)置頁。

IDE使用技巧具體有哪些

此時我們自定義的 isempty 這個Postfix即完成了,下面來看下實(shí)際使用的效果:

IDE使用技巧具體有哪些

在實(shí)際開發(fā)過程中,對于根據(jù)已經(jīng)輸入的表達(dá)式就能決定接下來代碼格式的功能,我們都能使用這種自定義方式進(jìn)行代碼的抽象和復(fù)用。

接下來介紹IDE中一種跟Postfix功能很相像,但靈活度更高的能力——Live Template。

三 Live Template

1 介紹

介紹之前可以先看一段簡短的編碼過程:

IDE使用技巧具體有哪些

上面這段編碼中,我先后使用了Live Template的以下三個模板能力:

  • psfs:定義字符串常量

  • main:添加入口函數(shù)

  • sout:實(shí)現(xiàn)日志輸出

這里我們將其和上面提到的Postfix對比來看,兩者都是提供代碼級別模板的功能。不同的是,Postfix需要一個已經(jīng)輸入的表達(dá)式和 . + 模板Key 來進(jìn)行觸發(fā),而Live Template不需要這些,它僅僅需要 模板Key 即可觸發(fā)。

Live Template提供的預(yù)設(shè)模板要比Postfix要高出一個數(shù)量級,因此這里我就不進(jìn)行一一演示,我們可以進(jìn)行設(shè)置面板,然后按照Editor => Live Templates的路徑自行查看,如下圖:

IDE使用技巧具體有哪些

2 高級用法

和Postfix一樣,Live Template也支持自定義模板,但它的自定義模板相對來說更加靈活和開放,甚至支持我們直接植入腳本。鑒于Live Template的高度靈活性,單獨(dú)介紹這塊會占據(jù)大量的篇幅,因此這里我將從幾個實(shí)際的案例場景來開拓一下思路,而具體自定義拓展過程就不詳細(xì)展開介紹了。

Key值映射

將DB中查詢到 List 結(jié)構(gòu)的數(shù)據(jù),根據(jù)Key值映射轉(zhuǎn)化為 Map 結(jié)構(gòu)的數(shù)據(jù),以便于進(jìn)行后續(xù)的數(shù)據(jù)填充邏輯:

IDE使用技巧具體有哪些

DB批量查詢

在數(shù)據(jù)查詢時,我們會有根據(jù)ID主鍵進(jìn)行批量DB數(shù)據(jù)查詢的訴求,如下:

List users = userMapper.queryUserByIds(userIds);

這種寫法會有一個弊端,就是當(dāng) userIds 大到一定的量級時,該查詢會變得非常耗時。

對于該問題其中一個解法是,將這個大的 userIds 拆分成多個批次,然后讓這多個批次異步并行去查詢。這里便使用Live Template來抽取一個針對該場景的代碼模板,如下:

IDE使用技巧具體有哪些

按照該模板,我們的查詢語句將變成這樣:

List users = batchQuery(userIds, 100, userMapper::queryUserByIds, null);

可以看到,和之前相比,多傳一個分批的size參數(shù),同時還支持指定的異步任務(wù)調(diào)度器的自定義配置,而返回結(jié)果和之前的查詢方式保持完全一致,不需要外部有額外的適配工作。

腳本植入

這個功能是我非常看好Live Template的主要原因,它的靈活性和拓展性也主要來源于這里。它支持我們通過一個 模板Key 來喚起和執(zhí)行一段腳本,這也就意味著,我們的自定義的Live Template模板是可編程的,極大程度提高了該模板的拓展性。

單描述功能會有些空洞,這里我結(jié)合一個實(shí)際案例進(jìn)行介紹,我們來實(shí)現(xiàn)一個跨電腦的代碼共享功能:

1)首先,使用python的flask框架寫一個極簡的服務(wù)端應(yīng)用并啟動,提供最簡單的 push 和 pull 的能力,如下:

from flask import Flask, request

DEFAULT = 'nothing'
code = DEFAULT

app = Flask(__name__)

@app.route('/push')
def push():
  global code
  code = request.args.get('code', DEFAULT)
  return 'Success'

@app.route('/pull')
def pull():
  return code

app.run()

2)然后,我們來通過groovy腳本實(shí)現(xiàn)一個代碼 pull 的模板,這里應(yīng)用了Live Template的 groovy script 能力,對應(yīng)腳本如下:

def url = new URL('http://127.0.0.1:5000/pull');
def conn = url.openConnection() as HttpURLConnection;
def result = conn.inputStream.text;
return result

3)最后,再實(shí)現(xiàn)代碼push的模板,腳本如下(下面的代碼入?yún)?,是通過剪切板賦值傳遞過來的):

def code = _1;
def url = new URL('http://127.0.0.1:5000/push?code=' + new URLEncoder().encode(code));
def conn = url.openConnection() as HttpURLConnection;
def result = conn.inputStream.text;
return result

此時就已經(jīng)完成了跨設(shè)備的代碼分享功能,為方便演示,這里就用 People1 和 People2 兩個類來模擬兩臺獨(dú)立的電腦。People1 將自己的一段代碼復(fù)制到剪切板中,然后通過 push 模板調(diào)用 push 接口來將這段代碼上傳到Python服務(wù)應(yīng)用中;People2 再通過 pull 腳本來調(diào)用服務(wù)端的 pull 接口,訪問到 People1 上傳的代碼并輸入到當(dāng)前的代碼編輯器中,實(shí)現(xiàn)效果如下圖:

IDE使用技巧具體有哪些

這里的代碼共享只是一個引子,除此之外,我們還能寫很多有意思的腳本,比如在IDE中查天氣、通過IDE聊天等等,自行腦補(bǔ)拓展。

介紹完Live Template之后,接下來介紹文件級別的模板——File Template。

四 File Template

1 介紹

File Template,顧名思義,對應(yīng)文件級別的模板。對于該模板,我們使用腳本的主要在于兩個場景,分別是文件頭和文件的自定義,下面結(jié)合案例依次展開。

2 自定義文件頭

按照下圖的路徑,來更改文件頭的格式,IDE就會在我們新建一個類或接口時,根據(jù)這里的配置格式來自動生成對應(yīng)的文件注釋頭。

IDE使用技巧具體有哪些

3 抽象通用Controller

看下面一段代碼,這是一個針對于User這個domain的增刪改查接口類:

package com.alibaba.ide.code.controller;

import com.alibaba.ide.code.entity.Result;
import com.alibaba.ide.code.entity.User;
import com.alibaba.ide.code.service.Condition;
import com.alibaba.ide.code.service.UserService;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;

/**
 * @author puke
 * @version 2021/2/9
 */
@RestController
@RequestMapping("api/user")
public class UserController {

    @Resource
    private UserService userService;

    @PostMapping
    public Result create(@RequestBody User record) {
        User user = userService.insert(record);
        return Result.success(user);
    }

    @PutMapping
    public Result update(@RequestBody User record) {
        User user = userService.update(record);
        return Result.success(user);
    }

    @DeleteMapping("{id}")
    public Result deleteById(@PathVariable Serializable id) {
        boolean success = userService.deleteById(id);
        return success ? Result.success() : Result.fail();
    }

    @GetMapping("{id}")
    public Result queryById(@PathVariable Serializable id) {
        User user = userService.queryById(id);
        return Result.success(user);
    }

    @GetMapping
    public Result> queryByCondition(Condition condition) {
        List list = userService.queryByCondition(condition);
        return Result.success(list);
    }
}

仔細(xì)看這段代碼會發(fā)現(xiàn),如果基于該接口再新增另一個domain對應(yīng)的Controller接口類,代碼中的基本結(jié)構(gòu)和邏輯都是可以復(fù)用的。此時,便是File Template排上用場的地方,我們定義一個通用的 Controller 模板,將共性的部分抽象到模板里,再將差異性的部分通過模板入?yún)?Subject 變量傳入進(jìn)來(注,這里需要用到Velocity 模板[1]的知識)。

#set($SubjectOfLowerFirst = ${Subject.substring(0,1).toLowerCase()} + $Subject.substring(1))
package ${PACKAGE_NAME};

import com.alibaba.ide.code.entity.Result;
import com.alibaba.ide.code.entity.${Subject};
import com.alibaba.ide.code.service.Condition;
import com.alibaba.ide.code.service.${Subject}Service;
import org.springframework.web.bind.annotation.*;

import javax.annotation.Resource;
import java.io.Serializable;
import java.util.List;

#parse("File Header.java")
@RestController
@RequestMapping("api/${SubjectOfLowerFirst}")
public class ${Subject}Controller {

    @Resource
    private ${Subject}Service ${SubjectOfLowerFirst}Service;

    @PostMapping
    public Result<${Subject}> create(@RequestBody ${Subject} record) {
        ${Subject} ${SubjectOfLowerFirst} = ${SubjectOfLowerFirst}Service.insert(record);
        return Result.success(${SubjectOfLowerFirst});
    }

    @PutMapping
    public Result<${Subject}> update(@RequestBody ${Subject} record) {
        ${Subject} ${SubjectOfLowerFirst} = ${SubjectOfLowerFirst}Service.update(record);
        return Result.success(${SubjectOfLowerFirst});
    }

    @DeleteMapping("{id}")
    public Result deleteById(@PathVariable Serializable id) {
        boolean success = ${SubjectOfLowerFirst}Service.deleteById(id);
        return success ? Result.success() : Result.fail();
    }

    @GetMapping("{id}")
    public Result<${Subject}> queryById(@PathVariable Serializable id) {
        ${Subject} ${SubjectOfLowerFirst} = ${SubjectOfLowerFirst}Service.queryById(id);
        return Result.success(${SubjectOfLowerFirst});
    }

    @GetMapping
    public Result> queryByCondition(Condition<${Subject}> condition) {
        List<${Subject}> list = ${SubjectOfLowerFirst}Service.queryByCondition(condition);
        return Result.success(list);
    }
}

模板定義完成,接下來來看一下實(shí)際的使用效果:

IDE使用技巧具體有哪些

這里使用 Goods 作為新的domain對象,可以看到,生成的 Controller 代碼已經(jīng)具備 UserController 的全部能力,并且生成的代碼全部都是 Goods 相關(guān)的api,這樣就實(shí)現(xiàn)了File Template的橫向遷移能力。

五 低頻高效快捷鍵

1 介紹

IDEA中的快捷鍵多達(dá)上百個,我們很難把每個都記清楚,網(wǎng)上也有很多對應(yīng)的總結(jié)。這里我主要梳理一些,大家使用相對比較低頻,但又非常高效的快捷鍵。

2 梳理

選擇重復(fù)元素:Control + G

通常情況下,我們可以使用 Shift + F6 對類名、方法名和變量名進(jìn)行批量更改,但對于其他元素進(jìn)行批量更改時,該快捷鍵特別合適,且不限編程語言。

IDE使用技巧具體有哪些

批量框選:Option + 鼠標(biāo)左鍵拖拽

對于"對齊"的代碼進(jìn)行批量更改的最優(yōu)解,沒有之一:

IDE使用技巧具體有哪些

整行移動:Option + Shift + ↑/↓

快速調(diào)整代碼執(zhí)行順序,免除繁瑣的剪切粘貼過程:

IDE使用技巧具體有哪些

整行/塊復(fù)制:Command + D

對于整行/塊的復(fù)制,效率遠(yuǎn)高于純手動的復(fù)制粘貼:

IDE使用技巧具體有哪些

展開/收起:Command + . or Command + Shift + +/-

前者,快速顯示/隱藏當(dāng)前方法體;后者,快速概覽當(dāng)前類的所有方法:

IDE使用技巧具體有哪些

修改方法簽名:Command + F6

在方法被多文件或多處調(diào)用時,該方式替換效率極高:

IDE使用技巧具體有哪些

查看歷史剪切板:Command + Shift + V

開發(fā)中經(jīng)常會出現(xiàn)需要復(fù)制多個文本的訴求,而PC默認(rèn)的剪切板只能保存一個,該功能專門用來解決這個痛點(diǎn):

IDE使用技巧具體有哪些

代碼抽取

代碼抽取主要用在代碼重構(gòu)的時候,以最快速度達(dá)到我們抽取一個變量、方法的目的。

1)抽局部變量:Command + Option + V

IDE使用技巧具體有哪些

2)抽成員變量:Command + Option + F

IDE使用技巧具體有哪些

3)抽靜態(tài)常量:Command + Option + C

IDE使用技巧具體有哪些

4)抽方法入?yún)ⅲ篊ommand + Option + P

IDE使用技巧具體有哪些

5)抽方法:Command + Option + M

IDE使用技巧具體有哪些

六 代碼調(diào)試

代碼調(diào)試在開發(fā)中使用的非常多,常規(guī)的單步、多步、進(jìn)入、跳出操作這里也不特殊說明了。

有一點(diǎn)值得說的就是,利用條件斷點(diǎn)來實(shí)現(xiàn)運(yùn)行期的代碼植入功能,先看下圖:

IDE使用技巧具體有哪些

可以看到,Debug模式運(yùn)行時,我們能動態(tài)改變 age 變量的值,本來被賦值為 20 的,結(jié)果輸出出來卻是 10。

這個是我在開發(fā)中無意間發(fā)現(xiàn)的一個功能,算是一個Trick了。但這個功能在實(shí)際的開發(fā)過程中特別有用,尤其針對于一些代碼改動后再次運(yùn)行的成本比較高的場景。比如Android開發(fā)過程中,能夠在不重新打整包的情況下,動態(tài)修改頁面中各個元素的樣式、接口的請求、數(shù)據(jù)的內(nèi)容等等;再比如服務(wù)端場景中,如果我們的應(yīng)用支持Debug模式,則可以通過該功能實(shí)現(xiàn)應(yīng)用無需重新部署的情況下,進(jìn)行動態(tài)更改上下文邏輯的操作。

感謝你的閱讀,相信你對“IDE使用技巧具體有哪些”這一問題有一定的了解,快去動手實(shí)踐吧,如果想了解更多相關(guān)知識點(diǎn),可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站!小編會繼續(xù)為大家?guī)砀玫奈恼拢?/p>
文章名稱:IDE使用技巧具體有哪些
網(wǎng)站URL:http://weahome.cn/article/iichcg.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部