アスペクト指向プログラミング(aspect-oriented programming)
ログ出力のように、あちこちに同じように現れる処理を1か所にまとめて書く考え方。ルールに合う場所へまとめて適用する。
もう少し詳しい説明
何が困っていたのか
ログ出力は、ほとんどのメソッドに同じように書くことになります。
| 困ること | 中身 |
|---|---|
| 同じ処理があちこちに散る | メソッドの数だけ書く |
| 書き忘れる | 1か所抜けると、そこだけ記録が残らない |
| 直すときに全部を直す | 書き方を変えると、すべての場所を直すことになる |
| 本来の処理が読みにくい | 業務の処理とログの処理が混ざる |
クラスで分けても、この種の処理は分けきれません。 どのクラスにも現れるためです。こうした処理を横断的関心事と呼びます。
| 例 | 中身 |
|---|---|
| ログ出力 | 誰が何をしたかを残す |
| 処理時間の計測 | どこに時間がかかっているかを測る |
| 権限の確認 | 呼んでよい人かを確かめる |
| トランザクションの開始と確定 | まとまりとして確定させる |
どう書くのか
| 決めること | 中身 |
|---|---|
| 適用する処理 | 実行させたい内容(例:クラス名、メソッド名、引数をログに出す) |
| 適用する場所のルール | どのクラス・メソッドに当てはめるかの条件 |
| 除外する条件 | 当てはめたくない場所の指定 |
ルールの条件には、クラス名やメソッド名に含まれる文字列のパターンが使えます。
命名規則が前提になる
名前で場所を選ぶので、名前の付け方に決まりが要ります。
| すること | 中身 |
|---|---|
| 対象のクラスのメソッド名に、決めた文字列を含める | ルールに当たるようにする |
| 対象外のクラスのメソッド名には、その文字列を含めない | 誤って当たらないようにする |
実装する側の制約が少なくなるように、ルールを決めます。 1つ1つのメソッドに印を付けて回る形にすると、書き忘れという元の問題に戻ります。
出してはいけないものを外す
一律に適用すると、出してはいけない情報まで記録されます。
| 外す対象 | 理由 |
|---|---|
| 認証に関する情報 | パスワードがログに残る |
| 個人情報を扱う箇所 | ログを見る人の範囲が広い |
除外の指定が必要になるのは、このためです。 まとめて適用できることと、適用してよいかは別の話になります。
良い点と難しい点
| 良い点 | 難しい点 |
|---|---|
| 同じ処理を1か所に書ける | コードを読んでも、どこで何が適用されるか見えにくい |
| 書き忘れが起きない | ルールの条件を誤ると、当たらない場所が出る |
| 本来の処理が読みやすくなる | 名前の付け方に決まりが要る |
処理の呼出しがコードに書かれていないので、追いかけにくくなります。 ルールの定義を見ないと分かりません。
試験ではこう出る
科目A(旧・午前)では、用語の意味が問われます。あちこちに現れる処理を1か所にまとめる、という部分が答えの軸です。
午後や応用情報(情報システム開発)では、ルールの定義のしかたが問われます。どのクラスを親に持つクラスの、何に文字列のパターンを含めるか、という空欄です。
出力しない箇所の理由を書かせる設問も出ます。個人情報や認証の情報が記録に残るため、という答え方になります。
関連する用語
- オブジェクト指向
- クラスで分ける考え方。それだけでは分けきれない処理を扱う
- 例外処理
- 異常を知らせる仕組み。ログ出力と組み合わせて使う
- リファクタリング
- 動きを変えずに構造を整えること。重複をまとめる点で近い
- 構造化プログラミング
- 処理の分け方の基本
ミニクイズ
アスペクト指向プログラミングを導入する狙いとして、最も適切なものはどれか。
正解は 2番:ログ出力のように多くの場所に同じように現れる処理を、1か所にまとめて書けるようにする
ログ出力や処理時間の計測のように、あちこちのメソッドに同じように書くことになる処理があります。アスペクト指向プログラミングは、そうした処理を1か所に書き、ルールに合う場所へまとめて適用する考え方です。実行速度の最適化、継承関係の判定、SQLの自動生成は、いずれも別の仕組みが担うものです。
この分野をまとめて解く → システム開発とユーザーインタフェースのミニテスト(全40問)
最終更新:2026-11-09