手続き型プログラミングとオブジェクト指向プログラミングの違い

手続き型プログラミングでは、関数が関数外部の変数に依存しないのに対し、オブジェクト指向プログラミングでは、関数(メンバー関数、メソッド)が関数外部の変数(メンバー変数、フィールド)に依存します。
言い換えると、手続き型プログラミングでは、関数の出力が入力だけで決まるのに対し、オブジェクト指向プログラミングでは、関数の出力が入力だけではなく状態(メンバー変数、フィールド)にも依存します。(図1及び図2参照)

   入力:読み込みのみ可。(read)
   状態:読み込み・書き込み可。(modify)
   出力:書き込みのみ可。(write)

注)オブジェクトは、変数(状態)とその変数を操作する関数(動作)の集まりです。



図1.手続き型プログラミングにおける関数

┌────┐   ┌────┐   ┌────┐
│ 入力 │──→│ 関数 │──→│ 出力 │
└────┘   └────┘   └────┘
 



図2.オブジェクト指向プログラミングにおける関数

         ┌────┐         
         │ 状態 │         
         └────┘         
           ↓↑           
┌────┐   ┌────┐   ┌────┐
│ 入力 │──→│ 関数 │──→│ 出力 │
└────┘   └────┘   └────┘
 



例えば、次の例のようにオブジェクト指向プログラミングでは、呼び出すごとに異なる結果を出力する関数を作ることもできます。これは、関数が状態にも依存しているからです。

 

example.java

class A {
  int i;
  int count() {
    return ++i;
  }
}

class Main {
  public static void main(String... args) {
    A a = new A();
    System.out.println(a.count());
    System.out.println(a.count());
    System.out.println(a.count());
    System.out.println(a.count());
    System.out.println(a.count());
  }
}
 



注)C言語において、グローバル変数や参照渡しされるローカル変数、関数内部のstatic変数は、いずれも状態を表します。

注)手続き型プログラミングとオブジェクト指向プログラミングは、どちらが優れているという訳ではありません。それぞれ状況に応じて使い分ける必要があります。