📘 Vol.11.2.2 アクションクラスの3設計スタイルと選定基準   ― 機能粒度・責務分離・保守性のバランスをどう取るか？ ―

## ✅ 本記事のねらい

Struts2におけるアクションクラスの設計は、**単なるリクエストの受け口**にとどまらず、  
「アプリ全体の保守性・拡張性・わかりやすさ」を左右する重要な設計ポイントです。

本記事では、以下の3つのアクションクラス設計スタイルを比較しながら、  
それぞれの特徴・メリット・デメリット・適用判断基準について整理します。

---

1. [はじめに：アクションクラス設計がUXと保守性を左右する](#1-はじめにアクションクラス設計がuxと保守性を左右する)  
2. [スタイル①：1クラス1ユースケース型（単機能Action）](#2-スタイル1クラス1ユースケース型単機能action)  
3. [スタイル②：1クラス多メソッド型（機能集約Action）](#3-スタイル2クラス多メソッド型機能集約action)  
4. [スタイル③：共通BaseAction型（抽象化による責務分離）](#4-スタイル3共通baseaction型抽象化による責務分離)  
5. [【比較表】3スタイルの特徴と選定基準まとめ](#5-比較表3スタイルの特徴と選定基準まとめ)  
6. [おわりに：設計スタイルに「正解」はない。文脈で選ぼう](#6-おわりに設計スタイルに正解はない文脈で選ぼう)  


---

## 1. はじめに：アクションクラス設計がUXと保守性を左右する

Struts2のアクションクラスは、ユーザーからの入力（リクエスト）を受けて処理を分岐し、  
結果をビューに返すという重要な役割を担います。

---

ユーザー操作 → アクション層 → サービス層 → DB → 結果を返却（JSP等）

このアクションクラスの設計方針を誤ると…

- ファイル構成が散らかる
- 機能の責任が曖昧になる
- 画面遷移がわかりにくくなる
- コードの読みやすさ・変更しやすさが損なわれる

といった問題を引き起こします。

逆に、**適切な設計スタイルを選べば、UX（ユーザー体験）と開発効率が大きく向上します。**

---

<h2 id="style1">2. スタイル①：1クラス1ユースケース型（単機能Action）</h2>




### 🔸 特徴

- 1画面、1ユースケースに対して1つのActionクラス
- それぞれが独立した単機能を担う

### ✅ メリット

- コードが短く、読みやすい
- 処理の責務が明確で、テストもしやすい
- ユースケース単位でファイルが完結

### ⚠ デメリット

- Actionクラス数が多くなりやすい
- 処理の共通化が難しくなる（重複コードの温床に）

### 🧩 向いているケース

- CRUD処理が中心の業務システム
- 開発メンバーのスキルに差があるチーム

---

## 3. スタイル②：1クラス多メソッド型（機能集約Action）

### 🔸 特徴

- 1つのActionクラスに複数のメソッドを持たせ、複数機能を担当
- `method`属性などで切り替え

```xml
<action name="user" class="UserAction" method="register">
<action name="user" class="UserAction" method="delete">

```

---

### ✅ メリット
- ファイル数を抑えられる

- 関連機能を1ファイルに集約できて見通しがよい

⚠ デメリット
- クラスが肥大化しやすく、責任が曖昧になりやすい

- テスト時にMockが複雑になることも

### 🧩 向いているケース
- 1画面に複数機能がある複合画面（一覧・検索・削除など）

- 担当者が熟練しており責務分担を意識して書けるチーム

---

## 4. スタイル③：共通BaseAction型（抽象化による責務分離）

### 🔸 特徴

- 各ActionクラスはBaseActionを継承

- セッション・リクエスト・共通メッセージ処理などを集約

```java
public class BaseAction extends ActionSupport implements SessionAware {
    protected Map<String, Object> session;
    public void setSession(Map<String, Object> session) {
        this.session = session;
    }
}

```

### ✅ メリット
- 重複処理（例：ログインユーザー取得）が一元化

- 共通機能の変更が1箇所で済む

⚠ デメリット
- 継承構造が複雑化しやすい

- 過剰に共通化すると副作用が起きる

### 🧩 向いているケース
- ログイン/権限/画面フローが複雑な中〜大規模アプリ

- チーム開発で共通ルールが統一されている環境

---

## 5. 【比較表】3スタイルの特徴と選定基準まとめ


| スタイル          | 保守性 | 可読性 | 拡張性 | 向いているケース                 |
| ------------- | --- | --- | --- | ------------------------ |
| 単機能型          | ◎   | ◎   | △   | CRUD中心、シンプルな業務画面         |
| 多機能集約型        | △   | ◯   | ◯   | 関連処理が密接な複数機能の統合画面        |
| BaseAction継承型 | ◯   | △   | ◎   | 中～大規模、権限/セッション処理が必要なシステム |


---

## 6. おわりに：設計スタイルに「正解」はない。文脈で選ぼう
アクションクラスの設計スタイルには「これが正解！」というものは存在しません。

選定時に大事なのは、「何を重視したいか（読みやすさ／共通化／今後の拡張）」と
「チーム体制やアプリの成長段階」に応じて適切なバランスを取ることです。

✅ 迷ったときは…

>- まずは単機能で作る → 後でBaseActionなどで共通化
>- 機能単位で整理してから、共通処理や粒度を揃える
>- 拡張を意識した「設計コメント」や「Javadoc」も後の保守に効きます！

---

### 🔜 次回予告：Vol.11.2.3「戻り先制御と画面遷移の設計パターン」
- input / success / error / cancel をどう設計に活かすか？

- 複数遷移先を持つActionの設計テクニックとは？

- ユーザーの操作意図に沿った自然な画面遷移設計へ！


---

ご感想・ご質問・実プロジェクトでの工夫など、ぜひコメントでお寄せください🙏
次回もよろしくお願いいたします！


---

### ✨ シリーズまとめ（Vol.11.2.xx アクション層設計）

- [✅ Vol.11.2 UX改善に効く！アクション層設計と入力制御の極意（プロローグ） ― アクション層からはじめるStruts2の“わかりやすい画面遷移”と“操作性向上” ―](https://qiita.com/drafts/c69962826bb29639c351/edit)

- [✅ Vol.11.2.1 アクション層の役割と設計パターン ―「ただのリクエスト受け口」から「ユースケースの橋渡し役」へ―](https://qiita.com/juehara-crypto/items/9ca115073e6f928c7f71)

- [✅ Vol.11.2.3「戻り先制御と画面遷移の設計パターン」](https://qiita.com/juehara-crypto/items/c5165c92a4366fd1962b)

- [✅ Vol.11.2.4「セッションとパラメータの使い分けと設計ポイント」](https://qiita.com/juehara-crypto/items/06162659215cca86de28)

- [✅ Vol.11.2.5【トラブル防止】アクション層の共通処理とメンテナブルなBaseAction設計 ](https://qiita.com/juehara-crypto/items/b538b50eaa9c263a31bb)


---

### 🧭 関連記事（Vol.11.xxxシリーズ）
| 連番           | タイトル                                                  | 内容分類              |
| ------------ | ----------------------------------------------------- | ----------------- |
| [Vol.11.0](https://qiita.com/juehara-crypto/items/a0cc66893cb499a6e23a)     | Struts2が提供してくれる便利機能まとめ9選                              | 導入＆概要             |
| [Vol.11.1](https://qiita.com/juehara-crypto/items/0a584da537059dd43a7c)     | 自動注入とステートレスActionの仕組み                                 | フレームワーク内部理解       |
| [Vol.11.2](https://qiita.com/juehara-crypto/items/c69962826bb29639c351) | **UX改善に効く！アクション層設計と入力制御の極意（プロローグ）**                   | UX設計・アクション層総論     |
| [Vol.11.2.1](https://qiita.com/juehara-crypto/items/9ca115073e6f928c7f71)   | 【実践編】Struts2アクション層の役割と設計パターン（Command型 / UIアクション分離など）  | アクション設計パターン       |
| [Vol.11.2.3](https://qiita.com/juehara-crypto/items/c5165c92a4366fd1962b)   | 【設計ノウハウ】多画面遷移時のパラメータ受け渡し・保持戦略（セッション vs hidden vs URL） | パラメータ多重管理         |
| [Vol.11.2.4](https://qiita.com/juehara-crypto/items/06162659215cca86de28)   | 【実践ガイド】ユーザー操作を考慮したアクション遷移設計（リダイレクト vs フォワードの使い分け）     | UX遷移設計／Result制御   |
| [Vol.11.2.5](https://qiita.com/juehara-crypto/items/b538b50eaa9c263a31bb)   | 【トラブル防止】アクション層の共通処理とメンテナブルなBaseAction設計               | アクション共通化／保守性      |
| [Vol.11.3](https://qiita.com/juehara-crypto/items/913de7c942a9242201e8)     | Struts2の defaultStack とは？Interceptorの中身を詳しく追ってみる      | Interceptor       |
| [Vol.11.3.2](https://qiita.com/juehara-crypto/items/ede8d3c2a9b147f6161e)     | 🔧 Vol.11.3.2 独自Interceptorの作り方と使い所 _Struts2のカスタマイズを“実践で使えるレベル”に一歩進めよう_     | Interceptor       |
| [Vol.11.4](https://qiita.com/juehara-crypto/items/253142d13fe5f604610f)     | 入門者のための「パラメータ自動バインディング」完全理解ガイド                        | 自動バインディング         |
| [Vol.Vol.11.4.1](https://qiita.com/juehara-crypto/items/4fd8ed2a8be317f6e1bd)     | 入門者のための自動バインディング実践パターン集                        | 自動バインディング         |
| [Vol.11.5](https://qiita.com/juehara-crypto/items/6ef7a87a54163d81a9ba)     | Struts2の構成理解が“実務レベル”へと進化する決定版         | 設定ファイル構造          |
| [Vol.11.5.1](https://qiita.com/juehara-crypto/items/df407b24101e92a02eab)     | Struts2の“画面遷移の全体像”を理解するためのマイルストーン記事         | 設定ファイル構造          |
| [Vol.11.6](https://qiita.com/juehara-crypto/items/bfbdc2203acac7ba3f19)     | ActionSupport の便利メソッドと国際化対応                           | ユーティリティ / i18n    |
| [Vol.11.7](https://qiita.com/juehara-crypto/items/ed8f0977c23ee8c8b959)     | validate() / input 戦略とUX設計                            | 開発スタイルの違い    
| [Vol.11.8](https://qiita.com/juehara-crypto/items/bb2b23612c22fa9bf50b)     | アノテーションベースの設定 vs XML定義の比較                             | 開発スタイルの違い         |
| [Vol.11.9](https://qiita.com/juehara-crypto/items/6163ad6c9308cc8dda6d)     | バリデーション完全解説（XML / アノテーション）                            | バリデーション（※Vol.8補完） |
| [Vol.11.10](https://qiita.com/juehara-crypto/items/207cb3d7f0a889c54df9)     | Struts2の「OGNL」ってなに？しくみと使い方をやさしく解説                     | 式言語OGNL解説         |
| [Vol.11.11](https://qiita.com/juehara-crypto/items/c313ea56f97984756c05)    | ModelDriven インターフェースの使いどころと注意点                        | Model駆動開発         |
| [Vol.11.12](https://qiita.com/juehara-crypto/items/de7a17d53e53d6466f17)    | SessionAware と RequestAware でセッション/リクエスト管理            | セッション管理           |
| [Vol.11.13](https://qiita.com/juehara-crypto/items/539bd5bae75a8e154753)    | Resultタイプ完全解説（dispatcher / redirect / stream など）      | 遷移パターン理解          |
| [Vol.11.14](https://qiita.com/juehara-crypto/items/142d9aa2c623c5eb70bc)    | Vol.11.14 ValueStackの中身を理解する – 画面とActionの橋渡し役                 | Action            |
| [Vol.11.15](https://qiita.com/juehara-crypto/items/84f024816d0cf2212cb6)    | Interceptorチェーンを自作してみよう（ログ / 認証フィルタ）                 | Interceptor            |
| [Vol.11.16](https://qiita.com/juehara-crypto/items/ff3ad75f9ee45fcd0f8f)    | エラー処理と例外ハンドリングの実践パターン                                 | ハンドリング設計          |
| [Vol.11.17](https://qiita.com/juehara-crypto/items/0d8d5101ff39b34b4704)    | Struts2でファイルアップロード機能を実装する方法                           | 実装系Tips           |
| [Vol.11.18](https://qiita.com/juehara-crypto/items/d93c8d9cee719997c068)    | 非同期通信（AJAX）とStruts2の連携方法                              | フロント連携編           |
| [Vol.11.19](https://qiita.com/juehara-crypto/items/dd6cf06d3100c9204d1f)    | セキュリティ対策（CSRF, XSS, パラメータ偽装）                              | セキュリティ対策           |
| [Vol.11.20](https://qiita.com/juehara-crypto/items/9442d9f4705f1c6c4da1)    | 複数フォームを安全に扱う！セッション管理と動的フォームの考え方                              | セッション管理           |
| [Vol.11.21](https://qiita.com/juehara-crypto/items/78eb217727b7c97f228a)    | Struts2でJSONを返す！REST API連携と非同期通信の基本設計                              | セッション管理           |
| [Vol.11.22](https://qiita.com/juehara-crypto/items/424155ee0e567a36b9a1)    | 本番環境構成とセキュリティ設計（Apache+Tomcat+Struts2連携）                             | 外部公開           |

---