🚀 ニフティ’s Notion

【オブジェクト指向2025 #3】オブジェクト指向とは?

目次

🧠 プログラミングパラダイムとは?

先輩:書き方の思想 だと思ってね
主な3つのパラダイム
パラダイム キーワード 特徴
構造化 if / for GOTO禁止!読みやすく
オブジェクト指向 class / self データと処理をまとめる
関数型 map / filter 副作用をなくす

  • 現代のプログラミング言語の多くは複数のプログラミングパラダイムを取り入れている
    • そのような言語をマルチパラダイム言語と呼ぶ
    • オブジェクト指向ではないけどオブジェクト指向っぽい、関数型ではないけど関数型っぽくかけるというように、一部を取り入れることも多い
構造化プログラミング(ほとんどの言語)
  • 頻出パターンをif/elseやfor/whileなど、特定の制御構文で置き換え
  • goto文によって、直接的な処理の移動を禁止
    • スパゲッティプログラムによるコードの崩壊を防止

直接的な制御の移行 に規律を課した

オブジェクト指向プログラミング(Pythonなど)
  • データアクセスの制限・実装の隠蔽
  • 安全に関数ポインタを取り扱う
  • ポリモーフィズムの発見

間接的な制御の移行 に規律を課した

関数型プログラミング(Haskellなど)
  • 変数の再代入を禁止・または大きく制限
    • 変数の不変化
    • 並列処理に強み

代入 に規律を課した

💬 なんでプログラミングパラダイムは生まれたの?
先輩: 全部、プログラマが できることを制限する ためなんだよ
  • GOTO → 禁止
  • 関数ポインタ → 安全に使う
  • 代入 → 極力減らす
俺: やれることを増やすんじゃなくて、 やっちゃダメなこと を決めるのが目的なんだね
先輩: 仕組みによって、人間の過ちを防止するんだ!

🧊オブジェクト指向

システム全体を、モノに見立てた「オブジェクト」と呼ばれる構成単位の組み合わせとして捉え、システムの振る舞いをオブジェクト間の相互作用としてとらえる考え方。

複雑なシステム記述、巨大なライブラリ(特に部品間で緊密で複雑な相互関係を持つもの)の記述においては、オブジェクト指向の考え方は必須である。

🧭 オブジェクト指向ってなんで生まれたの?
  1. 複雑性の増大
    → 手続き型じゃ管理が厳しくなった。プログラムが巨大になると 全体の構造が見えにくく、修正や再利用が困難
  2. ソフトウェアの保守コストの増加
    作ったあとに修正・拡張するフェーズ が大部分
  3. 現実世界のモデリングの必要性
    → 現実の「ものごと」をそのままソフトウェア上の「オブジェクト」として表現
  4. 再利用と拡張性の向上
    → 継承、カプセル化、ポリモーフィズムなどで「同じコードを何度も書きたくない」「似た機能を簡単に拡張したい」を解消。
俺: 複雑な世界を、わかりやすく保つ仕組みなんですね。

このような経緯を経て、OOPはソフトウェア開発の主要なパラダイムの一つとして定着した。OOPは、ソフトウェアの複雑性を管理し、再利用性を高めるための強力な手段として、現在も広く利用されている。

🧭 なんでオブジェクト指向が使われるのか?
  • クラスによるカプセル化、継承、ポリモーフィズムにより、大規模開発でも部品の再利用や分業がしやすくなった。
  • チーム開発や長期保守が前提の業務アプリケーションで特に有利だった。
  • 「モノ(オブジェクト)」として考える設計は、現実世界を直感的に捉えやすい。
    • 例:車(クラス)を作って個別の車(インスタンス)を使う、という考えが理解しやすい。
オブジェクト指向のメリット
  • 複数人で並行作業するチーム開発や業務で取り扱う大規模システムにメリットが現れやすい
👥
分業しやすい
  • オブジェクト単位で作業ができるため複数人での並行作業がしやすい。
  • システムの規模が大きくなる程、プログラムの実装は膨大になるため、複数人で開発作業を並行して行う必要がある。
🌀
拡張性が高い
  • ビジネスの加速に併せて、すぐに拡張・新機能が追加できる。
再利用性が高い
  • オブジェクトを使いまわせる。
  • 同じ処理を何度も書く必要がなくて楽
    • ただし、本質的には別のものを共通化する危険性があるのでやりすぎは良くない
👀
可読性が高い
  • 業務では自分が書いてないコードを読んで改修していく
🧑‍🏭
保守性が高い
  • 不具合が発生した場合の問題箇所の特定もしやすい。
主要な概念(以降解説)
カプセル化
👨‍👨‍👦
継承
😸
ポリモーフィズム

まとめ

オブジェクト指向とは、システムをオブジェクトと呼ばれる構成単位を組み合わせとして捉え、オブジェクト間が相互作用することによって振る舞いが生まれるとする考え方
分業化しやすい、拡張性が高いなどのメリットによってチーム開発で採用されやすい。
ポリモーフィズム、カプセル化、継承などが主要な概念。