1. 機能的背景
会社はプロジェクトのコード統計を実施したいと考えていましたが、カテゴリが多すぎて 1 つずつデータを取得するのは不可能だったので、Statistic プラグインを思いつきました。統計プラグインの使用方法を見てみましょう。
2. 統計プラグイン
まず、Idea 統計プロジェクトのコードの行数を知る必要があります。主に Statistic プラグインを使用してカウントします。次の図に示すように、[ファイル]、[設定] の順にクリックします。
以下の図に示すように、設定インターフェイスに入ったら、「プラグイン」をクリックし、次に中央にある「マーケットプレイス」をクリックします。
「統計」を検索して選択し、右側の「インストール」をクリックしてプラグインをインストールします。インストールが完了したら、「適用」->「OK」をクリックします。
左下隅に統計が表示されます。表示されない場合は、アイデアをやり直してください。
3. コード量をカウントする
以下に示すように、タスクバーの「統計」タブをクリックします。
現時点では統計はありません。統計が必要な場合は、以下に示すように、[更新] をクリックしてプロジェクト コードをスキャンしてください。
概要パラメータ説明(javaなど)
- カウント: Java ファイルの数
- サイズ SUM: すべての Java ファイルが占めるハードディスクの合計サイズ
- サイズ MIN: Java ファイルが占有するハードディスクの最小サイズ
- サイズ MAX: Java ファイルが占有するハードディスクの最大サイズ
- サイズ AVG: Java ファイルが占める平均ハードディスク サイズ
- 行数: Java ファイル内の総行数
- Lines MIN: Java ファイル内の最小行数
- 行数 MAX: Java ファイルの最大行数
- Lines AVG: Java ファイルの平均行数
上記の統計はすべてコードです。対応するタイプのコードをカウントする場合、Java など、カウントする必要があるラベルをクリックすると、以下に示すように、対応するオブジェクトのコード統計を確認できます。
指定されたファイルタイプ (Java など) の統計パラメータの説明
- 合計行数: コードの合計行数 (コメント、空白行を含む)
- ソースコード行数: ソースコード行数(コメント、空行を除く)
- ソース コード行数(%): ソース コード行数の割合 (ソース コード行数/合計行数)
- コメント行: コメント行数
- コメント行(%): コメント行の割合(コメント行/総行数)
- 空白行: 空白行の数
- 空白行(%): 空白行/合計行
エンジニアリング プロジェクトのコード量をさまざまなタイプおよびさまざまな次元で数えることができ、プロジェクト内のコードの行数を数えることができることがわかります。
4. 試してみる
私は数字をでっち上げるためにここにいるだけであることを認めます〜
任意のクラスを見つけてここで使用してくださいInitDataConfig.java
package com.maple.inputdb.config;
import com.maple.inputdb.bean.InitModel;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
/**
* @author 笑小枫 <https://xiaoxiaofeng.com/>
* @date 2023/3/10
*/
@Slf4j
@Component
@AllArgsConstructor
public class InitDataConfig {
private final DynamicDatasourceConfig dynamicDatasourceConfig;
private final InitConfigProperties initConfigProperties;
public void initData(InitModel initModel) {
if (DbStatusSingleton.getInstance().getDbStatus()
|| Boolean.TRUE.equals(dynamicDatasourceConfig.checkDataSource())) {
throw new RuntimeException("数据已完成初始化,请勿重复操作");
}
// 检查数据库连接是否正确
checkConnection(initModel);
if (!new File(initConfigProperties.getInitFilePath() + initConfigProperties.getInitUserName()).exists()) {
File file = createFile(initConfigProperties.getInitFilePath(), initConfigProperties.getInitUserName());
try (FileWriter out = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(out)) {
bw.write("userName=" + initModel.getSysUserName());
bw.newLine();
bw.write("password=" + initModel.getSysPassword());
bw.flush();
} catch (IOException e) {
log.info("写入管理员信息文件失败", e);
throw new RuntimeException("写入管理员信息文件失败,请重试");
}
}
if (!new File(initConfigProperties.getInitFilePath() + initConfigProperties.getInitDbName()).exists()) {
File file = createFile(initConfigProperties.getInitFilePath(), initConfigProperties.getInitDbName());
try (FileWriter out = new FileWriter(file);
BufferedWriter bw = new BufferedWriter(out)) {
bw.write(String.format("jdbcUrl=jdbc:mysql://%s:%s/%s?autoReconnect=true&autoReconnectForPools=true&useUnicode=true&characterEncoding=UTF-8",
initModel.getDatabaseHost(), initModel.getDatabasePort(), initModel.getDatabaseName()));
bw.newLine();
bw.write("username=" + initModel.getUser());
bw.newLine();
bw.write("password=" + initModel.getPassword());
bw.newLine();
bw.write("driverClassName=com.mysql.cj.jdbc.Driver");
bw.flush();
} catch (IOException e) {
log.info("写入数据库文件失败", e);
throw new RuntimeException("写入数据库文件失败,请重试");
}
}
boolean isOk = dynamicDatasourceConfig.checkDataSource();
if (!isOk) {
throw new RuntimeException("初始化数据库信息失败,请检查配置是否正确");
}
}
/**
* 检查数据库连接是否正确
*
* @param initModel 连接信息
*/
private void checkConnection(InitModel initModel) {
try {
Class.forName("com.mysql.cj.jdbc.Driver");
Connection conn = DriverManager.getConnection(String.format("jdbc:mysql://%s:%s/%s",
initModel.getDatabaseHost(), initModel.getDatabasePort(), initModel.getDatabaseName()), initModel.getUser(), initModel.getPassword());
log.info("校验数据库连接成功,开始进行数据库配置" + conn.getCatalog());
conn.close();
} catch (SQLException | ClassNotFoundException e) {
log.info("校验数据库连接失败", e);
throw new RuntimeException("初始化数据库信息失败,请检查配置是否正确:" + e.getMessage());
}
}
private File createFile(String path, String fileName) {
File pathFile = new File(path);
if (pathFile.mkdirs()) {
log.info(path + " is not exist, this is auto created.");
}
File file = new File(path + File.separator + fileName);
try {
if (!file.createNewFile()) {
throw new RuntimeException(String.format("创建%s文件失败,请重试", fileName));
}
} catch (IOException e) {
log.error(String.format("创建%s文件失败", fileName), e);
throw new RuntimeException(String.format("创建%s文件失败,请重试", fileName));
}
return file;
}
public void deleteFile() {
File sqlFile = new File(initConfigProperties.getInitFilePath() + initConfigProperties.getInitDbName());
if (sqlFile.exists()) {
log.info(sqlFile.getName() + " --- delete sql file result:" + sqlFile.delete());
}
File userFile = new File(initConfigProperties.getInitFilePath() + initConfigProperties.getInitUserName());
if (userFile.exists()) {
log.info(userFile.getName() + " --- delete user file result:" + userFile.delete());
}
dynamicDatasourceConfig.stopDataSource();
// 数据初始化状态设为false
DbStatusSingleton.getInstance().setDbStatus(false);
log.info("初始化数据重置完成");
}
}
ファイルを開いて選択すると Refresh on selection
、単一ファイルの統計が表示されます。
そうですね、一度覚えてしまえばもう迷うことはありませんので、この記事はここで終わります。
フォローしていただければ、さらにヒントを教えます。