はじめに
Java の業務をしていると、仕様は複雑じゃないのに、なぜか理解に時間がかかるコードに出会うことがあります。また、こういったソースコードには以下のような、不都合が生じます。
- バグが入り込みやすい
- 修正の影響範囲が読めない
- 引き継ぎ時に苦労する
今回は、ソースコードが読みにくくなる書き方について、ログとして記載していきたいと思います。
他にも、体系的にJavaを学びたい方には以下の教材がおすすめです:
👉スッキリわかるJava入門
👉スッキリわかるJava入門 実践編
ネストが深くなった瞬間
「if」「try」「for」等のネストが必要な、文が連続で使用されると処理の本質がネストの奥に埋もれて、条件を頭の中で積み上げないと理解できないような状況に陥ります。また、見た目としても見づらい状況になります。
if (a) {
if (b) {
if (c) {
doFunction();
}
}
}
変数・メソッド名が抽象的すぎる
変数・メソッド名があいまいな場合、その変数やメソッドがなんの役割を持っているのか、ロジックをすべて追わないとわからない場内になります。変数・メソッド名は、わかりやすく命名し何を示ししているか名称のみでわかるのが良いです。
int tmp; // 何を意味しているか不明な変数
boolean flag; // 何を意味しているか不明な変数
booleanフラグの乱用
「true」「false」の乱用は、呼び出し元からの意味が分からなくなることが増えて、ソースコードの読みやすさの低下につながります。また、引数の順番を間違えやすいなどの欠点もあります。
メソッド(data, true, false);
状態を持ちすぎるクラス
クラスに状態(ステータス)を大量に持たせると、クラスは一気に読みにくくなります。「今どの状態なのか」「この組み合わせはあり得るのか」を毎回考える必要があるからです。
class OrderService {
boolean validated;
boolean approved;
boolean completed;
}
状態は、複数のフラグではなく、1つのenumで表現するとよいです。
enum OrderStatus {
NEW, VALIDATED, APPROVED, COMPLETED
}
1つのメソッドが長すぎる
長いメソッドは、何をしているか分からないことが多いため読み解くのに時間を要します。途中修正での影響範囲が分かりずらくなったり、テストもしづらくなります。
30〜50行を超えたら分割を検討するなど、業務ではメソッドを一つの機能単位としてわかりやすく持てるようにしてみましょう。
void execute() {
// 200行の処理
}
コメントがないと意味が分からないコード
コメントがないと意味が分からないコード、コード自体が説明不足である可能性が高いです。コメントだけで「何をしているか」を説明している場合、設計を見直した方が良いケースが多いです。
x = y * 3 + 7;
マジックナンバーの多用
マジックナンバー(magic number)とは、プログラム内で特定の意味を持つ数値が直接記述されている状態を指します。意味を持つ数値は、定数などにして名前を与えてあげるだけでコードは読みやすくなります。
if (status == 3) {
//処理
}
例外を握りつぶしている
何も書かれていない catch ブロックは、将来的にコードの読みにくさを増加させます。
その場では問題が起きなくても、本番で何かが起きたとき、ログが残らず手がかりは完全に失われます。
try {
メソッド();
} catch (Exception e) {
}
責務が多すぎるクラス
1つのクラスが、「実処理」「検証」「DB接続」「ログ出力」「メール送信」等、すべてをやっている場合、そのクラスはすでに読みにくいクラスです。
クラス名と中身がズレ始めたら、正しいクラス構成を考えてみてください。
「とりあえず動く」コードが残ったまま
TODO コメントは、自分に向けたメモですがそのメモが回収されずに残り続けてしまうことも多々あります。後で直すは、積み上げれば積み上げるほど負債はたまっていくため、なるべくその場で解決するようにしましょう。
// TODO 後で直す
ドキュメント
【公式ドキュメント】
Java SE Specifications (oracle.com)
最後に
Javaの環境構築は、この記事を参照してみてください。
【開発環境構築】VS CodeでJavaを使用するための環境構築を実施する – SEもりのLog (selifemorizo.com)
以上、ログになります。
これからも継続していきましょう!!


コメント