1. 概要
オブジェクト指向プログラミング(Object-Oriented Programming: OOP) は、1980年代以降に広く普及したプログラミングパラダイムです。
従来の「手続き(構造化プログラミング)」に対して、現実世界の「モノ(オブジェクト)」をプログラムで表現する ことを目指しています。
OOP では、データ(属性)とそれに関連する操作(メソッド)を「オブジェクト」という単位にまとめ、再利用性や拡張性を高めます。
2. 基本概念
オブジェクト(Object)
- 現実世界の「モノ」を抽象化したもの
- データ(フィールド / プロパティ)と振る舞い(メソッド)を持つ
クラス(Class)
- オブジェクトを生成する設計図
- 例:
class Car { var speed; void run(); }
カプセル化(Encapsulation)
- データと処理をまとめ、外部からの直接アクセスを制限
- 情報隠蔽によって安全性を確保
継承(Inheritance)
- 既存クラスの特性を引き継ぎ、新しいクラスを定義
- コード再利用を促進
ポリモーフィズム(Polymorphism)
- 同じインターフェースで異なる実装を扱える
- 例:
Shape
のdraw()
メソッドを、Circle
とSquare
で異なる実装に
3. メリット
- 現実世界をモデル化しやすい
- 再利用性の高いコードを構築できる
- 大規模開発において保守性が向上する
- フレームワークやライブラリの設計に適している
4. デメリット・批判
- 小規模では冗長になりやすい
- 継承の乱用で依存関係が複雑化することもある
- 関数型アプローチに比べ、副作用管理が不明瞭になりやすい
5. 代表的な言語
- Smalltalk(OOPの始祖)
- C++
- Java
- C#
- Kotlin / Swift / Python /Dart(モダンOOP + FP要素も併用)
6. コード例:OOPによる FizzBuzz(Kotlin)
// ルールのインターフェース
interface Rule {
fun apply(number: Int): String?
}
// Fizzルール
class FizzRule : Rule {
override fun apply(number: Int) = if (number % 3 == 0) "Fizz" else null
}
// Buzzルール
class BuzzRule : Rule {
override fun apply(number: Int) = if (number % 5 == 0) "Buzz" else null
}
// FizzBuzzクラス
class FizzBuzz(private val rules: List<Rule>) {
fun value(number: Int): String {
val result = rules.mapNotNull { it.apply(number) }.joinToString("")
return if (result.isEmpty()) number.toString() else result
}
}
// 実行
fun main() {
val fizzBuzz = FizzBuzz(listOf(FizzRule(), BuzzRule()))
(1..20).forEach { println(fizzBuzz.value(it)) }
}
- 構造化 では「手続きとして書く」
- OOP では「オブジェクトに責務を持たせる」
7. Structured との違い
観点 | 構造化 | OOP |
---|---|---|
単位 | 手続き・関数 | オブジェクト(データ+メソッド) |
主眼 | 制御構造の整理 | 現実世界のモデリング |
強み | 可読性、アルゴリズムの明確化 | 保守性、再利用性、大規模開発 |
まとめ
- OOP は 現実世界のモノをプログラムで表現 するパラダイム
- カプセル化・継承・ポリモーフィズム が核となる概念
- 大規模開発におけるソフトウェアの保守性を大幅に高めた
- 現代言語は多くが OOP+FPのハイブリッド を採用している