「Java言語で学ぶデザインパターン入門」を終えて(ない)
# Intro
この記事は結城 浩さんの「Java言語で学ぶデザインパターン入門」を読み終えた感想文です。ていうかpythonによるデザインパターンなら、「DESGIN PATTER BY PYTHON 」じゃなくて「DESGIN PATTER OF PYTHON 」じゃないか…!
各デザインパターンを、pythonで実装してみたサンプルコードは以下にあります(一部準備中👩🚒👨🚒)。
- 「Iterator — 1つ1つ数え上げる」
- 「Adapter — 一皮被せて再利用」
- 「Template Method — 具体的な処理をサブクラスに任せる」
- 「Factory Method — インスタンス作成をサブクラスに任せる」
- 「Singleton — たった1つのインスタンス」
- 「Prototype — コピーしてインスタンスを作る」
- 「Builder — 複雑なインスタンスを組み立てる」
- 「Abstract Factory — 関連する部品を組み合わせて製品を作る」
- 「Bridge — 機能の階層と実装の階層を分ける」
- 「Strategy — アルゴリズムをごっそり切り替える」
- 「Composite — 容器と中身の同一視」
- 「Decorator — 飾り枠と中身の同一視」
- 「Visitor — 構造を渡り歩きながら仕事する」
- 「Chain of Responsibility — 責任のたらいまわし
- 「Facade — シンプルな窓口」
- 「Mediator — 相手は相談役1人だけ」(準備中👩🚒👨🚒)
- 「Observer — 状態の変化を通知する」
- 「Memento — 状態を保存する」
- 「State — 状態をクラスとして表現する」(準備中👩🚒👨🚒)
- 「FlyWeight — 同じものを共有して無駄をなくす」
- 「Proxy — 必要になってから作る」
- 「Command — 命令をクラスにする」(準備中👩🚒👨🚒)
- 「Interpreter — 文法規則をクラスで表現する」(準備中👩🚒👨🚒)
また、もし全部完成したらgithubのレポジトリに全てのコードをまとめたいと思います。
# なぜ読んだのか?
もともと上司に、「僕くらいのレベル感の人は次に何をすればいいですか?」とお聞きしたところ、これをやればいいと思うよ、と紹介されたのがこの本です。
僕くらいのレベル感とは、 railsやgolangなどでサーバーサイドのJSON APIはかけるが、時々コードの振る舞い・構成がよく分からなくなるくらいのレベル(シンタックスは理解している)でしょうか。もし、それぐらいのレベル感でしたら、読んで見てはいかがでしょうか?
# 感想
最初、「デザインパターン」と聞いた時に、オブジェクト指向を生かしたテクニック集なのかな?と思っていました。確かに、オブジェクト指向を生かしたテクニックであることは間違いないです。ですが、私はこの本を通して、オブジェクト指向自体を学んだという実感の方が強いです。
例えば、言語を学んでいた前は、「抽象クラス・インターフェース学んだけど、どこで使うねん??」と思っていました。もちろん本書を読む前からオブジェクト指向自体については理解していたつもりですが、この本を読んでオブジェクト指向の真の実力を思い知った気がします。
あとは本書はJavaで実装していましたが、それをpythonで実装しました🐍。pythonはJavaより高級言語で、型を定義しなくてもいいので簡単にしすぎた気もしますが、書いていて楽しかったので別にいいです。でもJavaのGUIライブラリは使って欲しくなかったです。
pythonで実装することによって、言語のオブジェクト周りの仕様について深く理解することができました。pythonだったら、抽象クラスあり、インターフェースなし、多重継承が可能、オーバーロード(基本的に)不可能、など、オブジェクト周りについてスッキリした気がします。Golnagにはクラスはないけどインターフェースはある、RubyはclassもあるしModuleもある、など言語によってオブジェクト周りの考え方は様々なんだなあと思います🤔。
最後はmediumに学んだことを記事として公開した事です。そのお陰で1つのパターンについて学ぶ時間が10倍くらいかかりましたが、理解度も10倍くらいになりました。トントンですね笑。
耳にタコができるほど聞いた事あると思いますが、やはりアウトプットは自分の理解を深めますね。自分の中で一度吸収し、再構成する過程で理解が深まるのでしょうか?普通に学習したら無視しそうなところも、立ち止まって考え直すことが多かったように感じます。
あと実際に記事にしてみると、客観的に見た自分が稚拙な文章で、表層的な理解しかしていないのだな、と悲しくなりました😭😭😭。
# 次は何をするか
一様おおよそのデザインパターンを学んだので、実務に使っていきたいです。難しいのは、デザインパターンを学んだけれど、具体的な場面でいつ・何に使うかが分からないことです。こればっかりは、本書を学んだことを頭の片隅に入れて、実務のプログラミングでその時が来るのを待つしかないですかね…
次にプログラミングの設計について学びたいのは、DDD(ドメイン開発駆動)です。ここ何年かですごくアツイらしいので、あとよく分からないけど関数型プログラミングと相性がいいらしいので、セットで学びたいです。また気が向けば、mediumでアウトプットするかもしれません。
あとは元々のGoFのデザインパターンを一度は読みたいですね。この記事にあるように、GoFのデザインパターンはJavaが出る前に出たそうなので、今となっては時代遅れの物もたくさんあるらしいです。
まだ、どれが時代遅れなのかなど、ちゃんとした理解が追いついてないので、原書を一度読んでみて、よりデザインパターンを深く理解したいです。
# まとめ
この本を読み終えるのは結構大変でしたが、とにかくオブジェクト指向についての理解が深まった実感があります。
私のようにプログラミングがある程度書けるようになって、オブジェクト指向についてしっかりと学んでみたい人はぜひ読んでみてはいかかでしょうか?
# ref
- 「増補改訂版 Java言語で学ぶデザインパターン入門」 結城浩(著)第11版
- 「Amazon | Design Patterns CD: Elements of Reusable Object-Oriented Software (Addison-Wesley Professional Computing Series) | Erich Helm, Richard Johnson, Ralph Vlissides, John Gamma | Software Development」
https://www.amazon.co.jp/Design-Patterns-Object-Oriented-Addison-Wesley-Professional/dp/0201634988/ref=sr_1_1?s=english-books&ie=UTF8&qid=1518412270&sr=1-1&keywords=design+pattern - 「再考: GoF デザインパターン — Qiita」
https://qiita.com/irxground/items/d1f9cc447bafa8db2388