2023年1月30日: オブジェクト指向プログラミングについて
【デジタルアライアンス ハタケヤマ】
ヨシナガさん、バトンありがとうございます。
頼ってもらっても大丈夫なよう精進します・・・^^;)
最近オブジェクト指向プログラミング(以降OOP)について、学びなおしをしたのでそれで感じた所感を紹介したいと思います。
オブジェクト指向は昨今ではフレームワークやライブラリ等々で採用されているケースが多く、
ソフトウェア開発する際は避けて通れないものになっているかと思います。
とあるプロジェクトでなんちゃってDDDを実践していますが、より価値の高いしなやかな設計を目指すには
まずはOOPの基礎を抑えるひつようがあると思い、学びなおしを致しました。
何を元に勉強をしたか、勉強を通して何を感じたかを述べたいと思います。
1.デザインパターン
まずはデザインパターンです。
上記書籍は良書として改版しながら販売継続されており、2020年に第3版が出版されておりました。
最新の第3版を購入して勉強しました。
説明がとても分かりやすく、具体的なコードパターンの実装が示されていて、流石は評判の良い良書だと思いました。
委譲、ポリモーフィズム、開放閉鎖の原則、リスコフの置換原則、DI、自己文書化、低結合な実装や、
抽象に依存する事の重要さ等々、OOPの設計・実装の重要なエッセンスを学ぶことが出来ました。
一方で、パターン自体はなかなか実戦で使えそうなものは少なそうな印象を持ちました。
言語やフレームワークレベルで、同じことをもっと簡単に出来るように備えられているものがあったりもします。
この辺りは、Gofのデザインパターンがが出た当初はデザインパターンの活用どころがあったのかもしれないのですが、
その後時間が経過して便利なライブラリやフレームワークが進化した結果なのかもしれません。
2.WEB+DB PRESS Vol.132
WEB+DB PRESS Vol.132に、衝撃的なコラムがあったので紹介です。
表紙タイトルに書いていますが、「オブジェクト指向神話からの脱却」です。
このコラムには、オブジェクト指向言語が出てきた歴史から、その機能面の解説。そして、
ざっくりとした概要としては良い設計・実装をするにはOOPが必須という誤解・幻想を捨てましょうという
内容となっています。オブジェクト指向言語の機能であるポリモーフィズム、継承による差分プログラミング
や、部分型等々といった機能ベースで深い考察が書かれていました。
また、OOPでなくても保守性の高い実装手段はあるし、よりシンプルに実装出来たりもするという
実装例もありました。
また、継承は1回限りしか使えないカードなのと、基底クラスと子クラスの結合度が密接になって
しまう事から、昨今のOOPでは継承を使わない方が良いという意見があり、その事についても
触れられていました。昨今流行りのGoやRustといった言語には、継承がありません。これも、
こうした継承の問題点をくみ取った流れなのかもしれません。
OOPが出来ればいい設計・実装が出来るという神話や思い込みは捨てて、OOPの機能を
有効活用したり、OOPの機能でなくてもより良い設計・実装の追及は出来るという気づきを
頂きました。ただ、私としてはOOPの設計・実装スタイルは好みなのと、保守性・変更容易性の高い
設計・プログラミングの重要な鍵になるという考えは持っております。有効活用していけるよう、
よりスキルを磨いていけたらと思っています。また、オブジェクト指向は要らないという事は無いと思います。
先述の通り、多くのフレームワークやライブラリでオブジェクト指向言語が取り入れられており避けては
通れません。そして、オブジェクト指向は、プログラミングを高度に抽象化する機能を持ち合わせた技術
である事は間違いありません。そのエッセンスを学ぶことは、プログラミングスキルの向上に必要だと
考えています。OOPに触れることなくプログラミングするより、OOPを学んでその上で必要なものを適切に
活用しながらプログラミングするのが理想かと思います。
3.リファクタリング
マーチン・ファウラーのリファクタリングの本が良書という話を聞きつけて、読んでみました。
具体的に、そしてとても細かくリファクタリングの手順やテクニックが書かれていました。
また、第1版では元々Javaで書かれていたのを、第2版では最近流行のJavaScriptベースで書き直し
されている点も好感を持てました。細かすぎてこのテクニックを現場で使えるかが自信がありませんが、
一つ印象に残っているのは継承についてです。継承で問題点が出たら、委譲にリファクタリングすればいい
というテクニックです。継承はやめたほうがいいという昨今の論評がありますが、この本はそのことを否定
していました。継承は便利なので使えばいい。ただ、問題が出たら委譲にリファクタリングすればいいだけと。
なので、今後も躊躇なく継承を使っていこうと思いました。リファクタリングのリスクはあるんですけどね・・・
ただ、DDDではリファクタリングは通常の開発活動の一部とせよとうたわれています。リスクが高く
リファクタリングしにくいという事情がある場合、リファクタリング出来る開発環境・ツールを整えたら
問題解決できます。スタンダードな解決方法としては、UnitTestの自動テスト実装でしょうか。
以上がOOPについて勉強した事の所感となります。
明日は、同じ部屋の大先輩のMさんです。