デザインパターンの陳腐化

最近、というより昔からの定番ネタですが、GoFデザインパターンは時代遅れで陳腐化したという話題をSNSで度々見ます。今回はそのパターンの陳腐化について書きます。

GoFデザインパターンの陳腐化

GoFデザインパターンの複数は今も価値があるものの、複数は陳腐化しており、特に一部(≒Singleton)は有害なものになっているという指摘には異論ありません。
GoFが実装例の対象としていたC++に限っても、言語仕様の改善でいくつかのパターンの必要性が低くなりました。また継承の弊害が知られたり、ジェネリクスやムーブセマンティクスの普及が進んだりと、GoF本執筆当時と今では状況が変わっています。

これは言うなれば、時代が変容し、GoFデザインパターンのコンテキストやフォースが、開発の状況と乖離するようになったと言えます。

パターンおよびパターンベースアプローチの陳腐化

一方、「デザインパターンGoFデザインパターン」という誤解に基づいて、デザインパターンそのものが陳腐化したという意見を見ます。あえて言うまでもないことかもしれませんが、これは誤りです。
人間が本能的にパターン認識を使いこなしていることから、使い手が人間である以上、パターンベースのアプローチは普遍的に有効だといえます。それと同じく、パターンベースアプローチの一部であるデザインパターンも普遍的に有効といえます。

重要なのは、問題のコンテキストとフォースに合致したデザインパターンを選択することです。デザインパターンが不適切と感じるならば、それは問題にとってコンテキストやフォースがずれたパターンを適用しようとしているか、使っているパターンリポジトリが対応していない問題を扱っているかの、どちらかになるのがほとんどです。

未来予測の限界によるパターンの陳腐化

GoFのパターンのような実装依存のパターン(GoFのパターンは設計パターンですが、実質的に実装に依存するパターンとなっています)は、開発言語やプログラミングを支える環境に依存しています。そして開発言語や開発環境の変化は目まぐるしいため、コードレベルのパターンが陳腐化するのは基本的に避けられないと言えます。
例えば、GoFIteratorパターンは、集合体の要素を取り出すのに、添字を使ったfor文を使うのが一般的な時代では有効でした。ただ添字やイテレータが隠蔽されたforeach文が普及した今となっては、主要なデザインパターンとして挙げる重要性が失われています。

このように、変化の激しいソフトウェア開発では、未来予測の限界から、将来にわたって通用するパターンを確立するのに限界があります。特に実装に依存するパターンは、定義されたときから陳腐化のリスクが高まると考えて良いかもしれません。

なお、将来の状況変化を見越したコンテキストやフォースの記述(例えばforeach文が普及しているなら適用外など)も同様に限界があり、パターンが自分自身で陳腐化したと判断する基準を提示するのも難しいです。
そのため、デザインパターンを使用したい場合は、使い手に、複数のパターンカタログ/パターン・ランゲージを比較して、そのコンテキストとフォースが対象の問題と適合しているか検討することが求められます。GoFデザインパターンは1995年の開発現場を背景にして見出されたパターン・カタログです。それを使うかは、2021年現在の目の前のコンテキスト・フォースに適合しているか、よく考える必要があります。

ボトムアップのパターン識別アプローチと陳腐化

GoFのパターンような実装依存デザインパターンは、GoF本でパターンを見出したアプローチとして書かれている通り、ボトムアップで識別されることが多いです。うまくいっているコードからデザインパターン(解決策)を見出し、それからその解決策のコンテキストとフォースを明らかにして、パターン記述として完成させるというアプローチです。

このボトムアップのアプローチで見いだされたパターンは、解決策から、解決対象の問題・コンテキスト・フォースを想起したり関連付けたりすることは容易にできます。
ただ、その逆方法、問題・コンテキスト・フォースから、解決策を関連付けするのが、陳腐化により難しくなることが多いです。例えば、問題に対する解決策が増えて、もともとのパターンの解決策がベストの解決策でなくなることがあるためです。

Singletonパターンを例にとると、解決策から「インタンスが唯一であることを保証したい」という問題・課題を読み取ることはできると思います。ただ今となっては、「インタンスが唯一であることを保証したい」という課題に対して、解決策に対してSingletonパターンが必ず挙がるとは言えません。

このように、ボトムアップで作られたパターンや、解決策に要点を置いているパターンは、陳腐化の圧力が強いと言ってよいと思います。

なおトップダウンで見出されたパターン(問題に対し、それに適切な解決策を付与してパターン記述を完成させる)は、ある程度普遍性を確保しやすい問題やコンテキストに依拠してパターン記述を完成させることから、比較的、ボトムアップ・アプローチより陳腐化圧力が少ないと考えられます。

例えばトップダウンで見出されることが多いパターンとして、マネジメントのアンチパターンがあります。これは、失敗、損害といった問題に着目し、その原因・解決策を見出してパターン記述を完成させることが多いです。このアンチパターンの場合、普遍的な問題から始まり、演繹的に解決策を見出していることから、問題→解決策の参照も比較的保ちやすいと考えられます。