基本情報技術者 2014年 春期 午前(科目A) 問50
問題文
ソフトウェア開発の活動のうち、リファクタリングはどれか。
選択肢
ア:ソフトウェアの品質を高めるために、2人のプログラマが協力して、一つのプログラムをコーディングする。
イ:ソフトウェアの保守性を高めるために、外部仕様を変更することなく、プログラムの内部構造を変更する。(正解)
ウ:動作するソフトウェアを迅速に開発するために、テストケースを先に設定してから、プログラムをコーディングする。
エ:利用者からのフィードバックを得るために、提供予定のソフトウェアの試作品を早期に作成する。
🔒 解説は解答すると表示されます
リファクタリング【午前解説】
正解の理由
正解: イ
イは「ソフトウェアの保守性を高めるために、外部仕様を変更することなく、プログラムの内部構造を変更する。」とあり、これはリファクタリングの教科書的定義に合致します。リファクタリングは機能追加や仕様変更を伴わず、コードの可読性・設計の改善・重複除去などを行い、既存の挙動(外部仕様)を保ちながら内部実装を改善します。動作保証のために既存テストや回帰テストを用いることが重要です。
イは「ソフトウェアの保守性を高めるために、外部仕様を変更することなく、プログラムの内部構造を変更する。」とあり、これはリファクタリングの教科書的定義に合致します。リファクタリングは機能追加や仕様変更を伴わず、コードの可読性・設計の改善・重複除去などを行い、既存の挙動(外部仕様)を保ちながら内部実装を改善します。動作保証のために既存テストや回帰テストを用いることが重要です。
解法ステップ
- 問題文のキーワードを探す:「リファクタリング」「外部仕様を変更することなく」「内部構造を変更」など。
- 定義と照合する:リファクタリングの定義は「外部仕様を保ったまま内部の構造改善」であると覚える。
- 選択肢を消去する:ペアプログラミング(ア)、テスト駆動開発(ウ)、プロトタイプ作成(エ)はそれぞれ目的や手法が異なるため除外。
- 正答を確定する:定義に一致する選択肢を選ぶ。
選択肢別の誤答解説
- ア:2人のプログラマが協力して一つのプログラムをコーディングする手法はペアプログラミング(エクストリームプログラミングの技法)であり、リファクタリングそのものではありません。
- イ:正解。内部構造改善で外部振る舞いを変えないという点がリファクタリングの本質です。
- ウ:テストケースを先に設定してからコーディングする手法はテスト駆動開発(TDD)で、開発プロセスの流れを示すものでリファクタリングとは異なる目的と手順です。ただしTDDのサイクルの中で「リファクタリング」は明確に位置づけられています(リファクタリングはTDDのステップの一つ)。
- エ:試作品を早期に作成して利用者のフィードバックを得るのはプロトタイプやMVP(最小実用製品)の考え方であり、リファクタリングの定義には該当しません。
よくある誤解
- 「コードを変えれば全てリファクタリング」:バグ修正や機能追加のための改変はリファクタリングではなく、外部仕様を変える作業は該当しません。
- 「リファクタリングはテスト不要」:むしろリファクタリングは既存の振る舞いを壊さないために単体テストや自動化テストが必須とされます。
- 「早く動くものを作る=リファクタリング」:プロトタイプや短期開発での試作は目的が異なり、振る舞いを保持して内部を改善するという点で区別されます。
補足コラム
リファクタリングはMartin Fowlerらによって広められた概念で、代表的な手法に「メソッドの抽出」「変数名の改善」「クラスの分割」「重複コードの統合」などがあります。重要なのは「動作を壊さない」ことの保証で、単体テストや自動テストがリファクタリングを安全に行う鍵です。以下に簡単な例を示します。
# リファクタ前:長い関数で複数責務を持つ
def process(items):
total = 0
for i in items:
if i > 0:
total += i * 0.1
else:
total += i * 0.2
print("合計:", total)
return total
# リファクタ後:計算部分を抽出して責務を分割
def calc_value(i):
return i * 0.1 if i > 0 else i * 0.2
def process(items):
total = sum(calc_value(i) for i in items)
print("合計:", total)
return total
リファクタリングはコード品質向上の投資であり、技術負債の蓄積を防ぎ長期的な開発速度を維持します。
FAQ
Q1. リファクタリングとコード書き換え(リライト)の違いは?
A1. リファクタリングは既存の外部振る舞いを保持して内部実装を改善する行為で、リライトは設計や言語を大幅に変えることが多く外部振る舞いが変わる可能性があります。
A1. リファクタリングは既存の外部振る舞いを保持して内部実装を改善する行為で、リライトは設計や言語を大幅に変えることが多く外部振る舞いが変わる可能性があります。
Q2. リファクタリングはテストがなくてもできますか?
A2. 小規模で確実に影響範囲が分かる場合を除き、テストなしでのリファクタリングはリスクが高いです。単体テストや回帰テストを用意してから行うことが推奨されます。
A2. 小規模で確実に影響範囲が分かる場合を除き、テストなしでのリファクタリングはリスクが高いです。単体テストや回帰テストを用意してから行うことが推奨されます。
Q3. リファクタリングはいつ行うべきですか?
A3. 新機能追加の前後、コードの臭い(コードスmell)を感じたとき、定期的な技術負債返済の一環として行うのが効果的です。
A3. 新機能追加の前後、コードの臭い(コードスmell)を感じたとき、定期的な技術負債返済の一環として行うのが効果的です。
関連キーワード: リファクタリング、保守性、内部構造、外部仕様、ペアプログラミング、テスト駆動開発、プロトタイプ、コードクリーンアップ、リファクタリング手法、リファクタリングツール

\ せっかくなら /
基本情報技術者を
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

