このすみノート

Webエンジニアが技術や趣味を書くブログです。

オブジェクト指向神話からの脱却を読みました - WEB+DB PRESS Vol.132

「WEB+DB PRESS Vol.132」を読みました。 オブジェクト指向について考える機会が最近なかったので、おもしろかったです。

私が個人的に感じたこと、重要だと思った点などをメモします。

私とオブジェクト指向

本の感想とメモを記す前に、少しだけ記憶を頼りに自分語りします。

オブジェクト指向に触れたきっかけ

私がはじめてオブジェクト指向に触れたのは、「山口家の逆襲」というサイトで、Perlのオブジェクト指向について勉強したのがきっかけです。

山口家の逆襲は今はなきサイトでして、代わりにPerlゼミを紹介しますが、クラス・インスタンス・カプセル化といった基本を学びました。

PerlはC言語のように手続き的コードを書くものだと当時は思っていたので、学習時の衝撃は大きかったことを覚えてます。

perlzemi.com

業務でも大いに活用することができ、Class::DBI系のインスタンスを扱ったり、クラスやモジュール単位でコードをまとめるのに役立ちました。

他の開発スタイルとの出会い

当時の私はPerlとPHPがメインだったのですが、どちらもオブジェクト指向の考え方をベースに、開発してました。

その後、モバイル開発に移籍しても変わらなかったのですが、他の開発スタイルに触れるきっかけとなったのがNode.jsです。

// Node.js
const fs = require('fs');

fs.readFile(__dirname + '/data.txt', 'utf8', (err, data) => {
  console.log(err, data);
});

無名関数を使った結果のやりとりには、学習当時、かなりの衝撃を受けました。 関数でのやりとりは思いのほか書き味が良く、私がオブジェクト指向神話から脱却したのは、ある意味この瞬間だったかもしれません。

本を読んだ感想

本特集の最大のメリットは、オブジェクト指向の歴史と、得意不得意を学べる点にあると思いました。 今後開発を続けていく上でのヒントや、示唆に富んでいるので考え方の参考にしたいです。

以下は、その他の細かいメモです。 (本書から一部を引用しています。)

モジュールとしてのクラス

クラスの最も基本的で重要な機能は、変数や関数をまとめることです。

個人的にクラスの最大のメリットは、一定単位で変数(定数)や関数をまとめることができる点にあると思ってます。

本書内で、「モジュールとしての性質はクラスの本来の用途ではなく副次的に発生したもの」と書かれてましたが、クラス設計がうまい人のコードはモジュールやクラス化の単位が適切で読みやすいイメージです。

継承という仕組みは縮小傾向

「継承できない」プログラミング言語(たとえばGo言語)が登場したことからも分かるように、継承はコードを複雑化するため、縮小傾向にあります。

個人的には、継承そのものよりオーバーライドを乱用されてコードが追いにくくなるのが嫌いで、継承はあまり使わなくなりました。

レイヤーアーキテクチャ

オブジェクト指向の方法論ではオブジェクトどうしが制限なくメソッドを呼び出し合う思想になっていました。
そうすると、メソッド呼び出しがどのオブジェクトに影響するか把握しづらく、場合によっては無限ループが発生するなど管理が難しくなって いました。

アプリケーションをレイヤーで層別にわけ、上位層から下位層に向かってオブジェクトを呼び出します。 なんとなくで理解してましたが、レイヤーで区切って呼び出しに秩序をもたらすという意味で、しっくり来ました。

デザインパターンには寿命がある

よく出てくるパターンは、誰かが一回書けばほかの人が重複して書く必要がないというのが理想です。 その意味でデザインパターンは、言語機能やライブラリが足りないために人間が覚えて書かないといけない構造と言えます。
...中略...
長期的には、言語やフレームワークの設計者にフィードバックしてパターンを多数の利用者が書く必要がないように改善してもらい、パターンを個別の開発者が使う必要がなくなるというのが、デザインパターンのライフサイクルと言えるかもしれません。

デザインパターンは普遍的なものだと思っていたので、わりと目からウロコです。

このことから分かるのは、ひとつの実装パターンに固執せず、進化に合わせて柔軟に取り入れていくのが良さそうです。

オブジェクト指向はプログラミング言語の一部分

プログラミング言語のパラダイムと呼ばれたものは、結局のところ言語機能のパラダイムであって、言語全体を説明できるものでもありません。
「この言語はオブジェクト指向言語か関数型言語か?」という言語の分類に意味はなくなっています。「この言語はオブジェクト指向機能を持つか?関数型機能を持つ か?」であれば多少は意味があるかもしれません。
実際にはほとんどの言語が両方の機能を持っているので「この言語のオブジェクト指向機能はどうなっているか? 関数型機能はどうなっているか?」のほうが適 切でしょう。

言われてみればその通りなんですが、明確には意識せず過ごしてきたので、考えるきっかけになりました。

ただ、手続き的にもオブジェクト指向的にも関数型プログラミング的にも書けるとなると、選択肢の幅が広がるのは気になるところです。 各言語におけるベストプラクティスを学ぶことの重要性が、多様化によって、ますます高まってきたと言えるかもしれません。

まとめ

1997年にオブジェクト指向方法論の記法を統合したUML 1.1が標準化されて以降は、オブジェクト指向として目立った動きはありません

オブジェクト指向そのものは1990年代の時点で確立しつつあるのですが、月日は経過し、その後さまざまな実装スタイルが登場しました。

オブジェクト指向の良い部分は引き続き継承しつつ、プログラミング言語の進化に合わせて、柔軟に取り入れていきたいです。