ある日ふと思った
オブジェクト指向とgofのデザインパターンとか、oopの原則はいつもセットで語られます。
ではそもそものオブジェクト指向自体はなんなのでしょうか。
オブジェクト指向とは
OOPのメリットは多態性ってよく言われますが、それはオブジェクト指向自身とは全然関係ないです。オブジェクト指向の言うオブジェクトとはなんでしょう、何を指向してるのでしょうか。
構造化プログラミング
OOPを語るには構造化プログラミングをサンプルにすると良いらしい。構造化プログラミングはしたことないのですが、データと処理(機能)単位で分解するらしい。
でもデータと処理を纏められたらいいよねってことで、オブジェクト指向がでてきました。
オブジェクト指向では
オブジェクト指向ではオブジェクトとオブジェクトを連ならせてプログラムを書きます。
オブジェクトは0以上のオブジェクトを利用する事ができます。
つまり、オブジェクト指向言語を使ってプログラムをする際はそのプログラムは1つ以上のオブジェクトで構築されます。(entry pointのファイル自体もmoduleなので。
オブジェクト指向の言うオブジェクトとは
思考の補助の為にあえて特定のプログラミング言語で例を出します。
オブジェクト指向の言うオブジェクトはpythonやjsで言う所のmoduleです。
つまりimportできる奴です。
また、moduleが提供している(exportとか)シングルトンインスタンスや、値、関数、クラスにいたるまでこの2つの言語の場合はオブジェクトとして扱えます。パッケージまでオブジェクトとして使えるのもあります。
逆にオブジェクトとして全然扱えない言語もあります。言語の実装次第ってことですね。
サンプル図
このリンクにある視点と結果項目の図がかなりわかりやすいですが、よそのサイトの画像勝手にもってくるのもと思いますので一応自分で書いた図を乗せておきます。
パッケージもモジュールも何もかもがオブジェクトみたいなことを書いていますが、これは言語の実装によりけりです。
つまり
オブジェクト指向の言うオブジェクトとは、値と処理を集合の事です。
なので、オブジェクト指向とは、値と処理を束ねた物で行こうぜ!って事ですね。
それに付随してじゃあどういうふうにオブジェクトを作れば良いのかって事で原則やらこう作るパターンもあるよ!って色々なものが周りにある感じです。
コンポーネント指向についての余談
オブジェクト指向とコンポーネント指向の違いについてはこちらのリンクがとても参考になる。
フロントエンドで流行ってる、提唱しているコンポーネント指向は、上のリンクのコンポーネント指向と同一かどうかは甚だ疑問だが、しかしかなり近い概念であるのは間違いないだろう。
オブジェクトが文芸的プログラミングで作られるか、数学的プログラミングで作られるかの違いでオブジェクト指向かコンポーネント指向かの分類をしているように見受けられる。
フロントの場合は、オブジェクトに数学的な要素を詰め込んだってよりかは(極論言えば最終的にそうなのだが)、ビジュアル的プログラミングとでも言えば良いのか。フロントのオブジェクトはこのビジュアル要件を達成する各種要素が詰め込まれているような。このビジュアルには、ビジュアルの動作、アニメーション等も含まれており、コードとして表現すると中々に複雑だ。特にメンテが辛い。
なので、コンポーネントとしてパッケージングすることにより、再利用性だけではなく、修正コスト等を最小限に留められる。
自分の場合はコンポーネント指向とオブジェクト指向、関数型プログラミングを混在して適材適所で使っている。開発している上でこれが上手く行っているのはとても感じられていて間違いないのだが、しかし従来のこれだけで良いでしょ!と比べると要求スキルはとても上がっているのは間違いない。
最後に
まさかりはいつだって怖いのですが、まぁもし間違ったこととか言ってたらアドバイス頂けるとめっちゃ助かります!