OOPが存在する理由:コードは現実世界のものを扱う
Why OOP Exists
この記事は、オブジェクト指向プログラミング(OOP)の核心的な考え方を、著者が大学時代に図書館管理システムを実装したエピソードを通して解説します。著者は友人と分担作業をする中で、本や著者といった実世界のエンティティを抽象化し、操作する関数群を設計する重要性に気づきます。OOPは、データと関数をまとめるための仕組みであり、Pythonのclassによる名前空間の提供がその実現を容易にします。この記事を読めば、OOPがなぜ存在するのか、その本質を理解できるでしょう。
OOPの核心的なアイデアは、扱いたいエンティティに対して高レベルの抽象化を作成し、それらを扱いやすくすることです。
HNでの議論
63- reaanb2
この記事は、オブジェクト関係マッピング、ボイラープレートコード、データベーススキーマのコードへの重複、ナビゲーショナルデータアクセス、インピーダンスミスマッチにつながるOOPアプローチを説明している。データモデリングと分類法を中心にOOPを定義しており、責任を中心に定義していない。「聞くな、命令しろ」や「単一責任」といった原則は無視されている。図書館管理システムにおいて、本にどんな責任があるだろうか? ない。本は記録された事実の対象に過ぎず、より良いアプローチは、解決空間の振る舞いの構成要素を特定し、それらをクラス/オブジェクトとして構築し、事実をオブジェクト内にカプセル化するか、オブジェクト間で通信させることだ。
- mickeyp
OOPは良い。アーキテクチャや設計が要求するなら、OOPを使わないのも良い。
人々が忘れているのは、GoFのデザインパターン本と同様に、言語やフレームワークは進化するということだ。
デコレータパターンは、1990年代にはニッチだが有用な抽象化だった。今日のPythonでは、@decorateをそのように使える。それは進化だ。
OOPも同じだ。カプセル化と、カプセル化するスロットと同じ場所にメソッドを置くことは、基本的な構造体に対する信じられないほど強力なアップグレードだった。今では、ほとんどの言語が第一級関数とレキシカルスコープを持っているので、自分でカプセル化を構築できる。
すべて良いことだ。最適なものを使えばいい。
- mrkeen
確かに、これはかなり速く読んだが、これは単なる構造体だ。
ここでモデル化されている「振る舞い」はデータアクセスだった。.nameの代わりに.name()と書くこと。
これらの構造体を手動でパッキングする手間を省くには、コンストラクタを完全に書き出すことだ。記事はそれを「自動」と呼んでいた。
(C99の構造体では、コンストラクタを書き出す必要すらない。おそらく他の現代の言語でも同様だ。)
- eru
- tarix29
この記事の何もOOPに固有ではない。これらはすべて構造体と静的ディスパッチで実現できる。ドット記法をサポートするGoやZigのような言語のコードも、かなり似たものになるだろう。