この記事は Java Advent Calendar 2024 18日目の記事です。
みなさん割と言語仕様について書かれているので毛色が違うものになりますが、ご容赦ください。
今回はだらだら作ったJUnitの日本語Wrapperの紹介です。なお全然メソッド網羅できてません。
コードはGistに上げています。
作った理由など
端的に言うと、日本語話者にはexpecteds
とactuals
がわかりにくいと思ったからです。
チームメンバーから上がってきたプルリクですべて逆になっているものもありましたし、私だけではないと思っています。
JUnitの引数がわかりにくいと思った理由
まず単純に英語が苦手だからですね。expecteds
とactuals
でいつもどちらが期待する値でどちらが実際の値か迷います。
2つ目の理由として、なんとなく検証対象の値を先に書きたいと考えるからです。
語順的に「何が」「どうである」のほうが自然ですし、関数の重要度的にもactuals
のほうが第一引数にふさわしいように思えます。
一貫性という意味でも引数を1つしか取らないassertNull
などが存在するため、actuals
が第一引数のほうが自然に思えます。
ということでなぜexpecteds
が第一引数なのか調べようと思ったんですが、先人がいましたのでリンクのみ貼ります。
結論としては「expecteds
のほうがリテラルを入れることが多く、短くなりやすいため可読性が高いから」ということらしいです。
私は書くことに重きを置いていたので、読むときの視点は抜けていました。
このWrapperがどのように解決するか(あるいは簡単な使い方)
assertEquals
をサンプルに使い方を簡単に紹介します。
まずは通常のJUnit5を使う場合のコード例は次のようになりますね?
assertEquals(5, calculator.add(2, 3));
一方、今回のWrapperでは次のように書けます。
実行結果.の(calculator.add(2, 3)).は期待値の(5).と同じです();
日本語話者には圧倒的にわかりやすいですね。(まるでなでしこ)
次に引数が1つのパターンのサンプルです。
assertNull(hoge.stringOrNull()); // サンプルなのでOptional使えとか言わないでください><
コード書かなくてもわかりそうな気がしますがWrapperで書き換えると次のような感じです。
実行結果.の(hoge.stringOrNull()).はnullです();
終わりに
これで毎回expecteds
とactuals
でどっちがどっちだっけって迷わなくて済むようになりました。
今後の展望としては次のようなことを考えています。
- ジェネリクスあたりが怪しいので修正する
- 全メソッドを網羅する
JJUG CCC 2024 Fallでも「今日から始めよう🚀日本語🇯🇵プログラミング🧑🏻💻」という内容の発表がありました。
今回はJUnitのWrapperを作りましたが、「可読性の高い」コードを書くために、日本語でのプログラミングを進めてみてはいかがでしょうか?
修正
2024/12/18 Gist:引数も日本語を使うように修正