2000年初頭はオブジェクト指向帝国全盛の時代(ヒャッハー!!)
20年前ぐらいは、Javaがソフトウェア業界でも幅を効かせており、「オブジェクト指向」がプログラム設計では覇権を握っていました。そして、Javaだけでなく、PHP、Ruby、Python、JavaScriptでもオブジェクト指向設計でプログラミングすることが一般的になっていたと思います。
オブジェクト指向帝国の時代です。(イメージは筆者の個人的な妄想世界観です)
私は40代半ばです。ちょうど2000年頃からソフトウェア業界に足を踏み入れました。
当時のWeb開発現場は、猫も杓子も「オブジェクト指向!、オブジェクト指向!!」という感じでした。
名ばかり「オブジェクト指向」も多かった
もっとも、実際、現場に行ってわかったのですが、クラス構文使っているだけで、中身は手続き指向設計とかわらないものが多くありました。
ぜんぜんクラスがオブジェクトじゃなくて単なるパッケージ・モジュール名じゃねーかって思ったことがよくあります。
オブジェクト指向設計をして、わかりやすくメンテしやすい設計というのはなかなか稀有で、抽象化や継承を乱用して、GoTo文によるスパゲッティを別構文でつくっているコードも何度となく見てきました。
どんだけうっすいクラスを継承すんだよって、何度ツッコんだ事か。
それでも、オブジェクト指向という掛け声だけが幅を効かせており、よくわからないけど、クラスつかって、継承しとけば「オブジェクト指向で、イケてるんだよ!」って思っているような現場を幾度となく見てきました。
こうした間違った「オブジェクト指向設計」についての批判としては、ミノ駆動さんの書籍を読むとよくわかりますね。
私は、ミノ駆動さんも尊敬されていると思われる増田 亨さんのスライドを読んだとき、オブジェクト指向はこういうものだよなと腑に落ちたのを記憶しています。この方のスライドに出会ってから、オブジェクト指向を比較的うまく使いこなせるようになった気がします。
2010年あたりまでは、「間違ったオブジェクト指向」が横行するほど、オブジェクト指向一色だったような気がします。そして、海外を中心に、「オブジェクト指向はだめじゃね?」みたいな意見が徐々にでてくるようになりました。
オブジェクト指向への反旗:関数型プログラミング支持の台頭
有名なのはこの2019年の海外の記事ではないでしょうか?(オブジェクト指向プログラミング - 1兆ドルの災害)
これら以外にも似たような記事はたくさんでてきました。そして、並行して関数型プログラミングを推す意見がこの辺りから徐々に生まれてきます。
「関数型プログラミング VS オブジェクト指向」というテーマの記事は2020年あたりから一気に増えてきます。少し古めの記事を貼っておきます。
Web開発現場にいて、関数型プログラミングの勢いがついたなと感じたのは、2019年にReact16.8で、React Hooksが登場して、関数コンポーネントでの書き方が主流になりだしたころです。
この頃から、Webのフロント(TypeScript、JavaScript)、そして、Pythonを界隈中心に関数型プログラミングが脚光を浴び、現場でも関数型プログラミングが増えていったように思います。もっともWeb開発の動きだけでなく、機械学習やAIの現場でも、関数型プログラミングが採用されていたので、この流れも後押ししていると思います。
また、Scala、Elixirなどの新しい関数型言語が生まれたのも後押ししているかもしれません。
こうして、20年近く覇権を握ってきた、オブジェクト指向帝国も一時のような勢いを失ったように思います。
ややオブジェクト指向に対して批判的に書いてきましたが、個人的には、オブジェクト指向設計が悪いとも思わず、使う領域を選べば有用だと思っています。
「名ばかりオブジェクト指向」でスパゲッティコードを作り出したことについては批判的ですが、ミノ駆動さんや増田了さんが示してくれた正しいオブジェクト指向設計を利用するのであれば、有用な設計手法だと思います。
一方で、関数型プログラミングにも良さがあり、値そのもの、状態そのものではなく、関係性を定義し、その関係性を連携させることが多いアプリケーションでは、積極的に使っていくべきだと思います。
補足:関数型プログラミングには名前付き引数が半ば必須な気がする
最近、ReflexというPythonだけでWebアプリを作るライブラリをつかって開発をしています。Reflexは、ReactコードをPythonで実装するようなもので、関数型プログラミングに近い感じがします。
関数オブジェクトを連携させて行くコーディングをしていると、インターフェースが引数になるわけですが、その際に、名前付き引数がないと結構厳しいなとよく思います。
とはいえ、名前付き引数がない有名なプログラミング言語は結構少ないと思います。仮に文法としてなくても、TypeScriptやJavaScriptみたいにオブジェクトやマップを引数に渡して、擬似的な名前付き引数を実現することができます。
名前付き引数は、オブジェクト指向でいえば、プロパティを個別に指定するのに似ています。
引数の順番だけで引数を与えるのはなかなか厳しいものがあります。もちろん、引数の組み合わせごとに関数をつくってもいいのですが、そうすると定義がめんどくさくなります。良いか悪いかは判然としないですが、名前付き引数で処理ごとにパラメーターを変えられるのは便利なときもあるなと思います。