デザインパターンとは?
当時の達人が考えた設計思想
デザインパターンとは、状況ごとのシステム設計のカタログです。
「こういう状況であれば、こう設計した方が良いよ」というものが記載されたものになります。
従ってデザインパターンを知っておくと、状況に応じた最適な設計をすることができるようになります。
デザインパターンは、過去のエンジニアの集合知になるので、自分でゼロから考えるよりも、良い設計が可能になります。
GoFのデザインパターン
デザインパターンの一般的な意味は上記の通りなのですが、
システム開発においてデザインパターンと言うと、ほぼGoFのデザインパターンのことを言います。
GoFのデザインパターンとは、書籍『オブジェクト指向における再利用のためのデザインパターン』に記述された、オブジェクト指向プログラミングに関するデザインパターンです。
書籍は4名の共著なのですが、その4名が「Gang of Four」と呼ばれておりそこから「GoFのデザインパターン」と言われています。
パターンを学ぶ理由
本当のことを言うと、パターンを一つも知ることなく長年プログラマーとして働くことだって可能かもしれません。多くの人がそうしてます。しかしその場合でも、実はそうと知らずにいくつかのパターンを実装しているかもしれません。では、なぜそれを学ぶのに時間を費やすべきなのでしょうか?
ライブラリやAPIを把握できる
デザインパターンを学習すること、イコール私達学習者が設計に組み込むものと考えがちですが、
実はもう既にライブラリに組み込まれていて、私達が開発をする必要はないことが往々にしてあります。
例えば、JavaScriptとHTMLのデータを双方向にバインディングすることができるknockoutjsというライブラリは、Obserberパターンによって実装されています。
また、Javaを扱う人であれば誰もが使ったことのあるBufferdReaderクラスはデコレーターパターンです。
これらのライブラリやクラスを扱う際に、デザインパターンを知っていれば、使い方の説明を読まなくてもある程度把握できますし、ライブラリの学習コストを下げることができます。
内部設計がある程度見えていれば、機能の拡張も可能になります。
デザインパターンによる共通認識は使う側にとっても非常にメリットのあるものです。
車輪の再発明をしない
デザインパターンは、達人にしか思いつかないものではなく、全てのエンジニアがやがて辿り着く設計思想であり、実証済み、テスト済み解決策の道具箱です。
一生懸命考えて設計をしたものは、もう既にパターンとして定義されている可能性は高いのです。
また、それは既存のライブラリや、言語に組み込まれている可能性もあるということでもあります。
長い時間考えたコードや設計がもうすでにデザインパターンにあったとしたら、
時間と労力のムダになってしまいます。
「デザインパターンはわざわざ学習するものではない。誰でも思いつく。」と言う意見がありますが、
誰でもが思いつけるものを再発明することは避けましょう。
デザインパターンはコミュニケーションツール
デザインパターンは、チーム内でより効率的にコミュニケーションを取るための共通言語を定義します。 「ああ、それには、シングルトンを使って」と言えば、皆があなたの提案の背後にある考えを理解することができます。パターンと名前を知っていれば、シングルトンとは何かの説明は不要となります。
パターンの分類
デザインパターンは大きく分けて3つの分類があります。
-
生成に関するパターンは、 柔軟性を増し、 コードの再利用を促すようなオブジェクト生成の仕組みを提供します。
-
構造に関するパターンは、 構造の柔軟性と効率を維持しつつ、 オブジェクトとクラスを大きな構造に束ねる方法を説明します。
-
振る舞いに関するパターンは、 アルゴリズムやオブジェクト間の責任の分担に関するものです。
デザインパターンは時代遅れ?
「デザインパターンはもう見なくなった」「実際に使っているのは23のうち5つくらい」...時にこのような言葉を耳にします。
確かにモダンなプログラミング言語やフレームワークでは、デザインパターンの多くが言語機能やライブラリで自然にサポートされるようになっています。
例えば、関数型プログラミングやリアクティブプログラミングの普及により、従来のオブジェクト指向デザインパターンが直接的に適用される場面が減ってきています。
デザインパターンに対する批判には一理ありますが、それが時代遅れであるという主張は必ずしも正確ではありません。
デザインパターンは、オブジェクト指向プログラミングの本質を理解し、質の高いソフトウェアを構築するための強力なツールです。
デザインパターンとは設計ノウハウを集めて、使いやすいような部品として名前をつけてカタログ化したものです。上手く使えば、飛躍的に開発を楽に、かつ保守性の向上も期待できます。上手く使っていきましょう!