ITパスポート 2009年 秋期 問47
問題文
オブジェクト指向設計の特徴はどれか。
選択肢
ア:オブジェクト指向設計によってプログラムの再利用性や生産性が向上することはない。
イ:オブジェクトに外部からメッセージを送れば機能するので、利用に際してその内部構造や動作原理の詳細を知る必要はない。(正解)
ウ:個々のオブジェクトは細分化して設計するので、大規模なソフトウェア開発には使用されない。
エ:プログラムは処理手順に従って設計され、データの集合はできるだけプログラムと関連付けない。
🔒 解説は解答すると表示されます
オブジェクト指向設計の特徴はどれか。【ITパスポート 解説】
正解の理由
「オブジェクト指向設計」は、オブジェクト(データとそれに関連する操作を一つにまとめたもの、英: object)を単位にして設計します。オブジェクトは内部のデータや処理を外部から直接触らせずに、外側に公開する「操作(メソッド)」だけでやり取りします。これをカプセル化(encapsulation:データと処理を一つにまとめて隠すこと)と呼びます。
選択肢イは「外部からメッセージを送れば機能するので、利用に際してその内部構造や動作原理の詳細を知る必要はない」と述べています。これはオブジェクト指向の「インターフェース(外部に公開する使い方)」と「カプセル化」の考え方そのものであり、正しい記述です。
解法ステップ
- 各選択肢のキーワードを探す(例:「メッセージ」「内部構造を知る必要はない」「再利用性」「処理手順」)。
- 「オブジェクト指向」の基本を思い出す:オブジェクト、カプセル化、継承(inheritance:上位の性質を受け継ぐ仕組み)、ポリモーフィズム(polymorphism:同じ呼び方で異なる振る舞い)など。
- 選択肢と対応させる:
- 「メッセージを送る」→ オブジェクト指向の特徴(正解の可能性高い)
- 「再利用性が向上しない」→ 逆に向上するはずなので誤り
- 「細分化して大規模に使えない」→ 逆で大規模開発でも使われる
- 「処理手順に従って設計」→ 手続き型(procedural)設計の説明でオブジェクト指向ではない
- 最も合致するものを選ぶ(イ)。
選択肢別の誤答解説
-
ア: 「オブジェクト指向設計によってプログラムの再利用性や生産性が向上することはない。」
- 誤り。オブジェクト指向は部品(クラス・オブジェクト)を再利用しやすくする設計思想です。よって再利用性や生産性の向上に寄与します。
-
イ: 「オブジェクトに外部からメッセージを送れば機能するので、利用に際してその内部構造や動作原理の詳細を知る必要はない。」
- 正しい。オブジェクトは内部を隠して操作だけを公開します(カプセル化)。外部はインターフェース(使い方)だけ知っていれば利用できます。
-
ウ: 「個々のオブジェクトは細分化して設計するので、大規模なソフトウェア開発には使用されない。」
- 誤り。細分化=モジュール化は大規模開発で管理しやすくするための手法です。オブジェクト指向は大規模開発でも広く使われます。
-
エ: 「プログラムは処理手順に従って設計され、データの集合はできるだけプログラムと関連付けない。」
- 誤り。これは手続き型(procedural:処理手順を重視する設計)の説明で、オブジェクト指向とは対照的です。オブジェクト指向ではデータとそれを扱う処理を関連付けます。
よくある誤解
- 「オブジェクト指向=ただクラスをたくさん作ること」
- 誤りです。重要なのは設計の考え方(役割・責務を整理すること)で、むやみに分けると逆に複雑になります。
- 「オブジェクト指向なら自動的に再利用できる」
- 再利用しやすい設計にするための手段が揃っているだけです。良い設計(適切な抽象化と分離)が必要です。
- 「呼び出し=メッセージ送信なら内部は完全に無視してよい」
- 利用時は内部を知らなくてよいですが、設計・修正時には内部構造や副作用を理解する必要があります。
補足コラム
オブジェクトに「メッセージを送る」とは、プログラム上では「メソッド(操作)を呼び出す」ことです。身近な例えとして自販機を考えます。自販機は「お金を入れる」「商品を選ぶ」「ボタンを押す」という外側からの操作(インターフェース)で動きます。利用者は内部のメカニズム(どの歯車がどう動くか)を知らなくても商品を買えます。これがカプセル化の考え方です。
簡単なコード例(Python)でイメージします:
class VendingMachine:
def __init__(self):
self._stock = {"cola": 5} # _で始まるものは外部から触らない約束
def buy(self, item):
if self._stock.get(item, 0) > 0:
self._stock[item] -= 1
return item + " を受け取りました"
else:
return "在庫なし"
# 利用者(外部)はメソッドを呼ぶ(メッセージを送る)だけ
vm = VendingMachine()
print(vm.buy("cola")) # "cola を受け取りました"
利用者は
buy メソッドを呼ぶだけでよく、_stock の中身や更新の仕組みを知らなくて構いません。FAQ
Q1: オブジェクトとクラスの違いは?
- クラスは設計図、オブジェクトはその設計図から作られた実体(インスタンス)です。家(オブジェクト)と設計図(クラス)の関係に似ています。
Q2: 「メッセージを送る」ってプログラミングでは具体的に何をするの?
- 具体的にはオブジェクトのメソッド(関数)を呼び出します。呼び出す側は公開された操作(インターフェース)だけを使います。
Q3: オブジェクト指向はいつ使えばよいですか?
- 複雑な業務をモデル化する場合や、部品の再利用や保守性を重視する開発で有効です。ただし小さなスクリプトでは手続き型のほうが簡潔な場合もあります。
関連キーワード: オブジェクト指向、カプセル化、インターフェース、継承、ポリモーフィズム、メソッド、再利用性、モジュール化

\ せっかくなら /
ITパスポートを
クイズ形式で学習しませんか?
クイズ画面へ遷移する→
すぐに利用可能!

