手続き型は処理の手順や関数を中心に、オブジェクト指向は状態と操作を持つオブジェクトを中心にプログラムを構成します。どちらが常に優れているかではなく、どう責務を整理するかで比べましょう。
口座処理を同じ題材で比較する
| 観点 | 手続き型 | オブジェクト指向 |
|---|---|---|
| 構成の中心 | 処理手順・関数 | オブジェクトの状態と操作 |
| 口座の例 | 口座データを入金・出金関数へ渡す | 口座オブジェクトの入金・出金メソッドを呼ぶ |
| データへの入口 | 関数やモジュールで設計する | 公開メソッドとアクセス制御で設計する |
| 再利用・保守 | 関数・モジュールの分け方で変わる | クラスの責務や関係の設計で変わる |
手続き型でも、構造体やモジュールを使ってデータと処理を整理できます。オブジェクト指向でも、メソッドの内部には処理手順があります。「手続き型は再利用できない」「大規模開発は不可能」といった単純な優劣ではありません。
クラスとインスタンスを区別する
| 概念 | 意味 | 例 |
|---|---|---|
| クラス | 共通する属性や操作を定義する型 | 銀行口座クラス |
| インスタンス | クラスを基に生成した実体 | Aさんの口座・Bさんの口座 |
| カプセル化 | データと操作をまとめ、内部へのアクセスを制御 | 出金メソッドで金額・残高を確認 |
| 継承 | 既存クラスを基に新しいクラスを定義 | 動物クラスを継承した犬クラス |
| 多態性 | 共通の操作で対象に応じた実装を利用 | 犬と猫に鳴く操作を呼び出す |
カプセル化・継承・多態性で整理する
カプセル化では、状態を変更する入口を決めて内部の詳細を隠します。継承では、共通の特徴を上位のクラスから引き継ぎます。多態性では、共通の操作から実際の対象に応じた処理を利用します。
動物を表す共通の型から「鳴く」を呼び出すと、犬では「ワン」、猫では「ニャー」と動作します。呼び出す側は共通の操作を使い、実際の対象に応じて処理が選ばれます。継承したメソッドの実装を子クラスで再定義するのがオーバーライドです。同じ名前のメソッドを引数の型や個数などを変えて定義するオーバーロードとは区別します。対応の詳細は言語によって異なります。
言語名だけで書き方を決めない
Cは手続き型の説明でよく使われ、Javaはオブジェクト指向の説明でよく使われます。ただしC++やPythonなどは複数のプログラミングスタイルを利用できます。方式を選ぶときは、変更のしやすさ、処理の分かりやすさ、チームの設計方針などで判断します。
理解を確かめる確認問題
「オブジェクト指向なら、手続き型より必ず高速で保守しやすい」は正しいでしょうか?
解答・解説を見る
誤りです。速度は実装や実行環境、保守性は責務や依存関係の設計によって変わります。まずは構成の中心と、状態の扱い方の違いを押さえましょう。

コメント