TL;DR
データの状態と、それを操作する処理を一体にした「オブジェクト」を基本単位に、ソフトウェアを組み立てるプログラミングパラダイム。主な特徴は、カプセル化、継承、ポリモーフィズムである。
仕組み
Wikipedia によると、主な特徴は次の 3 つである。
- カプセル化: データとそのデータを操作する関数を結び付け、両者を外部からの干渉や誤用から守る
- 継承: クラスを「○○は△△である」という関係の階層に置き、親クラスのデータやメソッドを子クラスで再利用する
- ポリモーフィズム: 呼び出し側は、階層内のどのクラスを操作しているかを意識しなくてよい
言語の作りには 2 種類ある。クラスベースの言語では、先にクラスを定義し、それに基づいてオブジェクトをインスタンス化する。プロトタイプベースの言語にはクラスがなく、既存のオブジェクト(プロトタイプ)をもとに新しいオブジェクトを作る。
例
「object-oriented」という言葉は、Alan Kay が 1967 年ごろに考えたとされる。Kay らは 1970 年代に Xerox PARC で Smalltalk を開発した。Ruby は Smalltalk の「すべてのものはオブジェクトである」という設計思想を受け継いだクラスベースの言語であり、Scala や Kotlin は関数型プログラミングと組み合わせて書ける。
注意点
デザインパターンには、オブジェクト指向プログラミングの制約を回避するために生まれた面もある。