システムアーキテクト試験 2024年 午前2 問07
現在のプログラムA, Bに、在庫テーブルを更新した後に更新ログを出力する機能を追加する。この機能は共通モジュールで実装し、どのプログラムからも利用できるようにする。図は、プログラムの実装案である。案1も案2も、在庫テーブルを更新した後に更新ログが出力される。更新ログを出力する共通モジュールを呼び出す処理を、案1のように各プログラム中に直接記述するのではなく、案2のように呼び出し方の宜言を共通プログラムなどに記述することによって、開発の効率を高めたり、保守性を高めたりするプログラミング技法はどれか。

ア:アスペクト指向プログラミング(正解)
イ:オブジェクト指向プログラミング
ウ:関数型プログラミング
エ:構造化プログラミン
解説
在庫更新後の共通処理呼び出し方法に関するプログラミング技法【午前2 解説】
要点まとめ
- 結論:在庫更新後の共通処理呼び出しをプログラム本体から分離し、宣言的に管理する技法はアスペクト指向プログラミングです。
- 根拠:アスペクト指向は関心事の分離を目的とし、横断的な処理(ロギングなど)をプログラム本体から切り離して管理できます。
- 差がつくポイント:単に共通モジュールを呼ぶだけでなく、呼び出し方の宜言(宣言)を共通化し保守性と開発効率を高める点が重要です。
正解の理由
アスペクト指向プログラミング(AOP)は、ロギングやトランザクション管理などの横断的関心事をプログラム本体から切り離し、宣言的に適用できる技法です。
案2のように「在庫更新後に更新ログを出力する」という処理の呼び出し方を共通プログラムに宣言し、各プログラムからは直接呼び出さない設計はまさにAOPの特徴です。
これにより、プログラムAやBのコードはシンプルになり、共通処理の変更も一箇所で済むため保守性が向上します。
案2のように「在庫更新後に更新ログを出力する」という処理の呼び出し方を共通プログラムに宣言し、各プログラムからは直接呼び出さない設計はまさにAOPの特徴です。
これにより、プログラムAやBのコードはシンプルになり、共通処理の変更も一箇所で済むため保守性が向上します。
よくある誤解
オブジェクト指向は機能のカプセル化や継承を扱いますが、横断的関心事の宣言的分離はできません。
関数型プログラミングは副作用の管理に優れますが、今回のような横断的処理の切り離しとは異なります。
関数型プログラミングは副作用の管理に優れますが、今回のような横断的処理の切り離しとは異なります。
解法ステップ
- 問題文で「共通モジュールの呼び出し方の宜言を共通プログラムに記述」とある点を確認する。
- これはプログラム本体から横断的処理を分離し、宣言的に管理する技法であると理解する。
- 横断的関心事の分離を特徴とするプログラミング技法を選択肢から探す。
- アスペクト指向プログラミングが該当するため、これを正解と判断する。
選択肢別の誤答解説ステップ
- ア: アスペクト指向プログラミング
正解。横断的関心事を宣言的に分離し、共通処理の呼び出しを効率化・保守性向上できる。 - イ: オブジェクト指向プログラミング
クラスや継承による機能のカプセル化が主で、横断的処理の宣言的分離はできない。 - ウ: 関数型プログラミング
副作用の制御や関数の合成に強みがあるが、共通処理の宣言的切り離しとは異なる。 - エ: 構造化プログラミング
制御構造の整理に関する技法で、共通処理の横断的分離とは無関係。
補足コラム
アスペクト指向プログラミングは、JavaのAspectJやSpring FrameworkのAOP機能などで実装されます。
ロギングやトランザクション管理、セキュリティチェックなど、複数箇所に散らばる共通処理を一元管理できるため、大規模開発で特に有効です。
ロギングやトランザクション管理、セキュリティチェックなど、複数箇所に散らばる共通処理を一元管理できるため、大規模開発で特に有効です。
FAQ
Q: アスペクト指向プログラミングはどのように実装されるのですか?
A: 通常は「アドバイス」と呼ばれる共通処理を「ポイントカット」で指定した箇所に自動的に挿入します。
A: 通常は「アドバイス」と呼ばれる共通処理を「ポイントカット」で指定した箇所に自動的に挿入します。
Q: オブジェクト指向とアスペクト指向の違いは何ですか?
A: オブジェクト指向は機能のカプセル化に注力し、アスペクト指向は横断的関心事を分離して宣言的に適用する点が異なります。
A: オブジェクト指向は機能のカプセル化に注力し、アスペクト指向は横断的関心事を分離して宣言的に適用する点が異なります。
関連キーワード: アスペクト指向プログラミング, 横断的関心事, 共通処理, ロギング, 保守性, 宣言的プログラミング