この記事は全部俺 Advent Calendar 2018の22日目の記事です。
とあるSEの妄想怪文書です。個人の考えなのでその前提で読んでいただけると幸いです。
オブジェクト指向と関数型
プログラミングの歴史は状態との戦いの歴史です。
プログラミングでの状態との付き合い方はオブジェクト指向と関数型の2種類に大別できます。
オブジェクト指向と関数型は、どちらも状態と上手に付き合うことを目的としていますが、アプローチの方法は正反対です。
- オブジェクト指向
- 状態をオブジェクトの形式でラッピングし、使用者が意識しないで使えるようにすることを目的とする
- 状態を中に持つ
- 関数型
- 状態を内部で持たないようにし、引数/戻り値以外で状態を取り扱わない
- 状態を外に持つ
どちらも状態を意識しているのに、オブジェクト指向は状態をプログラムの中に閉じ込めて見えないようにしているのに対して、関数型は使用者が見えるところ以外で状態を取り扱わないようにしているというのが面白いところですね。
なお、ここで言うオブジェクト指向や関数型とは、言語の話ではなく設計の話になります。
オブジェクト指向とマイクロサービス
マイクロサービスの時代になってくると、状態との付き合い方はより大事な考え方になってきました。
全てのマイクロサービスが同じ状態を参照したり、複数のマイクロサービスが同じ状態を更新したりすることが発生したためです。
こうなると、個別のマイクロサービスに対してオブジェクト指向の考え方を適用するのは具合が悪いです。
マイクロサービスAの中でのみ使用する状態がある場合、Aを呼び出す度に値が異なってしまう可能性があると後続のマイクロサービスも連鎖的に結果が変わるということが起こってしまうかもしれません。
そこで、関数型の考え方が重要になってきました。状態は内部で保持するよりも外から与えられるべきであるという考え方です。最近のプログラミングでは、関数型で書いて副作用を極力避けるということが一般的になってきたように思います。
ただ、実際のサービスにおいて、状態はどこかで保持する必要があります。(例えば、Twitterなどではユーザーごとに投稿しているTweetが異なっていますので、これをDBなどで保持する必要があります。)状態を扱っていて、実行するタイミングや状況などで結果が変わることが予想されるところではオブジェクト指向の方が適任と言えるでしょう。
マイクロサービス化が進む先にあるもの
今後もマイクロサービス化が進んでいった場合、汎用言語の価値は相対的に下がっていくと思います。
モノリシックなシステムの時代は、1つの言語でなんでもできるということが重要でした。
しかし、マイクロサービス化が進んでくると、それぞれのマイクロサービスで特定の分野に強いものを選ぶことができるので事情が異なって来ます。画面表示に特化した言語/フレームワークや数値計算に特化した言語など、なんでもできるよりも特定の分野や領域で無類の強さを発揮する言語の価値が上がっていくはずです。
まとめと所感
オブジェクト指向と関数型の良いところを活かしながら、適材適所な設計/プログラミングを行っていくことが今後より重要になっていくと思います。今後は、オブジェクト指向/関数型の二元論的な話だけではとどまらず、より特化した言語やフレームワークを選択することがより良い選択となっていく可能性が高いと思います。
画面表示に特化した言語/フレームワーク
来年になるまでにElmを学び始める所存です!
今後も面白い思想の尖った言語がどんどん出てくることを願っています。