【Java】マジックナンバーとフラグを使ったHTML表示の動的制御とサービスでの再利用 - taro_poyotaのブログ

【Java】マジックナンバーとフラグを使ったHTML表示の動的制御とサービスでの再利用

はじめに

プログラミングにおいて、マジックナンバーとはコード中にハードコーディングされた数値のことを指します。
メンテナンス性や可読性の向上のため、マジックナンバーは共通クラスにまとめて管理することが推奨されています。
また、複数の箇所で使われるフラグやロジックは、サービス層に分けて再利用可能な形にすることで、コードの保守性をさらに高めることができます。

今回は、Javaマジックナンバーを共通クラスにまとめ、モデルでフラグ管理を行い、サービス層でロジックを再利用しながら、Thymeleafを使ってHTML上で条件分岐させる方法について書こうと思います。

マジックナンバーの管理

まず、マジックナンバーは共通クラスにまとめて定数として管理します。
例えば、MagicNumberConstants.java というクラスに次のように定義します。

public class MagicNumberConstants {
    //都道府県のマジックナンバー
    public static final int TOKYO = 13;
    public static final int OSAKA = 27;
    public static final int FUKUOKA = 40;

    //その他マジックナンバーなど

}

これにより、マジックナンバーが変更になった場合でも、コード全体を一括で修正でき、メンテナンス性が向上します。
今回はわかりやすく都道府県にしてみました。

マジックナンバーを使ったフラグの作成

入力された都道府県コードが特定の都道府県(例えば東京)と一致するかどうかを判定するフラグをコントローラーで設定します。

@Controller
public class PrefectureController {
    @GetMapping("/checkPrefecture")
    public String checkPrefecture(@RequestParam("prefectureCode") int prefectureCode, Model model) {
        boolean isTokyo = (prefectureCode == PrefectureConstants.TOKYO);
        model.addAttribute("isTokyo", isTokyo);
        return "prefecturePage";
    }
}

ここでは、入力された都道府県コードが東京 (PrefectureConstants.TOKYO) と一致するかどうかを判定し、isTokyo フラグとしてモデルに渡しています。

Thymeleafでの表示制御

Thymeleafを使って、マジックナンバーに応じたHTMLの表示制御を行います。

<div th:if="${isTokyo}">
    <p>東京都にお住まいですね!</p>
</div>
<div th:unless="${isTokyo}">
    <p>その他の都道府県ですね。</p>
</div>

th:if は条件が true の場合に表示され、th:unless は逆に false の場合に表示されます。
この例では、isTokyo フラグが true の場合に「東京都にお住まいですね!」というメッセージを表示し、
それ以外の場合には「その他の都道府県ですね。」というメッセージが表示されます。

フラグをサービスで使い回す

もし、特定のフラグ(例:都道府県コードの判定)を複数のコントローラーや他のクラスで使うことが想定される場合、サービス層にロジックを分けておくと便利です。
これにより、コードの重複を避け、メンテナンス性を高めることができます。

フラグ判定ロジックを Impl クラスに実装する

サービス層のフラグ判定ロジックを、インターフェースとその実装クラスに分けると、コードがさらに拡張性を持つようになります。
都道府県の判定を行う PrefectureService インターフェースと、その実装クラス PrefectureServiceImpl を作成します。

インターフェースの定義
public interface PrefectureService {
    boolean isTokyo(int prefectureCode);
}
実装クラスの定義
@Service
public class PrefectureServiceImpl implements PrefectureService {

    @Override
    public boolean isTokyo(int prefectureCode) {
        return prefectureCode == PrefectureConstants.TOKYO;
    }
}

このように、インターフェースを使って定義し、その実装を Impl クラスにまとめることで、必要に応じて別の実装クラスを追加することも簡単になります。
例えば、別の条件で都道府県判定を行う実装を追加することが将来的に必要になった際にも、既存のコードを変更せずに新しい実装を提供できます。

サービスの利用
@Controller
public class PrefectureController {

    private final PrefectureService prefectureService;

    public PrefectureController(PrefectureService prefectureService) {
        this.prefectureService = prefectureService;
    }

    @GetMapping("/checkPrefecture")
    public String checkPrefecture(@RequestParam("prefectureCode") int prefectureCode, Model model) {
        boolean isTokyo = prefectureService.isTokyo(prefectureCode);
        model.addAttribute("isTokyo", isTokyo);
        return "prefecturePage";
    }
}

こうすることで、都道府県判定のロジックが他のクラスにも簡単に適用できるようになり、コードの一貫性と再利用性が向上します。

まとめ

マジックナンバーを共通クラスにまとめることで、メンテナンス性が向上し、フラグを使って表示を制御することで、柔軟に画面を構築できるようになります。
Thymeleafと組み合わせることで、簡単に動的な表示を実現できるため、使いどころが多いです。
バックエンド側でtrue/falseのフラグ判定までしておくと、フロントコードがすっきりします。

また、今回都道府県フラグを例にService層について書きましたが、ロジックはService層にメソッドを作成して、どこからでも呼び出しできるようにするのがおすすめです!

参考資料

「分かりそう」で「分からない」でも「分かった」気になれるIT用語辞典 - マジックナンバー

Javaのインターフェイスを実装するimplementsとは?