時代に翻弄されるエンジニアのブログ

ゲームプログラマをやっています。仕事やゲームや趣味に関してつらつら書きたいと思います。

オブジェク指向開始以前

f:id:tkymx83:20190526002026j:plain


お久しぶりです。最近ブログを更新していなかったのですが、落ちついてきたので更新したいと思います。

最近、社内ではオブジェクト指向などのコードの設計を見直そうという動きが活発です。というのも、新しく入ってきた方がかなりこの界隈に詳しいようで、それに若干触発されているからです。

そこで、オブジェクト指向などの一般的な知識から見直そうという感じで今日ブログを書いています。

読む前に

オブジェクト指向は新しいソリューションの一つのように言われていますが、実際はそんな事はありません。つまりは、それを使用したからと行って、プロジェクトが上手く進むわけでもないし、簡単にアプリを作れるようになるわけでもありません。

ではオブジェクト指向とはなんなのか、それはルールのない自然な概念をプログラムに提供するものだと考えています。今回はなぜそう思ったのかについて書いていきたいと思います。

オブジェクト指向に対してはじめに思うこと

オブジェクト指向の本を読むと、車の例えがよく出てくると思います。車がクラスで、車を継承して、軽自動車ができるという話です。

ここで、言われていることはクラスとは概念であり、まだ実装されていないなどと行った表現がよく使われます。ここで大体の人が意味がわからなくなるのですね。概念って何?という話です。ではこの概念や実態がどのようなメリットもたらすのかについて触れたいと思います。

なぜ概念が必要なのか?

オブジェクト指向が生まれる前は、構造化プログラミングが主流の時代でした。構造化プログラミングでは、上から下に従って、関数を実行し、内部でデータの変更をしています。

語弊を恐れないで話すと、機械的な処理となり、人間本来の思考とは異なった動きをしています。僕が思う人間本来の動きというのは、人間は手をもっていて、足を持っていて、手を動かすことでものを掴むことができるという思考の流れのことを言います。構造化プログラミングでは、手を使って何かを掴むときに、掴むという動作を定義して、内部では事前用意した手の器に物を入れ込むという動作になります。聞いているだけで掴みどころのなり表現あるとわかります。

しかし、実際は手がものを掴むのです。この処理を実行するためには、手という概念を考える必要があります。つまり、手は5本の指からなっており、それらを使用することで物を取ることができるということです。手の概念がわからないと、手が物を取るという実装すら行うことができません。

概念を使ったプログラムのメリット

先程の手の例のように人間世界の概念をプログラム上で再現できるのだとしたら、人間の考えを素直に実装することができます。以前は、プログラム用のコードに自分の考えを投影する必要があったのですが、概念を導入することによって、コードを見たまま素直に受け入れることができるのです。これが最大のメリットになると思っています。

つまりは、人によって考えにばらつきが生じることなく、共通認識のコードを生産できるということです。また、概念どうしの整合性をとることは、現実空間を参考にすることで容易にできる(例えば、歩くなら、手と足を動かすなど)ため、ある程度誰でもすぐ理解できるため、拡張性や保守性にとんだコードになります。

まとめ

オブジェクト指向は、概念をプログラムに導入しました。その概念をベースに物事を考えることで、整合性のあるコードが書けるようになったということです。

オブジェクト指向では、その概念を補足するルールとして、継承やポリモーフィズムや隠蔽化など色々なものがあります。しかし、ルールがすべてを網羅するわけではないこと、そしてルールを理解しないまま使うことでこの概念はもろく崩れ去る危険性を持っています。概念になりきれていないのがオブジェクト指向の罠とも言えます。

今後ブログでは、そのオブジェクト指向の罠や良い使い方などを書いていきたいと思います。