使用sonarLint插件优化代码臭味

这里写自定义目录标题

    • 插件安装
    • 几种代码臭味
    • 优化示例

插件安装

下载离线插件 org.sonarlint.eclipse.site-3.6.0.201806071228-RELEASE.zip

安装步骤如下:

1)在Eclipse菜单条中找到Help栏,选择Help->InstallNew Software

2)弹出Install界面,点击“Add”,弹出“AddRepository”界面,自己定义一个name。点击Archive。选择已下载的zip文件,点击OK进行安装。

3)选择选择所有组件,点击next会进行对应的检查。

4)选择允许协议,点击“Finish”開始安装

5)等待一段时间。成功安装后,会弹出“Software Updates”界面提示须要重新启动Eclipse使安装生效。点击“Yes”,重新启动之后就能够使用了。

插件使用:

1)Eclipse工具栏选择Window->Show View->other

2)弹出“Show View”界面,输入Sonar,选择“SonarLintIssues”点击“OK”

3)打开需要进行代码审查的java或js文件,SonarLint将会自动进行代码审查,在控制台输出审查结果

4)SonarLint默认在打开文件的时候自动进行代码审查。如果不想使用自动审查,设置方法:右键单击项目->Properties->SonarLint->取消“Run SonarLint automatically”->Apply->OK

5)手动审查:右键审查文件->SonarLint->Analyze分析文件

几种代码臭味

1)代码命名规范。

一般习惯:
包名:xxyyzz
类名、接口名:XxYyZz
变量名、方法名:xxYyZz
常量名:XX_YY_ZZ

2)重复的代码

多个地方出现相同的程序结构,需设法将它们合而为一

其它不多做解释,插件会主动嗅出。

1、重复代码(Duplicated Code)
2、过长函数(Long Method)
3、过大的类(Large Class)
4、过长的参数列(Long Parameter List)
5、发散式变化(Divergent Change)
6、霰弹式修改(Shotgun Surgery)
7、依恋情结(Feature Envy)
8、数据泥团(Data Clumps)
9、基本类型偏执(Primitive Obsession)
10、switch惊悚现身(Switch Statements)
11、平行继承体系(Parallel Inheritance Hierarchies)
12、冗赘类(Lazy Class)
13、夸夸其谈未来性(Speculative Generality)
14、令人迷惑的暂定字段(Temporary Field)
15、过度耦合的消息链(Message Chains)
16、中间人(Middle Man)
17、押昵关系(Inappropriate Intimacy)
18、异曲同工的类(Alternative Classes with Different Interfaces)
19、不完美的库类(Incomplete Library Class)
20、纯稚的数据类(data Class)
21、被拒绝的馈赠(Refused Bequest)
22、过多的注释(Comments)

优化示例

1 TODO可视为一种协议

Noncompliant Code Example
void doSomething() {
// TODO
}
Compliant Solution
void doSomething() {
}

2 try catch的输出

Noncompliant Code Example
try {
/* … /
} catch(Exception e) {
e.printStackTrace(); // Noncompliant
}
Compliant Solution
try {
/
… */
} catch(Exception e) {
LOGGER.log(“context”, e);
}

3 try catch的捕获

Noncompliant Code Example
try {
/* … /
} catch (Exception e) {
if(e instanceof IOException) { /
/ } // Noncompliant
if(e instanceof NullPointerException{ /
/ } // Noncompliant
}
Compliant Solution
try {
/
/
} catch (IOException e) { /
/ } // Compliant
} catch (NullPointerException e) { /
… */ } // Compliant

4 参数命名不规范

Noncompliant Code Example
public void doSomething(int my_param) {
int LOCAL;

}
Compliant Solution
public void doSomething(int myParam) {
int local;

}

5 代码可读性和性能更高,认为isEmpty较优

Noncompliant Code Example
if (myCollection.size() == 0) { // Noncompliant
/* … /
}
Compliant Solution
if (myCollection.isEmpty()) {
/
… */
}

6 简化构造函数,无需声明类型

Noncompliant Code Example
List strings = new ArrayList(); // Noncompliant
Map map = new HashMap(); // Noncompliant
Compliant Solution
List strings = new ArrayList<>();
Map map = new HashMap<>();

7 认为单字母字符串的indexof调用,此方式性能更佳。(个人不认为有必要改,但会被插件嗅出)

Noncompliant Code Example
String myStr = “Hello World”;
// …
int pos = myStr.indexOf(“W”); // Noncompliant
// …
int otherPos = myStr.lastIndexOf(“r”); // Noncompliant
// …
Compliant Solution
String myStr = “Hello World”;
// …
int pos = myStr.indexOf(‘W’);
// …
int otherPos = myStr.lastIndexOf(‘r’);
// …

你可能感兴趣的:(优化,臭味道,sonar)