ロガーへの移行はSensei
ロガーへの移行はSensei
この記事では、System.out.printlnからJava Loggerを使用するように移行するためのレシピを作成します。
TDDではなく、コードを書いていてミスをしたときに、System.outに1行出力してしまう悪い癖があり、その癖をなくしたいと思っていました。
以下のコードを書く際に、たくさんの間違いを犯してしまいました。
private String getCountdownString() {
String output = "";
String prefix="";
for(int countdown = 10; countdown > 0; countdown-- ){
output = output + prefix + countdown;
System.out.println(output);
prefix=", ";
}
System.out.println(output);
return output;
}
最初、countdown++と書いたところ、ループが終了しませんでした。
また、countdown > 1を使用したため、希望の出力が得られませんでした。
最終的には、デバッグのためにSystem.out.printlnをコードに散りばめました。そして、この経験から、デフォルトのアプローチとしてロガーの使い方を学ぶ必要があると強く感じました。
リサーチ
幸いなことに、私はSensei のドキュメントに目を通し、System.out.println から変換するためのレシピを作成し、ロガーの使用を促す「Getting Started」ガイドを使用することにしました。
- java.util.logging.Logger
レシピの作成
まず、printlnをクリックしてからalt+enterで新しいレシピを作ります。
以下の内容で作成しています。
名前を教えてください。ロガー:printlnの代わりにロガーを使う
説明: printlnの代わりにloggerを使用 - System.out.printlnの使用をやめることを忘れないでください。
レベルです。エラー
まずはprintlnという名前のメソッドコールをマッチングさせてみます。
の検索を行います。
メソッドコールを使用します。
名前: "println"
また、プレビューでは、私のコードにマッチするものがすべて表示されます。
私のコードでは、すべてのマッチがSystem.out.printlnであることがわかりますが、長期的にはこれが唯一のマッチであるとは信じられません。私が変更したいのは、より修飾されたステートメントにマッチさせたいのです。
私はマッチャーを拡張して、クラス「System」で指定されたフィールドのメソッドコールを検索します。
の検索を行います。
メソッドコールを使用します。
名前: "println"
"on "になっています。
の分野でも活躍しています。
である。
クラスを作成しました。
name: "System"
名前: "out"
望むならば、Systemの名前をjava.lang.Systemに完全に修飾することもできます。
規約の改正
次に、QuickFixを作成したいと思います。
まず最初に、出力を記録するコードの行を修正したいと思います。
availableFixes:
- name: "use Logger"
のアクションを行います。
- を書き換えます。
to: "logger.log(Level.INFO, {{{ arguments.0 }}})"
ヒゲのテンプレート形式を覚える必要はありませんね。私はGUIのShow Variablesを使って引数を表示させ、それをダブルクリックしました。すると、GUIが適切にマッチした口ひげのテンプレートを埋めてくれました。
実際に試してみると、Level enumをインポートするには、まだalt+enterしなければならないことがわかります。しかし、QuickFixを修正して完全修飾のアイテムを持つようにすると、Sensei がインポートを追加してくれます。
- これは、System.out.println(output);を次のように置き換えます。
logger.log(Level.INFO, output);
- そして、enumのインポートを追加します。
import java.util.logging.Level.Login
- に書き換えたら。
logger.log(java.util.logging.Level.INFO, {{{ arguments.0 }}})
そして、これはうまくいくのですが、そもそもロガーをインスタンス化するための構文を覚えておかなければなりません。
ロガーフィールドを追加するためのコードの修正
私もQuickFixを修正して、フィールドを作成することができます。
まずロガーをコード化し、それをレシピに追加することで、二度とコード化する必要がなくなります。
Logger logger2 = Logger.getLogger(SysOutTest.class.getName());
私は、生成してほしいサンプルコードを最初に書くことが多いのですが、そうすればIntelliJのコード補完や構文チェックを使って、正しいコードが生成されているかどうかを確認することができるからです。副次的な効果として、レシピを編集してそのコードを生成するQuickFixの行を追加したときに、そのコードがコードプレビューに表示されます。
Sensei は重複したフィールドを追加しないように気をつけているので、違う名前を使って誤魔化さなければならないからです。
そこで、このコードを作成するためにレシピを修正し、loggerというフィールドを追加します。
availableFixes:
- name: "use Logger"
のアクションを行います。
- を書き換えます。
to: "logger.log(java.util.logging.Level.INFO, {{{ arguments.0 }}})"
- addFieldです。
field: "java.util.logging.Logger logger = Logger.getLogger({{{ containingClass.name\
}}.class.getName())"
ターゲット: "parentClass"
SysOutTestをmustache変数にして、このレシピを使用するクラスの名前を拾うようにしたことに注意してください。繰り返しになりますが、私はmustacheの構文を覚えていなかったので、GUIのShow Variablesを使って必要な置換を見つけました。
Loggerをjava.util.logging.Loggerに完全に修飾することで、Sensei はインポートを追加し、私が望むコードの行を書きます。
Logger logger = Logger.getLogger(SysOutTest.class.getName());
このレシピの便利な点は、loggerフィールドを一度だけ追加するので、「System.out.println」を使用した既存のコードにこのレシピを使用し、Sensei を使用してコードファイル内のすべての出現箇所を同時に変更することができることです。
次のステップ
これに慣れれば、System.out.printlnを使わないように訓練することができます。
Sensei を利用して、ロガーを作成するのに役立つ2つ目のレシピを作成することで、積極的にコードを書くことができます。
例えば、loggerというフィールドが存在しないクラスにマッチして、フィールドを追加することができます。
レベル情報のレシピを作成した場合
名前を教えてください。ロガー:ロガーの追加
説明クラスにロガーを追加
ロガーフィールドのないクラスにマッチさせるには
の検索を行います。
クラスを作成しました。
を使わずに。
の子です。
の分野でも活躍しています。
name: "logger"
そして、先ほどのQuickFixの一部を再利用します。
availableFixes:
- name: "Add Logger" (ロガーの追加)
のアクションを行います。
- addFieldです。
field: "java.util.logging.Logger logger = Logger.getLogger({{{ containingClass.name\
}}.class.getName())"
ターゲット: "self"
最初のQuickFixと比較して、ここでのターゲットの違いに注目してください。これは、Search がクラスにマッチしたため、self を使用しています。最初のQuickFixでは、クラス自体のコードにマッチしたため、parentClassを使用しています。
概要
これは、Sensei を利用して個人のプログラミングスキルを向上させるための重要な流れの一つです。
- 目先の「ベスト・プラクティス」に役立つレシピを作る
- ベストプラクティスの使い方がわかったら、ワークフローを高速化するためのレシピを作成します。
---
IntelliJの「Preferences ‾ Plugins」(Mac)または「Settings ‾ Plugins」(Windows)から、「sensei secure code」を検索して、「Sensei 」をインストールすることができます。
このためのソースコードとレシピは、Secure Code Warrior GitHub アカウントの `sensei-blog-examples` リポジトリの `pojoexamples` モジュールの中にあります。
アラン・リチャードソンは、20年以上にわたり、開発者として、またテスターからテスト責任者まで、あらゆるレベルのテストに携わってきたプロフェッショナルなIT経験を持っています。アラン・リチャードソンは、Secure Code Warrior のデベロッパーリレーションズの責任者として、チームと直接連携し、高品質で安全なコードの開発を促進しています。また、「Dear Evil Tester」や「Java For Testers」など4冊の著書があります。また、テクニカルWebテストやSelenium WebDriver with Javaを学ぶためのオンライントレーニングcourses を作成しています。アランは、SeleniumSimplified.com、EvilTester.com、JavaForTesters.com、CompendiumDev.co.ukに執筆やトレーニングビデオを掲載している。
Secure Code Warrior は、ソフトウェア開発ライフサイクル全体にわたってコードを保護し、サイバーセキュリティを最優先とする企業文化を創造するために、お客様の組織を支援します。AppSec マネージャー、開発者、CISO、またはセキュリティに関わるすべての人が、安全でないコードに関連するリスクを減らすことができるよう、支援します。
デモを予約するアラン・リチャードソンは、20年以上にわたり、開発者として、またテスターからテスト責任者まで、あらゆるレベルのテストに携わってきたプロフェッショナルなIT経験を持っています。アラン・リチャードソンは、Secure Code Warrior のデベロッパーリレーションズの責任者として、チームと直接連携し、高品質で安全なコードの開発を促進しています。また、「Dear Evil Tester」や「Java For Testers」など4冊の著書があります。また、テクニカルWebテストやSelenium WebDriver with Javaを学ぶためのオンライントレーニングcourses を作成しています。アランは、SeleniumSimplified.com、EvilTester.com、JavaForTesters.com、CompendiumDev.co.ukに執筆やトレーニングビデオを掲載している。
ロガーへの移行はSensei
この記事では、System.out.printlnからJava Loggerを使用するように移行するためのレシピを作成します。
TDDではなく、コードを書いていてミスをしたときに、System.outに1行出力してしまう悪い癖があり、その癖をなくしたいと思っていました。
以下のコードを書く際に、たくさんの間違いを犯してしまいました。
private String getCountdownString() {
String output = "";
String prefix="";
for(int countdown = 10; countdown > 0; countdown-- ){
output = output + prefix + countdown;
System.out.println(output);
prefix=", ";
}
System.out.println(output);
return output;
}
最初、countdown++と書いたところ、ループが終了しませんでした。
また、countdown > 1を使用したため、希望の出力が得られませんでした。
最終的には、デバッグのためにSystem.out.printlnをコードに散りばめました。そして、この経験から、デフォルトのアプローチとしてロガーの使い方を学ぶ必要があると強く感じました。
リサーチ
幸いなことに、私はSensei のドキュメントに目を通し、System.out.println から変換するためのレシピを作成し、ロガーの使用を促す「Getting Started」ガイドを使用することにしました。
- java.util.logging.Logger
レシピの作成
まず、printlnをクリックしてからalt+enterで新しいレシピを作ります。
以下の内容で作成しています。
名前を教えてください。ロガー:printlnの代わりにロガーを使う
説明: printlnの代わりにloggerを使用 - System.out.printlnの使用をやめることを忘れないでください。
レベルです。エラー
まずはprintlnという名前のメソッドコールをマッチングさせてみます。
の検索を行います。
メソッドコールを使用します。
名前: "println"
また、プレビューでは、私のコードにマッチするものがすべて表示されます。
私のコードでは、すべてのマッチがSystem.out.printlnであることがわかりますが、長期的にはこれが唯一のマッチであるとは信じられません。私が変更したいのは、より修飾されたステートメントにマッチさせたいのです。
私はマッチャーを拡張して、クラス「System」で指定されたフィールドのメソッドコールを検索します。
の検索を行います。
メソッドコールを使用します。
名前: "println"
"on "になっています。
の分野でも活躍しています。
である。
クラスを作成しました。
name: "System"
名前: "out"
望むならば、Systemの名前をjava.lang.Systemに完全に修飾することもできます。
規約の改正
次に、QuickFixを作成したいと思います。
まず最初に、出力を記録するコードの行を修正したいと思います。
availableFixes:
- name: "use Logger"
のアクションを行います。
- を書き換えます。
to: "logger.log(Level.INFO, {{{ arguments.0 }}})"
ヒゲのテンプレート形式を覚える必要はありませんね。私はGUIのShow Variablesを使って引数を表示させ、それをダブルクリックしました。すると、GUIが適切にマッチした口ひげのテンプレートを埋めてくれました。
実際に試してみると、Level enumをインポートするには、まだalt+enterしなければならないことがわかります。しかし、QuickFixを修正して完全修飾のアイテムを持つようにすると、Sensei がインポートを追加してくれます。
- これは、System.out.println(output);を次のように置き換えます。
logger.log(Level.INFO, output);
- そして、enumのインポートを追加します。
import java.util.logging.Level.Login
- に書き換えたら。
logger.log(java.util.logging.Level.INFO, {{{ arguments.0 }}})
そして、これはうまくいくのですが、そもそもロガーをインスタンス化するための構文を覚えておかなければなりません。
ロガーフィールドを追加するためのコードの修正
私もQuickFixを修正して、フィールドを作成することができます。
まずロガーをコード化し、それをレシピに追加することで、二度とコード化する必要がなくなります。
Logger logger2 = Logger.getLogger(SysOutTest.class.getName());
私は、生成してほしいサンプルコードを最初に書くことが多いのですが、そうすればIntelliJのコード補完や構文チェックを使って、正しいコードが生成されているかどうかを確認することができるからです。副次的な効果として、レシピを編集してそのコードを生成するQuickFixの行を追加したときに、そのコードがコードプレビューに表示されます。
Sensei は重複したフィールドを追加しないように気をつけているので、違う名前を使って誤魔化さなければならないからです。
そこで、このコードを作成するためにレシピを修正し、loggerというフィールドを追加します。
availableFixes:
- name: "use Logger"
のアクションを行います。
- を書き換えます。
to: "logger.log(java.util.logging.Level.INFO, {{{ arguments.0 }}})"
- addFieldです。
field: "java.util.logging.Logger logger = Logger.getLogger({{{ containingClass.name\
}}.class.getName())"
ターゲット: "parentClass"
SysOutTestをmustache変数にして、このレシピを使用するクラスの名前を拾うようにしたことに注意してください。繰り返しになりますが、私はmustacheの構文を覚えていなかったので、GUIのShow Variablesを使って必要な置換を見つけました。
Loggerをjava.util.logging.Loggerに完全に修飾することで、Sensei はインポートを追加し、私が望むコードの行を書きます。
Logger logger = Logger.getLogger(SysOutTest.class.getName());
このレシピの便利な点は、loggerフィールドを一度だけ追加するので、「System.out.println」を使用した既存のコードにこのレシピを使用し、Sensei を使用してコードファイル内のすべての出現箇所を同時に変更することができることです。
次のステップ
これに慣れれば、System.out.printlnを使わないように訓練することができます。
Sensei を利用して、ロガーを作成するのに役立つ2つ目のレシピを作成することで、積極的にコードを書くことができます。
例えば、loggerというフィールドが存在しないクラスにマッチして、フィールドを追加することができます。
レベル情報のレシピを作成した場合
名前を教えてください。ロガー:ロガーの追加
説明クラスにロガーを追加
ロガーフィールドのないクラスにマッチさせるには
の検索を行います。
クラスを作成しました。
を使わずに。
の子です。
の分野でも活躍しています。
name: "logger"
そして、先ほどのQuickFixの一部を再利用します。
availableFixes:
- name: "Add Logger" (ロガーの追加)
のアクションを行います。
- addFieldです。
field: "java.util.logging.Logger logger = Logger.getLogger({{{ containingClass.name\
}}.class.getName())"
ターゲット: "self"
最初のQuickFixと比較して、ここでのターゲットの違いに注目してください。これは、Search がクラスにマッチしたため、self を使用しています。最初のQuickFixでは、クラス自体のコードにマッチしたため、parentClassを使用しています。
概要
これは、Sensei を利用して個人のプログラミングスキルを向上させるための重要な流れの一つです。
- 目先の「ベスト・プラクティス」に役立つレシピを作る
- ベストプラクティスの使い方がわかったら、ワークフローを高速化するためのレシピを作成します。
---
IntelliJの「Preferences ‾ Plugins」(Mac)または「Settings ‾ Plugins」(Windows)から、「sensei secure code」を検索して、「Sensei 」をインストールすることができます。
このためのソースコードとレシピは、Secure Code Warrior GitHub アカウントの `sensei-blog-examples` リポジトリの `pojoexamples` モジュールの中にあります。
ロガーへの移行はSensei
この記事では、System.out.printlnからJava Loggerを使用するように移行するためのレシピを作成します。
TDDではなく、コードを書いていてミスをしたときに、System.outに1行出力してしまう悪い癖があり、その癖をなくしたいと思っていました。
以下のコードを書く際に、たくさんの間違いを犯してしまいました。
private String getCountdownString() {
String output = "";
String prefix="";
for(int countdown = 10; countdown > 0; countdown-- ){
output = output + prefix + countdown;
System.out.println(output);
prefix=", ";
}
System.out.println(output);
return output;
}
最初、countdown++と書いたところ、ループが終了しませんでした。
また、countdown > 1を使用したため、希望の出力が得られませんでした。
最終的には、デバッグのためにSystem.out.printlnをコードに散りばめました。そして、この経験から、デフォルトのアプローチとしてロガーの使い方を学ぶ必要があると強く感じました。
リサーチ
幸いなことに、私はSensei のドキュメントに目を通し、System.out.println から変換するためのレシピを作成し、ロガーの使用を促す「Getting Started」ガイドを使用することにしました。
- java.util.logging.Logger
レシピの作成
まず、printlnをクリックしてからalt+enterで新しいレシピを作ります。
以下の内容で作成しています。
名前を教えてください。ロガー:printlnの代わりにロガーを使う
説明: printlnの代わりにloggerを使用 - System.out.printlnの使用をやめることを忘れないでください。
レベルです。エラー
まずはprintlnという名前のメソッドコールをマッチングさせてみます。
の検索を行います。
メソッドコールを使用します。
名前: "println"
また、プレビューでは、私のコードにマッチするものがすべて表示されます。
私のコードでは、すべてのマッチがSystem.out.printlnであることがわかりますが、長期的にはこれが唯一のマッチであるとは信じられません。私が変更したいのは、より修飾されたステートメントにマッチさせたいのです。
私はマッチャーを拡張して、クラス「System」で指定されたフィールドのメソッドコールを検索します。
の検索を行います。
メソッドコールを使用します。
名前: "println"
"on "になっています。
の分野でも活躍しています。
である。
クラスを作成しました。
name: "System"
名前: "out"
望むならば、Systemの名前をjava.lang.Systemに完全に修飾することもできます。
規約の改正
次に、QuickFixを作成したいと思います。
まず最初に、出力を記録するコードの行を修正したいと思います。
availableFixes:
- name: "use Logger"
のアクションを行います。
- を書き換えます。
to: "logger.log(Level.INFO, {{{ arguments.0 }}})"
ヒゲのテンプレート形式を覚える必要はありませんね。私はGUIのShow Variablesを使って引数を表示させ、それをダブルクリックしました。すると、GUIが適切にマッチした口ひげのテンプレートを埋めてくれました。
実際に試してみると、Level enumをインポートするには、まだalt+enterしなければならないことがわかります。しかし、QuickFixを修正して完全修飾のアイテムを持つようにすると、Sensei がインポートを追加してくれます。
- これは、System.out.println(output);を次のように置き換えます。
logger.log(Level.INFO, output);
- そして、enumのインポートを追加します。
import java.util.logging.Level.Login
- に書き換えたら。
logger.log(java.util.logging.Level.INFO, {{{ arguments.0 }}})
そして、これはうまくいくのですが、そもそもロガーをインスタンス化するための構文を覚えておかなければなりません。
ロガーフィールドを追加するためのコードの修正
私もQuickFixを修正して、フィールドを作成することができます。
まずロガーをコード化し、それをレシピに追加することで、二度とコード化する必要がなくなります。
Logger logger2 = Logger.getLogger(SysOutTest.class.getName());
私は、生成してほしいサンプルコードを最初に書くことが多いのですが、そうすればIntelliJのコード補完や構文チェックを使って、正しいコードが生成されているかどうかを確認することができるからです。副次的な効果として、レシピを編集してそのコードを生成するQuickFixの行を追加したときに、そのコードがコードプレビューに表示されます。
Sensei は重複したフィールドを追加しないように気をつけているので、違う名前を使って誤魔化さなければならないからです。
そこで、このコードを作成するためにレシピを修正し、loggerというフィールドを追加します。
availableFixes:
- name: "use Logger"
のアクションを行います。
- を書き換えます。
to: "logger.log(java.util.logging.Level.INFO, {{{ arguments.0 }}})"
- addFieldです。
field: "java.util.logging.Logger logger = Logger.getLogger({{{ containingClass.name\
}}.class.getName())"
ターゲット: "parentClass"
SysOutTestをmustache変数にして、このレシピを使用するクラスの名前を拾うようにしたことに注意してください。繰り返しになりますが、私はmustacheの構文を覚えていなかったので、GUIのShow Variablesを使って必要な置換を見つけました。
Loggerをjava.util.logging.Loggerに完全に修飾することで、Sensei はインポートを追加し、私が望むコードの行を書きます。
Logger logger = Logger.getLogger(SysOutTest.class.getName());
このレシピの便利な点は、loggerフィールドを一度だけ追加するので、「System.out.println」を使用した既存のコードにこのレシピを使用し、Sensei を使用してコードファイル内のすべての出現箇所を同時に変更することができることです。
次のステップ
これに慣れれば、System.out.printlnを使わないように訓練することができます。
Sensei を利用して、ロガーを作成するのに役立つ2つ目のレシピを作成することで、積極的にコードを書くことができます。
例えば、loggerというフィールドが存在しないクラスにマッチして、フィールドを追加することができます。
レベル情報のレシピを作成した場合
名前を教えてください。ロガー:ロガーの追加
説明クラスにロガーを追加
ロガーフィールドのないクラスにマッチさせるには
の検索を行います。
クラスを作成しました。
を使わずに。
の子です。
の分野でも活躍しています。
name: "logger"
そして、先ほどのQuickFixの一部を再利用します。
availableFixes:
- name: "Add Logger" (ロガーの追加)
のアクションを行います。
- addFieldです。
field: "java.util.logging.Logger logger = Logger.getLogger({{{ containingClass.name\
}}.class.getName())"
ターゲット: "self"
最初のQuickFixと比較して、ここでのターゲットの違いに注目してください。これは、Search がクラスにマッチしたため、self を使用しています。最初のQuickFixでは、クラス自体のコードにマッチしたため、parentClassを使用しています。
概要
これは、Sensei を利用して個人のプログラミングスキルを向上させるための重要な流れの一つです。
- 目先の「ベスト・プラクティス」に役立つレシピを作る
- ベストプラクティスの使い方がわかったら、ワークフローを高速化するためのレシピを作成します。
---
IntelliJの「Preferences ‾ Plugins」(Mac)または「Settings ‾ Plugins」(Windows)から、「sensei secure code」を検索して、「Sensei 」をインストールすることができます。
このためのソースコードとレシピは、Secure Code Warrior GitHub アカウントの `sensei-blog-examples` リポジトリの `pojoexamples` モジュールの中にあります。
以下のリンクをクリックし、この資料のPDFをダウンロードしてください。
Secure Code Warrior は、ソフトウェア開発ライフサイクル全体にわたってコードを保護し、サイバーセキュリティを最優先とする企業文化を創造するために、お客様の組織を支援します。AppSec マネージャー、開発者、CISO、またはセキュリティに関わるすべての人が、安全でないコードに関連するリスクを減らすことができるよう、支援します。
レポートを見るデモを予約するアラン・リチャードソンは、20年以上にわたり、開発者として、またテスターからテスト責任者まで、あらゆるレベルのテストに携わってきたプロフェッショナルなIT経験を持っています。アラン・リチャードソンは、Secure Code Warrior のデベロッパーリレーションズの責任者として、チームと直接連携し、高品質で安全なコードの開発を促進しています。また、「Dear Evil Tester」や「Java For Testers」など4冊の著書があります。また、テクニカルWebテストやSelenium WebDriver with Javaを学ぶためのオンライントレーニングcourses を作成しています。アランは、SeleniumSimplified.com、EvilTester.com、JavaForTesters.com、CompendiumDev.co.ukに執筆やトレーニングビデオを掲載している。
ロガーへの移行はSensei
この記事では、System.out.printlnからJava Loggerを使用するように移行するためのレシピを作成します。
TDDではなく、コードを書いていてミスをしたときに、System.outに1行出力してしまう悪い癖があり、その癖をなくしたいと思っていました。
以下のコードを書く際に、たくさんの間違いを犯してしまいました。
private String getCountdownString() {
String output = "";
String prefix="";
for(int countdown = 10; countdown > 0; countdown-- ){
output = output + prefix + countdown;
System.out.println(output);
prefix=", ";
}
System.out.println(output);
return output;
}
最初、countdown++と書いたところ、ループが終了しませんでした。
また、countdown > 1を使用したため、希望の出力が得られませんでした。
最終的には、デバッグのためにSystem.out.printlnをコードに散りばめました。そして、この経験から、デフォルトのアプローチとしてロガーの使い方を学ぶ必要があると強く感じました。
リサーチ
幸いなことに、私はSensei のドキュメントに目を通し、System.out.println から変換するためのレシピを作成し、ロガーの使用を促す「Getting Started」ガイドを使用することにしました。
- java.util.logging.Logger
レシピの作成
まず、printlnをクリックしてからalt+enterで新しいレシピを作ります。
以下の内容で作成しています。
名前を教えてください。ロガー:printlnの代わりにロガーを使う
説明: printlnの代わりにloggerを使用 - System.out.printlnの使用をやめることを忘れないでください。
レベルです。エラー
まずはprintlnという名前のメソッドコールをマッチングさせてみます。
の検索を行います。
メソッドコールを使用します。
名前: "println"
また、プレビューでは、私のコードにマッチするものがすべて表示されます。
私のコードでは、すべてのマッチがSystem.out.printlnであることがわかりますが、長期的にはこれが唯一のマッチであるとは信じられません。私が変更したいのは、より修飾されたステートメントにマッチさせたいのです。
私はマッチャーを拡張して、クラス「System」で指定されたフィールドのメソッドコールを検索します。
の検索を行います。
メソッドコールを使用します。
名前: "println"
"on "になっています。
の分野でも活躍しています。
である。
クラスを作成しました。
name: "System"
名前: "out"
望むならば、Systemの名前をjava.lang.Systemに完全に修飾することもできます。
規約の改正
次に、QuickFixを作成したいと思います。
まず最初に、出力を記録するコードの行を修正したいと思います。
availableFixes:
- name: "use Logger"
のアクションを行います。
- を書き換えます。
to: "logger.log(Level.INFO, {{{ arguments.0 }}})"
ヒゲのテンプレート形式を覚える必要はありませんね。私はGUIのShow Variablesを使って引数を表示させ、それをダブルクリックしました。すると、GUIが適切にマッチした口ひげのテンプレートを埋めてくれました。
実際に試してみると、Level enumをインポートするには、まだalt+enterしなければならないことがわかります。しかし、QuickFixを修正して完全修飾のアイテムを持つようにすると、Sensei がインポートを追加してくれます。
- これは、System.out.println(output);を次のように置き換えます。
logger.log(Level.INFO, output);
- そして、enumのインポートを追加します。
import java.util.logging.Level.Login
- に書き換えたら。
logger.log(java.util.logging.Level.INFO, {{{ arguments.0 }}})
そして、これはうまくいくのですが、そもそもロガーをインスタンス化するための構文を覚えておかなければなりません。
ロガーフィールドを追加するためのコードの修正
私もQuickFixを修正して、フィールドを作成することができます。
まずロガーをコード化し、それをレシピに追加することで、二度とコード化する必要がなくなります。
Logger logger2 = Logger.getLogger(SysOutTest.class.getName());
私は、生成してほしいサンプルコードを最初に書くことが多いのですが、そうすればIntelliJのコード補完や構文チェックを使って、正しいコードが生成されているかどうかを確認することができるからです。副次的な効果として、レシピを編集してそのコードを生成するQuickFixの行を追加したときに、そのコードがコードプレビューに表示されます。
Sensei は重複したフィールドを追加しないように気をつけているので、違う名前を使って誤魔化さなければならないからです。
そこで、このコードを作成するためにレシピを修正し、loggerというフィールドを追加します。
availableFixes:
- name: "use Logger"
のアクションを行います。
- を書き換えます。
to: "logger.log(java.util.logging.Level.INFO, {{{ arguments.0 }}})"
- addFieldです。
field: "java.util.logging.Logger logger = Logger.getLogger({{{ containingClass.name\
}}.class.getName())"
ターゲット: "parentClass"
SysOutTestをmustache変数にして、このレシピを使用するクラスの名前を拾うようにしたことに注意してください。繰り返しになりますが、私はmustacheの構文を覚えていなかったので、GUIのShow Variablesを使って必要な置換を見つけました。
Loggerをjava.util.logging.Loggerに完全に修飾することで、Sensei はインポートを追加し、私が望むコードの行を書きます。
Logger logger = Logger.getLogger(SysOutTest.class.getName());
このレシピの便利な点は、loggerフィールドを一度だけ追加するので、「System.out.println」を使用した既存のコードにこのレシピを使用し、Sensei を使用してコードファイル内のすべての出現箇所を同時に変更することができることです。
次のステップ
これに慣れれば、System.out.printlnを使わないように訓練することができます。
Sensei を利用して、ロガーを作成するのに役立つ2つ目のレシピを作成することで、積極的にコードを書くことができます。
例えば、loggerというフィールドが存在しないクラスにマッチして、フィールドを追加することができます。
レベル情報のレシピを作成した場合
名前を教えてください。ロガー:ロガーの追加
説明クラスにロガーを追加
ロガーフィールドのないクラスにマッチさせるには
の検索を行います。
クラスを作成しました。
を使わずに。
の子です。
の分野でも活躍しています。
name: "logger"
そして、先ほどのQuickFixの一部を再利用します。
availableFixes:
- name: "Add Logger" (ロガーの追加)
のアクションを行います。
- addFieldです。
field: "java.util.logging.Logger logger = Logger.getLogger({{{ containingClass.name\
}}.class.getName())"
ターゲット: "self"
最初のQuickFixと比較して、ここでのターゲットの違いに注目してください。これは、Search がクラスにマッチしたため、self を使用しています。最初のQuickFixでは、クラス自体のコードにマッチしたため、parentClassを使用しています。
概要
これは、Sensei を利用して個人のプログラミングスキルを向上させるための重要な流れの一つです。
- 目先の「ベスト・プラクティス」に役立つレシピを作る
- ベストプラクティスの使い方がわかったら、ワークフローを高速化するためのレシピを作成します。
---
IntelliJの「Preferences ‾ Plugins」(Mac)または「Settings ‾ Plugins」(Windows)から、「sensei secure code」を検索して、「Sensei 」をインストールすることができます。
このためのソースコードとレシピは、Secure Code Warrior GitHub アカウントの `sensei-blog-examples` リポジトリの `pojoexamples` モジュールの中にあります。
目次
アラン・リチャードソンは、20年以上にわたり、開発者として、またテスターからテスト責任者まで、あらゆるレベルのテストに携わってきたプロフェッショナルなIT経験を持っています。アラン・リチャードソンは、Secure Code Warrior のデベロッパーリレーションズの責任者として、チームと直接連携し、高品質で安全なコードの開発を促進しています。また、「Dear Evil Tester」や「Java For Testers」など4冊の著書があります。また、テクニカルWebテストやSelenium WebDriver with Javaを学ぶためのオンライントレーニングcourses を作成しています。アランは、SeleniumSimplified.com、EvilTester.com、JavaForTesters.com、CompendiumDev.co.ukに執筆やトレーニングビデオを掲載している。
Secure Code Warrior は、ソフトウェア開発ライフサイクル全体にわたってコードを保護し、サイバーセキュリティを最優先とする企業文化を創造するために、お客様の組織を支援します。AppSec マネージャー、開発者、CISO、またはセキュリティに関わるすべての人が、安全でないコードに関連するリスクを減らすことができるよう、支援します。
デモを予約するダウンロード